From a1c1627f7cf4d928aed55aaa847109c8e680ca5d Mon Sep 17 00:00:00 2001 From: Bernd Doser Date: Tue, 14 May 2024 17:06:17 +0200 Subject: [PATCH 01/20] train with not rotated image and reconstruction loss as minimum over rotated images with reconstructed image of not rotated image --- ...otational_variational_autoencoder_power.py | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/models/rotational_variational_autoencoder_power.py b/models/rotational_variational_autoencoder_power.py index e4866a3..87df7b7 100644 --- a/models/rotational_variational_autoencoder_power.py +++ b/models/rotational_variational_autoencoder_power.py @@ -4,6 +4,7 @@ import torch.linalg import torch.nn as nn import torch.nn.functional as F +import torchvision.transforms.v2.functional as functional from power_spherical import HypersphericalUniform, PowerSpherical from torch.optim import Adam @@ -88,10 +89,28 @@ def forward(self, x): return (z_location, z_scale), (q_z, p_z), z, recon def training_step(self, batch, batch_idx): - best_scaled_image, _, _, _ = self.find_best_rotation(batch) - (z_location, z_scale), (q_z, p_z), _, recon = self.forward(best_scaled_image) - loss_recon = self.reconstruction_loss(best_scaled_image, recon) + with torch.no_grad(): + crop = functional.center_crop(batch, [self.crop_size, self.crop_size]) + scaled = functional.resize( + crop, [self.input_size, self.input_size], antialias=True + ) + + (z_location, z_scale), (q_z, p_z), _, recon = self.forward(scaled) + loss_recon = self.reconstruction_loss(scaled, recon) + + for i in range(1, self.rotations): + with torch.no_grad(): + rotate = functional.rotate( + batch, 360.0 / self.rotations * i, expand=False + ) + crop = functional.center_crop(rotate, [self.crop_size, self.crop_size]) + scaled = functional.resize( + crop, [self.input_size, self.input_size], antialias=True + ) + + loss_recon = torch.min(loss_recon, self.reconstruction_loss(scaled, recon)) + loss_KL = torch.distributions.kl.kl_divergence(q_z, p_z) * self.beta loss = (loss_recon + loss_KL).mean() loss_recon = loss_recon.mean() From c7a15c0c32c079c9f41b102a803e7a0e6c2b991e Mon Sep 17 00:00:00 2001 From: Bernd Doser Date: Fri, 17 May 2024 11:54:03 +0200 Subject: [PATCH 02/20] improve cnn encoder/decoder architecture: - remove one layers - double channels - smaller learning rate - upsampling in decoder --- models/__init__.py | 4 ++++ models/convolutional_decoder_2.py | 39 ++++++++++++++++++++++++++++++ models/convolutional_encoder_2.py | 40 +++++++++++++++++++++++++++++++ 3 files changed, 83 insertions(+) create mode 100644 models/convolutional_decoder_2.py create mode 100644 models/convolutional_encoder_2.py diff --git a/models/__init__.py b/models/__init__.py index 9fa70b5..1d91252 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -13,9 +13,11 @@ """ from .convolutional_decoder import ConvolutionalDecoder +from .convolutional_decoder_2 import ConvolutionalDecoder2 from .convolutional_decoder_224 import ConvolutionalDecoder224 from .convolutional_decoder_256 import ConvolutionalDecoder256 from .convolutional_encoder import ConvolutionalEncoder +from .convolutional_encoder_2 import ConvolutionalEncoder2 from .rotational_autoencoder import RotationalAutoencoder from .rotational_variational_autoencoder import RotationalVariationalAutoencoder from .rotational_variational_autoencoder_power import ( @@ -24,9 +26,11 @@ __all__ = [ "ConvolutionalDecoder", + "ConvolutionalDecoder2", "ConvolutionalDecoder224", "ConvolutionalDecoder256", "ConvolutionalEncoder", + "ConvolutionalEncoder2", "RotationalAutoencoder", "RotationalVariationalAutoencoder", "RotationalVariationalAutoencoderPower", diff --git a/models/convolutional_decoder_2.py b/models/convolutional_decoder_2.py new file mode 100644 index 0000000..bd6313e --- /dev/null +++ b/models/convolutional_decoder_2.py @@ -0,0 +1,39 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F + + +class ConvolutionalDecoder2(nn.Module): + def __init__(self, h_dim: int = 256): + super().__init__() + + self.fc = nn.Linear(h_dim, 256 * 8 * 8) + self.deconv0 = nn.ConvTranspose2d( + in_channels=256, out_channels=128, kernel_size=(3, 3), stride=1, padding=1 + ) + self.upsample0 = nn.Upsample(scale_factor=2) # 16x16 + self.deconv1 = nn.ConvTranspose2d( + in_channels=128, out_channels=64, kernel_size=(3, 3), stride=1, padding=1 + ) + self.upsample1 = nn.Upsample(scale_factor=2) # 32x32 + self.deconv2 = nn.ConvTranspose2d( + in_channels=64, out_channels=32, kernel_size=(3, 3), stride=1, padding=1 + ) + self.upsample2 = nn.Upsample(scale_factor=2) # 64x64 + self.deconv3 = nn.ConvTranspose2d( + in_channels=32, out_channels=3, kernel_size=(3, 3), stride=1, padding=1 + ) + self.upsample3 = nn.Upsample(scale_factor=2) # 128x128 + + def forward(self, x: torch.tensor) -> torch.tensor: + x = F.relu(self.fc(x)) + x = x.view(-1, 256, 8, 8) + x = F.relu(self.deconv0(x)) + x = self.upsample0(x) + x = F.relu(self.deconv1(x)) + x = self.upsample1(x) + x = F.relu(self.deconv2(x)) + x = self.upsample2(x) + x = self.deconv3(x) + x = self.upsample3(x) + return x diff --git a/models/convolutional_encoder_2.py b/models/convolutional_encoder_2.py new file mode 100644 index 0000000..ccf9419 --- /dev/null +++ b/models/convolutional_encoder_2.py @@ -0,0 +1,40 @@ +import torch +import torch.nn as nn +import torch.nn.functional as F + + +class ConvolutionalEncoder2(nn.Module): + def __init__(self, h_dim: int = 256): + super().__init__() + + self.conv0 = nn.Conv2d( + in_channels=3, out_channels=32, kernel_size=(3, 3), stride=1, padding=1 + ) # 128x128 + self.pool0 = nn.MaxPool2d(kernel_size=(2, 2), stride=2, padding=0) # 64x64 + self.conv1 = nn.Conv2d( + in_channels=32, out_channels=64, kernel_size=(3, 3), stride=1, padding=1 + ) # 64x64 + self.pool1 = nn.MaxPool2d(kernel_size=(2, 2), stride=2, padding=0) # 32x32 + self.conv2 = nn.Conv2d( + in_channels=64, out_channels=128, kernel_size=(3, 3), stride=1, padding=1 + ) # 32x32 + self.pool2 = nn.MaxPool2d(kernel_size=(2, 2), stride=2, padding=0) # 16x16 + self.conv3 = nn.Conv2d( + in_channels=128, out_channels=256, kernel_size=(3, 3), stride=1, padding=1 + ) # 16x16 + self.pool3 = nn.MaxPool2d(kernel_size=(2, 2), stride=2, padding=0) # 8x8 + + self.fc1 = nn.Linear(256 * 8 * 8, h_dim) + + def forward(self, x: torch.tensor) -> torch.tensor: + x = F.relu(self.conv0(x)) + x = self.pool0(x) + x = F.relu(self.conv1(x)) + x = self.pool1(x) + x = F.relu(self.conv2(x)) + x = self.pool2(x) + x = F.relu(self.conv3(x)) + x = self.pool3(x) + x = torch.flatten(x, start_dim=1) + x = F.relu(self.fc1(x)) + return x From 5348385f67e87ac751511e20b7a0a2917bd16540 Mon Sep 17 00:00:00 2001 From: Bernd Doser Date: Thu, 23 May 2024 10:12:57 +0200 Subject: [PATCH 03/20] add ImageDataset --- data/image_dataset.py | 70 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 data/image_dataset.py diff --git a/data/image_dataset.py b/data/image_dataset.py new file mode 100644 index 0000000..14af027 --- /dev/null +++ b/data/image_dataset.py @@ -0,0 +1,70 @@ +""" Create dataset with all image files in a directory. +""" + +import os +from pathlib import Path + +import numpy as np +import torch +from torch.utils.data import Dataset + + +def get_all_filenames(data_directory: str, extensions: list[str]): + result = [] + for dirpath, dirnames, filenames in os.walk(data_directory): + for filename in filenames: + if Path(filename).suffix in extensions: + result.extend(os.path.join(dirpath, filename)) + for dirname in dirnames: + result.extend(get_all_filenames(dirname, extensions)) + return result + + +class ImageDataset(Dataset): + """Create dataset with all image files in a directory.""" + + def __init__( + self, + data_directory: str, + extensions: list[str] = ["jpg"], + transform=None, + ): + """Initializes the data set. + + Args: + data_directory (str): The data directory. + transform (torchvision.transforms, optional): A single or a set of + transformations to modify the images. Defaults to None. + """ + + self.transform = transform + + filenames = get_all_filenames(data_directory, extensions) + + for file in sorted(filenames): + images = np.load(os.path.join(data_directory, file)).astype(np.float32) + self.images = np.append(self.images, images, axis=0) + + def __len__(self) -> int: + """Return the number of items in the dataset. + + Returns: + int: Number of items in dataset. + """ + return len(self.images) + + def __getitem__(self, index: int) -> torch.Tensor: + """Retrieves the item/items with the given indices from the dataset. + + Args: + index: The index of the item to retrieve. + + Returns: + data: Data of the item/items with the given indices. + + """ + data = self.images[index] + data = torch.Tensor(data) + if self.transform: + data = self.transform(data) + return data From 8e73df84fa4743e12f6c7e082f005215f85d44e5 Mon Sep 17 00:00:00 2001 From: Bernd Doser Date: Thu, 23 May 2024 19:18:57 +0200 Subject: [PATCH 04/20] Add ImagesDataset and ImagesDataModule --- src/spherinator/data/__init__.py | 4 + src/spherinator/data/images_data_module.py | 85 ++++++++++++++++++ .../{image_dataset.py => images_dataset.py} | 13 +-- tests/data/images/Abra/1.jpg | Bin 0 -> 9749 bytes tests/data/images/Zubat/1.jpg | Bin 0 -> 10144 bytes tests/test_images_data_module.py | 30 +++++++ tests/test_images_dataset.py | 29 ++++++ 7 files changed, 156 insertions(+), 5 deletions(-) create mode 100644 src/spherinator/data/images_data_module.py rename src/spherinator/data/{image_dataset.py => images_dataset.py} (79%) create mode 100755 tests/data/images/Abra/1.jpg create mode 100755 tests/data/images/Zubat/1.jpg create mode 100644 tests/test_images_data_module.py create mode 100644 tests/test_images_dataset.py diff --git a/src/spherinator/data/__init__.py b/src/spherinator/data/__init__.py index 751ade7..159e7b0 100644 --- a/src/spherinator/data/__init__.py +++ b/src/spherinator/data/__init__.py @@ -7,6 +7,8 @@ from .illustris_sdss_data_module import IllustrisSdssDataModule from .illustris_sdss_dataset import IllustrisSdssDataset from .illustris_sdss_dataset_with_metadata import IllustrisSdssDatasetWithMetadata +from .images_data_module import ImagesDataModule +from .images_dataset import ImagesDataset from .shapes_data_module import ShapesDataModule from .shapes_dataset import ShapesDataset from .spherinator_data_module import SpherinatorDataModule @@ -18,6 +20,8 @@ "IllustrisSdssDataModule", "IllustrisSdssDataset", "IllustrisSdssDatasetWithMetadata", + "ImagesDataModule", + "ImagesDataset", "ShapesDataModule", "ShapesDataset", "SpherinatorDataModule", diff --git a/src/spherinator/data/images_data_module.py b/src/spherinator/data/images_data_module.py new file mode 100644 index 0000000..ded16f2 --- /dev/null +++ b/src/spherinator/data/images_data_module.py @@ -0,0 +1,85 @@ +import torch +import torchvision.transforms.v2 as transforms +from lightning.pytorch import LightningDataModule +from torch.utils.data import DataLoader + +from spherinator.data.images_dataset import ImagesDataset + + +class ImagesDataModule(LightningDataModule): + """Defines access to the ImagesDataset.""" + + def __init__( + self, + data_directory: str, + extensions: list[str] = ["jpg"], + shuffle: bool = True, + image_size: int = 64, + batch_size: int = 32, + num_workers: int = 1, + ): + """Initializes the data loader + + Args: + data_directory (str): The data directory + shuffle (bool, optional): Wether or not to shuffle whe reading. Defaults to True. + image_size (int, optional): The size of the images. Defaults to 64. + batch_size (int, optional): The batch size for training. Defaults to 32. + num_workers (int, optional): How many worker to use for loading. Defaults to 1. + download (bool, optional): Wether or not to download the data. Defaults to False. + """ + super().__init__() + + self.data_directory = data_directory + self.extensions = extensions + self.shuffle = shuffle + self.image_size = image_size + self.batch_size = batch_size + self.num_workers = num_workers + + self.data_train = None + self.dataloader_train = None + + self.transform_train = transforms.Compose( + [ + transforms.Resize((self.image_size, self.image_size), antialias=True), + transforms.Lambda( # Normalize + lambda x: (x - torch.min(x)) / (torch.max(x) - torch.min(x)) + ), + ] + ) + self.transform_processing = self.transform_train + self.transform_images = self.transform_train + self.transform_thumbnail_images = transforms.Compose( + [ + self.transform_train, + transforms.Resize((100, 100), antialias=True), + ] + ) + + def setup(self, stage: str): + """Sets up the data set and data loaders. + + Args: + stage (str): Defines for which stage the data is needed. + For the moment just fitting is supported. + """ + + if stage == "fit" and self.data_train is None: + self.data_train = ImagesDataset( + data_directory=self.data_directory, + extensions=self.extensions, + transform=self.transform_train, + ) + self.dataloader_train = DataLoader( + self.data_train, + batch_size=self.batch_size, + shuffle=self.shuffle, + num_workers=self.num_workers, + ) + else: + raise ValueError(f"Stage {stage} not supported.") + + def train_dataloader(self): + """Gets the data loader for training.""" + return self.dataloader_train diff --git a/src/spherinator/data/image_dataset.py b/src/spherinator/data/images_dataset.py similarity index 79% rename from src/spherinator/data/image_dataset.py rename to src/spherinator/data/images_dataset.py index 14af027..5fd7160 100644 --- a/src/spherinator/data/image_dataset.py +++ b/src/spherinator/data/images_dataset.py @@ -6,6 +6,7 @@ import numpy as np import torch +from PIL import Image from torch.utils.data import Dataset @@ -13,14 +14,14 @@ def get_all_filenames(data_directory: str, extensions: list[str]): result = [] for dirpath, dirnames, filenames in os.walk(data_directory): for filename in filenames: - if Path(filename).suffix in extensions: - result.extend(os.path.join(dirpath, filename)) + if Path(filename).suffix[1:] in extensions: + result.append(os.path.join(dirpath, filename)) for dirname in dirnames: result.extend(get_all_filenames(dirname, extensions)) return result -class ImageDataset(Dataset): +class ImagesDataset(Dataset): """Create dataset with all image files in a directory.""" def __init__( @@ -41,9 +42,11 @@ def __init__( filenames = get_all_filenames(data_directory, extensions) + self.images = np.empty((0, 3, 224, 224), np.float32) for file in sorted(filenames): - images = np.load(os.path.join(data_directory, file)).astype(np.float32) - self.images = np.append(self.images, images, axis=0) + # Swap axis 0 and 2 to bring the color channel to the front + image = np.asarray(Image.open(file)).swapaxes(0, 2) + self.images = np.append(self.images, [image], axis=0) def __len__(self) -> int: """Return the number of items in the dataset. diff --git a/tests/data/images/Abra/1.jpg b/tests/data/images/Abra/1.jpg new file mode 100755 index 0000000000000000000000000000000000000000..2206622b1561091bb8f0019c6e4f9c0f49b94c66 GIT binary patch literal 9749 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 literal 0 HcmV?d00001 diff --git a/tests/data/images/Zubat/1.jpg b/tests/data/images/Zubat/1.jpg new file mode 100755 index 0000000000000000000000000000000000000000..ecdbf1f8bcfa2bfbe557c640a32fdf1ac5e0e2c1 GIT binary patch literal 10144 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 literal 0 HcmV?d00001 diff --git a/tests/test_images_data_module.py b/tests/test_images_data_module.py new file mode 100644 index 0000000..3207613 --- /dev/null +++ b/tests/test_images_data_module.py @@ -0,0 +1,30 @@ +import numpy as np +import torch + +from spherinator.data import ImagesDataModule + + +def test_fit(): + data = ImagesDataModule( + "tests/data/images", + image_size=224, + num_workers=1, + batch_size=2, + ) + data.setup("fit") + + assert len(data.data_train) == 2 + + dataloader = data.train_dataloader() + + assert dataloader.batch_size == 2 + assert len(dataloader) == 1 + assert dataloader.num_workers == 1 + + batch = next(iter(dataloader)) + + assert batch.shape == (2, 3, 224, 224) + assert batch.dtype == torch.float32 + + assert np.isclose(batch.min(), 0.0) + assert np.isclose(batch.max(), 1.0) diff --git a/tests/test_images_dataset.py b/tests/test_images_dataset.py new file mode 100644 index 0000000..052bc08 --- /dev/null +++ b/tests/test_images_dataset.py @@ -0,0 +1,29 @@ +from pathlib import Path + +import numpy as np +from PIL import Image + +from spherinator.data import ImagesDataset + + +def test_suffix(): + filename = "test.jpg" + extensions = ["jpg", "png"] + assert Path(filename).suffix[1:] == "jpg" + assert Path(filename).suffix[1:] in extensions + + +def test_load_image(): + image = Image.open("tests/data/images/Abra/1.jpg") + assert image.size == (224, 224) + assert image.mode == "RGB" + assert image.format == "JPEG" + array = np.asarray(image) + assert array.shape == (224, 224, 3) + + +def test_dataset(): + dataset = ImagesDataset("tests/data/images") + assert len(dataset) == 2 + data = dataset[0] + assert data.shape == (3, 224, 224) From 430c4803d9057da9a73cdcca8306e9b2ffcda1ba Mon Sep 17 00:00:00 2001 From: Bernd Doser Date: Thu, 23 May 2024 20:18:54 +0200 Subject: [PATCH 05/20] replace PIL by skimage.io for better performance --- src/spherinator/data/images_dataset.py | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/src/spherinator/data/images_dataset.py b/src/spherinator/data/images_dataset.py index 5fd7160..d14778d 100644 --- a/src/spherinator/data/images_dataset.py +++ b/src/spherinator/data/images_dataset.py @@ -5,8 +5,8 @@ from pathlib import Path import numpy as np +import skimage.io as io import torch -from PIL import Image from torch.utils.data import Dataset @@ -39,14 +39,7 @@ def __init__( """ self.transform = transform - - filenames = get_all_filenames(data_directory, extensions) - - self.images = np.empty((0, 3, 224, 224), np.float32) - for file in sorted(filenames): - # Swap axis 0 and 2 to bring the color channel to the front - image = np.asarray(Image.open(file)).swapaxes(0, 2) - self.images = np.append(self.images, [image], axis=0) + self.filenames = sorted(get_all_filenames(data_directory, extensions)) def __len__(self) -> int: """Return the number of items in the dataset. @@ -54,7 +47,7 @@ def __len__(self) -> int: Returns: int: Number of items in dataset. """ - return len(self.images) + return len(self.filenames) def __getitem__(self, index: int) -> torch.Tensor: """Retrieves the item/items with the given indices from the dataset. @@ -66,7 +59,9 @@ def __getitem__(self, index: int) -> torch.Tensor: data: Data of the item/items with the given indices. """ - data = self.images[index] + # Swap axis 0 and 2 to bring the color channel to the front + data = io.imread(self.filenames[index]) + data = data.swapaxes(0, 2) data = torch.Tensor(data) if self.transform: data = self.transform(data) From cc27bf7b69ea9b5f8679c6bba3ed0d0b465bd7f8 Mon Sep 17 00:00:00 2001 From: Bernd Doser Date: Fri, 24 May 2024 18:57:28 +0200 Subject: [PATCH 06/20] update plain autoencoder --- .../models/rotational_autoencoder.py | 174 +++++------------- tests/test_rotational_autoencoder.py | 13 +- ...otational_variational_autoencoder_power.py | 3 +- 3 files changed, 57 insertions(+), 133 deletions(-) diff --git a/src/spherinator/models/rotational_autoencoder.py b/src/spherinator/models/rotational_autoencoder.py index bb98def..81b0266 100644 --- a/src/spherinator/models/rotational_autoencoder.py +++ b/src/spherinator/models/rotational_autoencoder.py @@ -4,137 +4,75 @@ import torch.linalg import torch.nn as nn import torch.nn.functional as F -import torchvision.transforms.functional as functional +import torchvision.transforms.v2.functional as functional from torch.optim import Adam +from .convolutional_decoder import ConvolutionalDecoder +from .convolutional_encoder import ConvolutionalEncoder from .spherinator_module import SpherinatorModule class RotationalAutoencoder(SpherinatorModule): - def __init__(self, image_size: int = 363, rotations: int = 36, bottleneck: int = 3): - """ - RotationalAutoencoder initializer - - :param image_size: size of the input images - :param rotations: number of rotations - :param beta: factor for beta-VAE + def __init__( + self, + encoder: nn.Module = ConvolutionalEncoder(), + decoder: nn.Module = ConvolutionalDecoder(), + z_dim: int = 2, + image_size: int = 91, + input_size: int = 128, + rotations: int = 36, + ): + """Initializer + + Args: + z_dim (int, optional): dimension of the latent representation. Defaults to 2. + image_size (int, optional): size of the input images. Defaults to 91. + rotations (int, optional): number of rotations. Defaults to 36. """ super().__init__() - self.save_hyperparameters() + self.save_hyperparameters(ignore=["encoder", "decoder"]) + self.encoder = encoder + self.decoder = decoder + self.z_dim = z_dim self.image_size = image_size + self.input_size = input_size self.rotations = rotations - self.bottleneck = bottleneck self.crop_size = int(self.image_size * math.sqrt(2) / 2) - self.input_size = 128 - - self.example_input_array = torch.randn( - 1, bottleneck, self.input_size, self.input_size - ) + self.total_input_size = self.input_size * self.input_size * 3 - self.conv0 = nn.Conv2d( - in_channels=3, out_channels=16, kernel_size=(3, 3), stride=1, padding=1 - ) # 128x128 - self.pool0 = nn.MaxPool2d(kernel_size=(2, 2), stride=2, padding=0) # 64x64 - self.conv1 = nn.Conv2d( - in_channels=16, out_channels=32, kernel_size=(3, 3), stride=1, padding=1 - ) # 64x64 - self.pool1 = nn.MaxPool2d(kernel_size=(2, 2), stride=2, padding=0) # 32x32 - self.conv2 = nn.Conv2d( - in_channels=32, out_channels=64, kernel_size=(3, 3), stride=1, padding=1 - ) # 32x32 - self.pool2 = nn.MaxPool2d(kernel_size=(2, 2), stride=2, padding=0) # 16x16 - self.conv3 = nn.Conv2d( - in_channels=64, out_channels=128, kernel_size=(3, 3), stride=1, padding=1 - ) # 16x16 - self.pool3 = nn.MaxPool2d(kernel_size=(2, 2), stride=2, padding=0) # 8x8 - self.conv4 = nn.Conv2d( - in_channels=128, out_channels=256, kernel_size=(3, 3), stride=1, padding=1 - ) # 8x8 - self.pool4 = nn.MaxPool2d(kernel_size=(2, 2), stride=2, padding=0) # 4x4 - - self.fc1 = nn.Linear(256 * 4 * 4, 256) - self.fc2 = nn.Linear(256, self.bottleneck) - self.fc3 = nn.Linear(self.bottleneck, 256) - self.fc4 = nn.Linear(256, 256 * 4 * 4) - - self.deconv1 = nn.ConvTranspose2d( - in_channels=256, out_channels=128, kernel_size=(4, 4), stride=2, padding=1 - ) # 8x8 - self.deconv2 = nn.ConvTranspose2d( - in_channels=128, out_channels=128, kernel_size=(4, 4), stride=2, padding=1 - ) # 16x16 - self.deconv3 = nn.ConvTranspose2d( - in_channels=128, out_channels=64, kernel_size=(4, 4), stride=2, padding=1 - ) # 32x32 - self.deconv4 = nn.ConvTranspose2d( - in_channels=64, out_channels=32, kernel_size=(4, 4), stride=2, padding=1 - ) # 64x64 - self.deconv5 = nn.ConvTranspose2d( - in_channels=32, out_channels=16, kernel_size=(3, 3), stride=2, padding=1 - ) # 127x127 - self.deconv6 = nn.ConvTranspose2d( - in_channels=16, out_channels=3, kernel_size=(2, 2), stride=1, padding=0 - ) # 128x128 + self.example_input_array = torch.randn(1, 3, self.input_size, self.input_size) def get_input_size(self): return self.input_size def encode(self, x): - x = F.relu(self.conv0(x)) - x = self.pool0(x) - x = F.relu(self.conv1(x)) - x = self.pool1(x) - x = F.relu(self.conv2(x)) - x = self.pool2(x) - x = F.relu(self.conv3(x)) - x = self.pool3(x) - x = F.relu(self.conv4(x)) - x = self.pool4(x) - x = x.view(-1, 256 * 4 * 4) - x = F.tanh(self.fc1(x)) - x = self.fc2(x) - return x + z = self.encoder(x) + return z - def scale_to_unity(self, x): - length = torch.linalg.vector_norm(x, dim=1) + 1.0e-20 - return (x.T / length).T - - def decode(self, x): - x = F.tanh(self.fc3(x)) - x = F.tanh(self.fc4(x)) - x = x.view(-1, 256, 4, 4) - x = F.relu(self.deconv1(x)) - x = F.relu(self.deconv2(x)) - x = F.relu(self.deconv3(x)) - x = F.relu(self.deconv4(x)) - x = F.relu(self.deconv5(x)) - x = self.deconv6(x) + def decode(self, z): + x = self.decoder(z) return x def forward(self, x): - coordinates = self.encode(x) - reconstruction = self.decode(self.scale_to_unity(coordinates)) - return reconstruction, coordinates - - def spherical_loss(self, images, reconstructions, coordinates): - coord_regularization = torch.square( - 1 - torch.sum(torch.square(coordinates), dim=1) - ) - reconstruction_loss = self.reconstruction_loss(images, reconstructions) - loss = reconstruction_loss + 1e-4 * coord_regularization - return loss + z = self.encode(x) + recon = self.decode(z) + return recon def training_step(self, batch, batch_idx): - best_recon = torch.ones(batch.shape[0], device=batch.device) * 1e10 - best_scaled = torch.zeros( - (batch.shape[0], batch.shape[1], self.input_size, self.input_size), - device=batch.device, - ) with torch.no_grad(): - for i in range(self.rotations): + crop = functional.center_crop(batch, [self.crop_size, self.crop_size]) + scaled = functional.resize( + crop, [self.input_size, self.input_size], antialias=True + ) + + recon = self.forward(scaled) + loss = self.reconstruction_loss(scaled, recon) + + for i in range(1, self.rotations): + with torch.no_grad(): rotate = functional.rotate( batch, 360.0 / self.rotations * i, expand=False ) @@ -143,17 +81,11 @@ def training_step(self, batch, batch_idx): crop, [self.input_size, self.input_size], antialias=True ) - recon, _ = self.forward(scaled) - loss_recon = self.reconstruction_loss(scaled, recon) - best_recon_idx = torch.where(loss_recon < best_recon) - best_recon[best_recon_idx] = loss_recon[best_recon_idx] - best_scaled[best_recon_idx] = scaled[best_recon_idx] - - recon, coord = self.forward(best_scaled) + loss = torch.min(loss, self.reconstruction_loss(scaled, recon)) - loss = self.spherical_loss(best_scaled, recon, coord).mean() + loss = loss.mean() - self.log("train_loss", loss) + self.log("train_loss", loss, prog_bar=True) self.log("learning_rate", self.optimizers().param_groups[0]["lr"]) return loss @@ -162,20 +94,16 @@ def configure_optimizers(self): return Adam(self.parameters(), lr=1e-3) def project(self, images): - return self.scale_to_unity(self.encode(images)) + z = self.encode(images) + return z def reconstruct(self, coordinates): return self.decode(coordinates) def reconstruction_loss(self, images, reconstructions): return torch.sqrt( - torch.mean( - torch.square( - images.reshape(-1, 3 * images.shape[-2] * images.shape[-1]) - - reconstructions.reshape( - -1, 3 * images.shape[-2] * images.shape[-1] - ) - ), - dim=-1, - ) + nn.MSELoss(reduction="none")( + reconstructions.reshape(-1, self.total_input_size), + images.reshape(-1, self.total_input_size), + ).mean(dim=1) ) diff --git a/tests/test_rotational_autoencoder.py b/tests/test_rotational_autoencoder.py index f226e65..22c4832 100644 --- a/tests/test_rotational_autoencoder.py +++ b/tests/test_rotational_autoencoder.py @@ -6,18 +6,15 @@ def test_forward(): model = RotationalAutoencoder() input = model.example_input_array - - recon, coord = model(input) - - assert coord.shape == (1, 3) + recon = model(input) assert recon.shape == input.shape def test_reconstruction_loss(): model = RotationalAutoencoder() - image1 = torch.zeros((2, 3, 64, 64)) - image2 = torch.ones((2, 3, 64, 64)) - image3 = torch.zeros((2, 3, 64, 64)) + image1 = torch.zeros((2, 3, 128, 128)) + image2 = torch.ones((2, 3, 128, 128)) + image3 = torch.zeros((2, 3, 128, 128)) image3[0, 0, 0, 0] = 1.0 assert torch.isclose( @@ -27,5 +24,5 @@ def test_reconstruction_loss(): model.reconstruction_loss(image1, image2), torch.Tensor([1.0, 1.0]), atol=1e-3 ).all() assert torch.isclose( - model.reconstruction_loss(image1, image3), torch.Tensor([0.009, 0.0]), atol=1e-3 + model.reconstruction_loss(image1, image3), torch.Tensor([0.009, 0.0]), atol=1e-2 ).all() diff --git a/tests/test_rotational_variational_autoencoder_power.py b/tests/test_rotational_variational_autoencoder_power.py index 272c49e..493700e 100644 --- a/tests/test_rotational_variational_autoencoder_power.py +++ b/tests/test_rotational_variational_autoencoder_power.py @@ -17,8 +17,7 @@ def test_forward(): def test_reconstruction_loss(): - z_dim = 2 - model = RotationalVariationalAutoencoderPower(z_dim=z_dim) + model = RotationalVariationalAutoencoderPower() image1 = torch.zeros((2, 3, 128, 128)) image2 = torch.ones((2, 3, 128, 128)) image3 = torch.zeros((2, 3, 128, 128)) From 7c2fb24969cab601c9fd48f193bb4e8ce367e65e Mon Sep 17 00:00:00 2001 From: Bernd Doser Date: Fri, 24 May 2024 18:58:15 +0200 Subject: [PATCH 07/20] add pokemon config --- experiments/pokemon.yaml | 66 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 experiments/pokemon.yaml diff --git a/experiments/pokemon.yaml b/experiments/pokemon.yaml new file mode 100644 index 0000000..32631bb --- /dev/null +++ b/experiments/pokemon.yaml @@ -0,0 +1,66 @@ +seed_everything: 42 + +model: + class_path: spherinator.models.RotationalVariationalAutoencoderPower + init_args: + encoder: + class_path: spherinator.models.ConvolutionalEncoder + decoder: + class_path: spherinator.models.ConvolutionalDecoder + h_dim: 256 + z_dim: 3 + image_size: 224 + rotations: 1 + beta: 1.0e-3 + +data: + class_path: spherinator.data.ImagesDataModule + init_args: + data_directory: /local_data/doserbd/data/pokemon + extensions: ['jpg'] + image_size: 224 + batch_size: 32 + shuffle: True + num_workers: 16 + +optimizer: + class_path: torch.optim.Adam + init_args: + lr: 1.e-3 + +lr_scheduler: + class_path: lightning.pytorch.cli.ReduceLROnPlateau + init_args: + mode: min + factor: 0.1 + patience: 5 + cooldown: 5 + min_lr: 1.e-6 + monitor: train_loss + verbose: True + +trainer: + max_epochs: -1 + accelerator: gpu + devices: [3] + precision: 32 + callbacks: + - class_path: spherinator.callbacks.LogReconstructionCallback + init_args: + num_samples: 6 +# - class_path: lightning.pytorch.callbacks.ModelCheckpoint +# init_args: +# monitor: train_loss +# filename: "{epoch}-{train_loss:.2f}" +# save_top_k: 3 +# mode: min +# every_n_epochs: 1 + logger: + class_path: lightning.pytorch.loggers.WandbLogger + init_args: + project: spherinator + log_model: True + entity: ain-space + tags: + - rot-loss + - pokemon From 741d758d93f9dce94b18f165215c0e97f33da107 Mon Sep 17 00:00:00 2001 From: Bernd Doser Date: Fri, 24 May 2024 18:59:24 +0200 Subject: [PATCH 08/20] Improved CNN architecture Source: https://www.biorxiv.org/content/10.1101/214247v2 --- .../models/convolutional_decoder_2.py | 66 +++++++++++-------- .../models/convolutional_encoder_2.py | 65 ++++++++++-------- 2 files changed, 74 insertions(+), 57 deletions(-) diff --git a/src/spherinator/models/convolutional_decoder_2.py b/src/spherinator/models/convolutional_decoder_2.py index bd6313e..441bbf0 100644 --- a/src/spherinator/models/convolutional_decoder_2.py +++ b/src/spherinator/models/convolutional_decoder_2.py @@ -4,36 +4,46 @@ class ConvolutionalDecoder2(nn.Module): - def __init__(self, h_dim: int = 256): + def __init__(self, z_dim: int = 2): super().__init__() - self.fc = nn.Linear(h_dim, 256 * 8 * 8) - self.deconv0 = nn.ConvTranspose2d( - in_channels=256, out_channels=128, kernel_size=(3, 3), stride=1, padding=1 - ) - self.upsample0 = nn.Upsample(scale_factor=2) # 16x16 - self.deconv1 = nn.ConvTranspose2d( - in_channels=128, out_channels=64, kernel_size=(3, 3), stride=1, padding=1 - ) - self.upsample1 = nn.Upsample(scale_factor=2) # 32x32 - self.deconv2 = nn.ConvTranspose2d( - in_channels=64, out_channels=32, kernel_size=(3, 3), stride=1, padding=1 - ) - self.upsample2 = nn.Upsample(scale_factor=2) # 64x64 - self.deconv3 = nn.ConvTranspose2d( - in_channels=32, out_channels=3, kernel_size=(3, 3), stride=1, padding=1 - ) - self.upsample3 = nn.Upsample(scale_factor=2) # 128x128 + self.dec1 = nn.Sequential( + nn.Linear(z_dim, 1024 * 4 * 4), + nn.Unflatten(1, (1024, 4, 4)), + nn.BatchNorm2d(1024), + nn.ReLU(), + ) # 512 x 8 x 8 + self.dec2 = nn.Sequential( + nn.ConvTranspose2d(1024, 512, 4, stride=2, padding=1), + nn.BatchNorm2d(512), + nn.ReLU(), + ) # 512 x 8 x 8 + self.dec3 = nn.Sequential( + nn.ConvTranspose2d(512, 512, 4, stride=2, padding=1), + nn.BatchNorm2d(512), + nn.ReLU(), + ) # 512 x 16 x 16 + self.dec4 = nn.Sequential( + nn.ConvTranspose2d(512, 256, 4, stride=2, padding=1), + nn.BatchNorm2d(256), + nn.ReLU(), + ) # 256 x 32 x 32 + self.dec5 = nn.Sequential( + nn.ConvTranspose2d(256, 128, 4, stride=2, padding=1), + nn.BatchNorm2d(128), + nn.ReLU(), + ) # 128 x 64 x 64 + self.dec6 = nn.Sequential( + nn.ConvTranspose2d(128, 3, 4, stride=2, padding=1), + nn.BatchNorm2d(3), + nn.Sigmoid(), + ) # 3 x 128 x 128 def forward(self, x: torch.tensor) -> torch.tensor: - x = F.relu(self.fc(x)) - x = x.view(-1, 256, 8, 8) - x = F.relu(self.deconv0(x)) - x = self.upsample0(x) - x = F.relu(self.deconv1(x)) - x = self.upsample1(x) - x = F.relu(self.deconv2(x)) - x = self.upsample2(x) - x = self.deconv3(x) - x = self.upsample3(x) + x = self.dec1(x) + x = self.dec2(x) + x = self.dec3(x) + x = self.dec4(x) + x = self.dec5(x) + x = self.dec6(x) return x diff --git a/src/spherinator/models/convolutional_encoder_2.py b/src/spherinator/models/convolutional_encoder_2.py index ccf9419..93b06b3 100644 --- a/src/spherinator/models/convolutional_encoder_2.py +++ b/src/spherinator/models/convolutional_encoder_2.py @@ -4,37 +4,44 @@ class ConvolutionalEncoder2(nn.Module): - def __init__(self, h_dim: int = 256): + def __init__(self, z_dim: int = 2): super().__init__() - self.conv0 = nn.Conv2d( - in_channels=3, out_channels=32, kernel_size=(3, 3), stride=1, padding=1 - ) # 128x128 - self.pool0 = nn.MaxPool2d(kernel_size=(2, 2), stride=2, padding=0) # 64x64 - self.conv1 = nn.Conv2d( - in_channels=32, out_channels=64, kernel_size=(3, 3), stride=1, padding=1 - ) # 64x64 - self.pool1 = nn.MaxPool2d(kernel_size=(2, 2), stride=2, padding=0) # 32x32 - self.conv2 = nn.Conv2d( - in_channels=64, out_channels=128, kernel_size=(3, 3), stride=1, padding=1 - ) # 32x32 - self.pool2 = nn.MaxPool2d(kernel_size=(2, 2), stride=2, padding=0) # 16x16 - self.conv3 = nn.Conv2d( - in_channels=128, out_channels=256, kernel_size=(3, 3), stride=1, padding=1 - ) # 16x16 - self.pool3 = nn.MaxPool2d(kernel_size=(2, 2), stride=2, padding=0) # 8x8 - - self.fc1 = nn.Linear(256 * 8 * 8, h_dim) + self.enc1 = nn.Sequential( + nn.Conv2d(3, 128, 4, stride=2, padding=1), + nn.BatchNorm2d(128), + nn.ReLU(), + ) # 128 x 64 x 64 + self.enc2 = nn.Sequential( + nn.Conv2d(128, 256, 4, stride=2, padding=1), + nn.BatchNorm2d(256), + nn.ReLU(), + ) # 256 x 32 x 32 + self.enc3 = nn.Sequential( + nn.Conv2d(256, 512, 4, stride=2, padding=1), + nn.BatchNorm2d(512), + nn.ReLU(), + ) # 512 x 16 x 16 + self.enc4 = nn.Sequential( + nn.Conv2d(512, 512, 4, stride=2, padding=1), + nn.BatchNorm2d(512), + nn.ReLU(), + ) # 512 x 8 x 8 + self.enc5 = nn.Sequential( + nn.Conv2d(512, 1024, 4, stride=2, padding=1), + nn.BatchNorm2d(1024), + nn.ReLU(), + ) # 1024 x 4 x 4 + self.enc6 = nn.Sequential( + nn.Flatten(), + nn.Linear(1024 * 4 * 4, z_dim), + ) def forward(self, x: torch.tensor) -> torch.tensor: - x = F.relu(self.conv0(x)) - x = self.pool0(x) - x = F.relu(self.conv1(x)) - x = self.pool1(x) - x = F.relu(self.conv2(x)) - x = self.pool2(x) - x = F.relu(self.conv3(x)) - x = self.pool3(x) - x = torch.flatten(x, start_dim=1) - x = F.relu(self.fc1(x)) + x = self.enc1(x) + x = self.enc2(x) + x = self.enc3(x) + x = self.enc4(x) + x = self.enc5(x) + x = self.enc6(x) return x From 693a3002855cdef3f2ed96829cf5cd2f3c0bfd95 Mon Sep 17 00:00:00 2001 From: Bernd Doser Date: Wed, 29 May 2024 14:35:17 +0200 Subject: [PATCH 09/20] rename h_dim and z_dim into latent_dim ... and use no default value --- src/spherinator/models/convolutional_decoder.py | 4 ++-- src/spherinator/models/convolutional_decoder_2.py | 5 ++--- src/spherinator/models/convolutional_decoder_224.py | 4 ++-- src/spherinator/models/convolutional_decoder_256.py | 4 ++-- src/spherinator/models/convolutional_encoder.py | 4 ++-- src/spherinator/models/convolutional_encoder_2.py | 5 ++--- src/spherinator/models/rotational_autoencoder.py | 11 ++++++++--- .../rotational_variational_autoencoder_power.py | 11 ++++++++--- tests/test_cnn.py | 10 ++++++---- tests/test_hipster.py | 4 ++-- tests/test_resnet.py | 4 ++-- 11 files changed, 38 insertions(+), 28 deletions(-) diff --git a/src/spherinator/models/convolutional_decoder.py b/src/spherinator/models/convolutional_decoder.py index c81f6ab..f6ecaed 100644 --- a/src/spherinator/models/convolutional_decoder.py +++ b/src/spherinator/models/convolutional_decoder.py @@ -5,10 +5,10 @@ class ConvolutionalDecoder(pl.LightningModule): - def __init__(self, h_dim: int = 256): + def __init__(self, latent_dim: int): super().__init__() - self.fc = nn.Linear(h_dim, 256 * 4 * 4) + self.fc = nn.Linear(latent_dim, 256 * 4 * 4) self.deconv1 = nn.ConvTranspose2d( in_channels=256, out_channels=128, kernel_size=(4, 4), stride=2, padding=1 ) # 8x8 diff --git a/src/spherinator/models/convolutional_decoder_2.py b/src/spherinator/models/convolutional_decoder_2.py index 441bbf0..96e08d3 100644 --- a/src/spherinator/models/convolutional_decoder_2.py +++ b/src/spherinator/models/convolutional_decoder_2.py @@ -1,14 +1,13 @@ import torch import torch.nn as nn -import torch.nn.functional as F class ConvolutionalDecoder2(nn.Module): - def __init__(self, z_dim: int = 2): + def __init__(self, latent_dim: int): super().__init__() self.dec1 = nn.Sequential( - nn.Linear(z_dim, 1024 * 4 * 4), + nn.Linear(latent_dim, 1024 * 4 * 4), nn.Unflatten(1, (1024, 4, 4)), nn.BatchNorm2d(1024), nn.ReLU(), diff --git a/src/spherinator/models/convolutional_decoder_224.py b/src/spherinator/models/convolutional_decoder_224.py index 426f759..be74981 100644 --- a/src/spherinator/models/convolutional_decoder_224.py +++ b/src/spherinator/models/convolutional_decoder_224.py @@ -5,7 +5,7 @@ class ConvolutionalDecoder224(pl.LightningModule): - def __init__(self, h_dim: int = 256): + def __init__(self, latent_dim: int): """Convolutional decoder for 224x224 images. Input: h_dim Output: 3x224x224 @@ -13,7 +13,7 @@ def __init__(self, h_dim: int = 256): """ super().__init__() - self.fc = nn.Linear(h_dim, 256 * 4 * 4) + self.fc = nn.Linear(latent_dim, 256 * 4 * 4) self.deconv1 = nn.ConvTranspose2d( in_channels=256, out_channels=128, kernel_size=(3, 3), stride=2, padding=1 ) # 7 = 6 - 2 + 2 + 1 diff --git a/src/spherinator/models/convolutional_decoder_256.py b/src/spherinator/models/convolutional_decoder_256.py index 93b08c3..5ad328d 100644 --- a/src/spherinator/models/convolutional_decoder_256.py +++ b/src/spherinator/models/convolutional_decoder_256.py @@ -5,7 +5,7 @@ class ConvolutionalDecoder256(pl.LightningModule): - def __init__(self, h_dim: int = 256): + def __init__(self, latent_dim: int): """Convolutional decoder for 256x256 images. Input: h_dim Output: 3x256x256 @@ -13,7 +13,7 @@ def __init__(self, h_dim: int = 256): """ super().__init__() - self.fc = nn.Linear(h_dim, 256 * 4 * 4) + self.fc = nn.Linear(latent_dim, 256 * 4 * 4) self.deconv1 = nn.ConvTranspose2d( in_channels=256, out_channels=128, kernel_size=(4, 4), stride=2, padding=1 ) # 8x8 = 6 - 2 + 3 + 1 diff --git a/src/spherinator/models/convolutional_encoder.py b/src/spherinator/models/convolutional_encoder.py index 6035a67..31af737 100644 --- a/src/spherinator/models/convolutional_encoder.py +++ b/src/spherinator/models/convolutional_encoder.py @@ -5,7 +5,7 @@ class ConvolutionalEncoder(pl.LightningModule): - def __init__(self, h_dim: int = 256): + def __init__(self, latent_dim: int): super().__init__() self.conv0 = nn.Conv2d( @@ -29,7 +29,7 @@ def __init__(self, h_dim: int = 256): ) # 8x8 self.pool4 = nn.MaxPool2d(kernel_size=(2, 2), stride=2, padding=0) # 4x4 - self.fc1 = nn.Linear(256 * 4 * 4, h_dim) + self.fc1 = nn.Linear(256 * 4 * 4, latent_dim) def forward(self, x: torch.tensor) -> torch.tensor: x = F.relu(self.conv0(x)) diff --git a/src/spherinator/models/convolutional_encoder_2.py b/src/spherinator/models/convolutional_encoder_2.py index 93b06b3..76b5d2f 100644 --- a/src/spherinator/models/convolutional_encoder_2.py +++ b/src/spherinator/models/convolutional_encoder_2.py @@ -1,10 +1,9 @@ import torch import torch.nn as nn -import torch.nn.functional as F class ConvolutionalEncoder2(nn.Module): - def __init__(self, z_dim: int = 2): + def __init__(self, latent_dim: int): super().__init__() self.enc1 = nn.Sequential( @@ -34,7 +33,7 @@ def __init__(self, z_dim: int = 2): ) # 1024 x 4 x 4 self.enc6 = nn.Sequential( nn.Flatten(), - nn.Linear(1024 * 4 * 4, z_dim), + nn.Linear(1024 * 4 * 4, latent_dim), ) def forward(self, x: torch.tensor) -> torch.tensor: diff --git a/src/spherinator/models/rotational_autoencoder.py b/src/spherinator/models/rotational_autoencoder.py index 81b0266..db22ce0 100644 --- a/src/spherinator/models/rotational_autoencoder.py +++ b/src/spherinator/models/rotational_autoencoder.py @@ -15,9 +15,9 @@ class RotationalAutoencoder(SpherinatorModule): def __init__( self, - encoder: nn.Module = ConvolutionalEncoder(), - decoder: nn.Module = ConvolutionalDecoder(), - z_dim: int = 2, + encoder: nn.Module | None = None, + decoder: nn.Module | None = None, + z_dim: int = 3, image_size: int = 91, input_size: int = 128, rotations: int = 36, @@ -32,6 +32,11 @@ def __init__( super().__init__() self.save_hyperparameters(ignore=["encoder", "decoder"]) + if encoder is None: + encoder = ConvolutionalEncoder(latent_dim=z_dim) + if decoder is None: + decoder = ConvolutionalDecoder(latent_dim=z_dim) + self.encoder = encoder self.decoder = decoder self.z_dim = z_dim diff --git a/src/spherinator/models/rotational_variational_autoencoder_power.py b/src/spherinator/models/rotational_variational_autoencoder_power.py index 87df7b7..154cf25 100644 --- a/src/spherinator/models/rotational_variational_autoencoder_power.py +++ b/src/spherinator/models/rotational_variational_autoencoder_power.py @@ -16,10 +16,10 @@ class RotationalVariationalAutoencoderPower(SpherinatorModule): def __init__( self, - encoder: nn.Module = ConvolutionalEncoder(), - decoder: nn.Module = ConvolutionalDecoder(), + encoder: nn.Module | None = None, + decoder: nn.Module | None = None, h_dim: int = 256, - z_dim: int = 2, + z_dim: int = 3, image_size: int = 91, input_size: int = 128, rotations: int = 36, @@ -37,6 +37,11 @@ def __init__( super().__init__() self.save_hyperparameters(ignore=["encoder", "decoder"]) + if encoder is None: + encoder = ConvolutionalEncoder(latent_dim=h_dim) + if decoder is None: + decoder = ConvolutionalDecoder(latent_dim=h_dim) + self.encoder = encoder self.decoder = decoder self.h_dim = h_dim diff --git a/tests/test_cnn.py b/tests/test_cnn.py index f5d3697..957d284 100644 --- a/tests/test_cnn.py +++ b/tests/test_cnn.py @@ -9,7 +9,7 @@ def test_convolutional_encoder(): """Check if weights are reproducible""" - model = ConvolutionalEncoder() + model = ConvolutionalEncoder(latent_dim=3) assert model.conv0.weight.shape == torch.Size([16, 3, 3, 3]) assert torch.isclose( @@ -19,7 +19,9 @@ def test_convolutional_encoder(): def test_model(): """Check if weights are reproducible""" - model = RotationalVariationalAutoencoderPower(encoder=ConvolutionalEncoder()) + model = RotationalVariationalAutoencoderPower( + encoder=ConvolutionalEncoder(latent_dim=3) + ) assert model.encoder.conv0.weight.shape == torch.Size([16, 3, 3, 3]) assert torch.isclose( @@ -28,8 +30,8 @@ def test_model(): def test_convolutional_decoder(): - model = ConvolutionalDecoder256() - data = torch.randn([2, 256]) + model = ConvolutionalDecoder256(latent_dim=3) + data = torch.randn([2, 3]) output = model(data) diff --git a/tests/test_hipster.py b/tests/test_hipster.py index 0c7b3ed..c30f89e 100644 --- a/tests/test_hipster.py +++ b/tests/test_hipster.py @@ -16,8 +16,8 @@ @pytest.fixture def model(): model = RotationalVariationalAutoencoderPower( - encoder=ConvolutionalEncoder(), - decoder=ConvolutionalDecoder(), + encoder=ConvolutionalEncoder(latent_dim=256), + decoder=ConvolutionalDecoder(latent_dim=256), z_dim=3, rotations=4, ) diff --git a/tests/test_resnet.py b/tests/test_resnet.py index 0de8ab1..adb54d2 100644 --- a/tests/test_resnet.py +++ b/tests/test_resnet.py @@ -9,12 +9,12 @@ [ ( torchvision.models.resnet18(num_classes=256), - spherinator.models.ConvolutionalDecoder(), + spherinator.models.ConvolutionalDecoder(latent_dim=256), 128, ), ( torchvision.models.vit_b_16(num_classes=256), - spherinator.models.ConvolutionalDecoder224(), + spherinator.models.ConvolutionalDecoder224(latent_dim=256), 224, ), ], From 601eaf7fa4f6915324a1591820d052fdc2878786 Mon Sep 17 00:00:00 2001 From: Bernd Doser Date: Wed, 29 May 2024 18:58:10 +0200 Subject: [PATCH 10/20] normalize loss by brightness --- .../models/rotational_autoencoder.py | 6 ++++++ tests/test_rotational_autoencoder.py | 21 +++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/src/spherinator/models/rotational_autoencoder.py b/src/spherinator/models/rotational_autoencoder.py index db22ce0..5ed8e7a 100644 --- a/src/spherinator/models/rotational_autoencoder.py +++ b/src/spherinator/models/rotational_autoencoder.py @@ -21,6 +21,7 @@ def __init__( image_size: int = 91, input_size: int = 128, rotations: int = 36, + norm_brightness: bool = False, ): """Initializer @@ -43,6 +44,7 @@ def __init__( self.image_size = image_size self.input_size = input_size self.rotations = rotations + self.norm_brightness = norm_brightness self.crop_size = int(self.image_size * math.sqrt(2) / 2) self.total_input_size = self.input_size * self.input_size * 3 @@ -88,6 +90,10 @@ def training_step(self, batch, batch_idx): loss = torch.min(loss, self.reconstruction_loss(scaled, recon)) + # divide by the brightness of the image + if self.norm_brightness: + loss = loss / torch.sum(scaled, (1, 2, 3)) * self.total_input_size + loss = loss.mean() self.log("train_loss", loss, prog_bar=True) diff --git a/tests/test_rotational_autoencoder.py b/tests/test_rotational_autoencoder.py index 22c4832..f9fbca9 100644 --- a/tests/test_rotational_autoencoder.py +++ b/tests/test_rotational_autoencoder.py @@ -1,5 +1,7 @@ import torch +from lightning.pytorch.trainer import Trainer +from spherinator.data import ImagesDataModule from spherinator.models import RotationalAutoencoder @@ -10,6 +12,25 @@ def test_forward(): assert recon.shape == input.shape +def test_training(shape_path): + model = RotationalAutoencoder(norm_brightness=True) + + datamodule = ImagesDataModule( + "tests/data/images", + image_size=224, + num_workers=1, + batch_size=2, + ) + + trainer = Trainer( + max_epochs=1, + overfit_batches=2, + enable_checkpointing=False, + accelerator="cpu", + ) + trainer.fit(model, datamodule=datamodule) + + def test_reconstruction_loss(): model = RotationalAutoencoder() image1 = torch.zeros((2, 3, 128, 128)) From 715ed7addb8ffc4fdbe8fa1ef3c06809910f1345 Mon Sep 17 00:00:00 2001 From: Bernd Doser Date: Tue, 4 Jun 2024 17:39:07 +0200 Subject: [PATCH 11/20] remove sigmoid from last layer of decoder --- src/spherinator/models/convolutional_decoder_2.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/spherinator/models/convolutional_decoder_2.py b/src/spherinator/models/convolutional_decoder_2.py index 96e08d3..3b82083 100644 --- a/src/spherinator/models/convolutional_decoder_2.py +++ b/src/spherinator/models/convolutional_decoder_2.py @@ -35,7 +35,6 @@ def __init__(self, latent_dim: int): self.dec6 = nn.Sequential( nn.ConvTranspose2d(128, 3, 4, stride=2, padding=1), nn.BatchNorm2d(3), - nn.Sigmoid(), ) # 3 x 128 x 128 def forward(self, x: torch.tensor) -> torch.tensor: From beee3eacc46aa22f744f423864d1074edfe029f1 Mon Sep 17 00:00:00 2001 From: Bernd Doser Date: Wed, 26 Jun 2024 18:48:42 +0200 Subject: [PATCH 12/20] use Optional to support python 3.9 --- src/spherinator/models/rotational_autoencoder.py | 5 +++-- .../models/rotational_variational_autoencoder_power.py | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/spherinator/models/rotational_autoencoder.py b/src/spherinator/models/rotational_autoencoder.py index 5ed8e7a..a29802b 100644 --- a/src/spherinator/models/rotational_autoencoder.py +++ b/src/spherinator/models/rotational_autoencoder.py @@ -1,4 +1,5 @@ import math +from typing import Optional import torch import torch.linalg @@ -15,8 +16,8 @@ class RotationalAutoencoder(SpherinatorModule): def __init__( self, - encoder: nn.Module | None = None, - decoder: nn.Module | None = None, + encoder: Optional[nn.Module] = None, + decoder: Optional[nn.Module] = None, z_dim: int = 3, image_size: int = 91, input_size: int = 128, diff --git a/src/spherinator/models/rotational_variational_autoencoder_power.py b/src/spherinator/models/rotational_variational_autoencoder_power.py index 154cf25..6f7b33f 100644 --- a/src/spherinator/models/rotational_variational_autoencoder_power.py +++ b/src/spherinator/models/rotational_variational_autoencoder_power.py @@ -1,4 +1,5 @@ import math +from typing import Optional import torch import torch.linalg @@ -16,8 +17,8 @@ class RotationalVariationalAutoencoderPower(SpherinatorModule): def __init__( self, - encoder: nn.Module | None = None, - decoder: nn.Module | None = None, + encoder: Optional[nn.Module] = None, + decoder: Optional[nn.Module] = None, h_dim: int = 256, z_dim: int = 3, image_size: int = 91, From bfb5f602c7961d3729c33198344647705ef49e01 Mon Sep 17 00:00:00 2001 From: Bernd Doser Date: Thu, 27 Jun 2024 10:15:56 +0200 Subject: [PATCH 13/20] Revert "train with not rotated image and reconstruction loss as minimum over rotated images with reconstructed image of not rotated image" This reverts commit a1c1627f7cf4d928aed55aaa847109c8e680ca5d. --- ...otational_variational_autoencoder_power.py | 25 +++---------------- 1 file changed, 3 insertions(+), 22 deletions(-) diff --git a/src/spherinator/models/rotational_variational_autoencoder_power.py b/src/spherinator/models/rotational_variational_autoencoder_power.py index 6f7b33f..faccc31 100644 --- a/src/spherinator/models/rotational_variational_autoencoder_power.py +++ b/src/spherinator/models/rotational_variational_autoencoder_power.py @@ -5,7 +5,6 @@ import torch.linalg import torch.nn as nn import torch.nn.functional as F -import torchvision.transforms.v2.functional as functional from power_spherical import HypersphericalUniform, PowerSpherical from torch.optim import Adam @@ -95,28 +94,10 @@ def forward(self, x): return (z_location, z_scale), (q_z, p_z), z, recon def training_step(self, batch, batch_idx): + best_scaled_image, _, _, _ = self.find_best_rotation(batch) + (z_location, z_scale), (q_z, p_z), _, recon = self.forward(best_scaled_image) - with torch.no_grad(): - crop = functional.center_crop(batch, [self.crop_size, self.crop_size]) - scaled = functional.resize( - crop, [self.input_size, self.input_size], antialias=True - ) - - (z_location, z_scale), (q_z, p_z), _, recon = self.forward(scaled) - loss_recon = self.reconstruction_loss(scaled, recon) - - for i in range(1, self.rotations): - with torch.no_grad(): - rotate = functional.rotate( - batch, 360.0 / self.rotations * i, expand=False - ) - crop = functional.center_crop(rotate, [self.crop_size, self.crop_size]) - scaled = functional.resize( - crop, [self.input_size, self.input_size], antialias=True - ) - - loss_recon = torch.min(loss_recon, self.reconstruction_loss(scaled, recon)) - + loss_recon = self.reconstruction_loss(best_scaled_image, recon) loss_KL = torch.distributions.kl.kl_divergence(q_z, p_z) * self.beta loss = (loss_recon + loss_KL).mean() loss_recon = loss_recon.mean() From a16f96717d06d762afea27187101c9414da8d062 Mon Sep 17 00:00:00 2001 From: Bernd Doser Date: Thu, 27 Jun 2024 10:23:40 +0200 Subject: [PATCH 14/20] git ignore sarif files --- .gitignore | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 8b5ded0..38d6f57 100644 --- a/.gitignore +++ b/.gitignore @@ -2,10 +2,11 @@ __pycache__ .venv*/ *.ckpt *.ncu-rep +*.sarif config.yaml dist/ +docs/_build/ +docs/html/ HiPSter/ lightning_logs/ wandb/ -docs/_build/ -docs/html/ From ea158f8cec4c8cf92287c1bb065ba7e1bf6bfda2 Mon Sep 17 00:00:00 2001 From: Bernd Doser Date: Thu, 27 Jun 2024 10:31:06 +0200 Subject: [PATCH 15/20] Rotational2Autoencoder, which takes the minimal loss of all rotated input image and the reconstructed image using the not rotated image. --- src/spherinator/models/__init__.py | 6 + .../models/rotational2_autoencoder.py | 120 ++++++++++++++ ...tational2_variational_autoencoder_power.py | 150 ++++++++++++++++++ .../models/rotational_autoencoder.py | 33 +--- 4 files changed, 284 insertions(+), 25 deletions(-) create mode 100644 src/spherinator/models/rotational2_autoencoder.py create mode 100644 src/spherinator/models/rotational2_variational_autoencoder_power.py diff --git a/src/spherinator/models/__init__.py b/src/spherinator/models/__init__.py index 1afb6e5..0e3d906 100644 --- a/src/spherinator/models/__init__.py +++ b/src/spherinator/models/__init__.py @@ -18,6 +18,10 @@ from .convolutional_decoder_256 import ConvolutionalDecoder256 from .convolutional_encoder import ConvolutionalEncoder from .convolutional_encoder_2 import ConvolutionalEncoder2 +from .rotational2_autoencoder import Rotational2Autoencoder +from .rotational2_variational_autoencoder_power import ( + Rotational2VariationalAutoencoderPower, +) from .rotational_autoencoder import RotationalAutoencoder from .rotational_variational_autoencoder_power import ( RotationalVariationalAutoencoderPower, @@ -31,6 +35,8 @@ "ConvolutionalDecoder256", "ConvolutionalEncoder", "ConvolutionalEncoder2", + "Rotational2Autoencoder", + "Rotational2VariationalAutoencoderPower", "RotationalAutoencoder", "RotationalVariationalAutoencoderPower", "SpherinatorModule", diff --git a/src/spherinator/models/rotational2_autoencoder.py b/src/spherinator/models/rotational2_autoencoder.py new file mode 100644 index 0000000..cfb2f82 --- /dev/null +++ b/src/spherinator/models/rotational2_autoencoder.py @@ -0,0 +1,120 @@ +import math +from typing import Optional + +import torch +import torch.linalg +import torch.nn as nn +import torchvision.transforms.v2.functional as functional +from torch.optim import Adam + +from .convolutional_decoder import ConvolutionalDecoder +from .convolutional_encoder import ConvolutionalEncoder +from .spherinator_module import SpherinatorModule + + +class Rotational2Autoencoder(SpherinatorModule): + def __init__( + self, + encoder: Optional[nn.Module] = None, + decoder: Optional[nn.Module] = None, + z_dim: int = 3, + image_size: int = 91, + input_size: int = 128, + rotations: int = 36, + norm_brightness: bool = False, + ): + """Initializer + + Args: + z_dim (int, optional): dimension of the latent representation. Defaults to 2. + image_size (int, optional): size of the input images. Defaults to 91. + rotations (int, optional): number of rotations. Defaults to 36. + """ + super().__init__() + self.save_hyperparameters(ignore=["encoder", "decoder"]) + + if encoder is None: + encoder = ConvolutionalEncoder(latent_dim=z_dim) + if decoder is None: + decoder = ConvolutionalDecoder(latent_dim=z_dim) + + self.encoder = encoder + self.decoder = decoder + self.z_dim = z_dim + self.image_size = image_size + self.input_size = input_size + self.rotations = rotations + self.norm_brightness = norm_brightness + + self.crop_size = int(self.image_size * math.sqrt(2) / 2) + self.total_input_size = self.input_size * self.input_size * 3 + + self.example_input_array = torch.randn(1, 3, self.input_size, self.input_size) + + def get_input_size(self): + return self.input_size + + def encode(self, x): + z = self.encoder(x) + return z + + def decode(self, z): + x = self.decoder(z) + return x + + def forward(self, x): + z = self.encode(x) + recon = self.decode(z) + return recon + + def training_step(self, batch, batch_idx): + + with torch.no_grad(): + crop = functional.center_crop(batch, [self.crop_size, self.crop_size]) + scaled = functional.resize( + crop, [self.input_size, self.input_size], antialias=True + ) + + recon = self.forward(scaled) + loss = self.reconstruction_loss(scaled, recon) + + for i in range(1, self.rotations): + with torch.no_grad(): + rotate = functional.rotate( + batch, 360.0 / self.rotations * i, expand=False + ) + crop = functional.center_crop(rotate, [self.crop_size, self.crop_size]) + scaled = functional.resize( + crop, [self.input_size, self.input_size], antialias=True + ) + + loss = torch.min(loss, self.reconstruction_loss(scaled, recon)) + + # divide by the brightness of the image + if self.norm_brightness: + loss = loss / torch.sum(scaled, (1, 2, 3)) * self.total_input_size + + loss = loss.mean() + + self.log("train_loss", loss, prog_bar=True) + self.log("learning_rate", self.optimizers().param_groups[0]["lr"]) + return loss + + def configure_optimizers(self): + """Default Adam optimizer if missing from the configuration file.""" + return Adam(self.parameters(), lr=1e-3) + + def project(self, images): + z = self.encode(images) + return z + + def reconstruct(self, coordinates): + return self.decode(coordinates) + + def reconstruction_loss(self, images, reconstructions): + return torch.sqrt( + nn.MSELoss(reduction="none")( + reconstructions.reshape(-1, self.total_input_size), + images.reshape(-1, self.total_input_size), + ).mean(dim=1) + ) diff --git a/src/spherinator/models/rotational2_variational_autoencoder_power.py b/src/spherinator/models/rotational2_variational_autoencoder_power.py new file mode 100644 index 0000000..b402ea6 --- /dev/null +++ b/src/spherinator/models/rotational2_variational_autoencoder_power.py @@ -0,0 +1,150 @@ +import math +from typing import Optional + +import torch +import torch.linalg +import torch.nn as nn +import torch.nn.functional as F +import torchvision.transforms.v2.functional as functional +from power_spherical import HypersphericalUniform, PowerSpherical +from torch.optim import Adam + +from .convolutional_decoder import ConvolutionalDecoder +from .convolutional_encoder import ConvolutionalEncoder +from .spherinator_module import SpherinatorModule + + +class Rotational2VariationalAutoencoderPower(SpherinatorModule): + def __init__( + self, + encoder: Optional[nn.Module] = None, + decoder: Optional[nn.Module] = None, + h_dim: int = 256, + z_dim: int = 3, + image_size: int = 91, + input_size: int = 128, + rotations: int = 36, + beta: float = 1.0, + ): + """RotationalVariationalAutoencoderPower initializer + + Args: + h_dim (int, optional): dimension of the hidden layers. Defaults to 256. + z_dim (int, optional): dimension of the latent representation. Defaults to 2. + image_size (int, optional): size of the input images. Defaults to 91. + rotations (int, optional): number of rotations. Defaults to 36. + beta (float, optional): factor for beta-VAE. Defaults to 1.0. + """ + super().__init__() + self.save_hyperparameters(ignore=["encoder", "decoder"]) + + if encoder is None: + encoder = ConvolutionalEncoder(latent_dim=h_dim) + if decoder is None: + decoder = ConvolutionalDecoder(latent_dim=h_dim) + + self.encoder = encoder + self.decoder = decoder + self.h_dim = h_dim + self.z_dim = z_dim + self.image_size = image_size + self.input_size = input_size + self.rotations = rotations + self.beta = beta + + self.crop_size = int(self.image_size * math.sqrt(2) / 2) + self.total_input_size = self.input_size * self.input_size * 3 + + self.example_input_array = torch.randn(1, 3, self.input_size, self.input_size) + + self.fc_location = nn.Linear(h_dim, z_dim) + self.fc_scale = nn.Linear(h_dim, 1) + self.fc2 = nn.Linear(z_dim, h_dim) + + with torch.no_grad(): + self.fc_scale.bias.fill_(1.0e3) + + def get_input_size(self): + return self.input_size + + def encode(self, x): + x = self.encoder(x) + + z_location = self.fc_location(x) + z_location = torch.nn.functional.normalize(z_location, p=2.0, dim=1) + # SVAE code: the `+ 1` prevent collapsing behaviors + z_scale = F.softplus(self.fc_scale(x)) + 1 + + return z_location, z_scale + + def decode(self, z): + x = F.relu(self.fc2(z)) + x = self.decoder(x) + return x + + def reparameterize(self, z_location, z_scale): + q_z = PowerSpherical(z_location, z_scale) + p_z = HypersphericalUniform(self.z_dim, device=z_location.device) + return q_z, p_z + + def forward(self, x): + z_location, z_scale = self.encode(x) + q_z, p_z = self.reparameterize(z_location, z_scale.squeeze()) + z = q_z.rsample() + recon = self.decode(z) + return (z_location, z_scale), (q_z, p_z), z, recon + + def training_step(self, batch, batch_idx): + + with torch.no_grad(): + crop = functional.center_crop(batch, [self.crop_size, self.crop_size]) + scaled = functional.resize( + crop, [self.input_size, self.input_size], antialias=True + ) + + (z_location, z_scale), (q_z, p_z), _, recon = self.forward(scaled) + loss_recon = self.reconstruction_loss(scaled, recon) + + for i in range(1, self.rotations): + with torch.no_grad(): + rotate = functional.rotate( + batch, 360.0 / self.rotations * i, expand=False + ) + crop = functional.center_crop(rotate, [self.crop_size, self.crop_size]) + scaled = functional.resize( + crop, [self.input_size, self.input_size], antialias=True + ) + + loss_recon = torch.min(loss_recon, self.reconstruction_loss(scaled, recon)) + + loss_KL = torch.distributions.kl.kl_divergence(q_z, p_z) * self.beta + loss = (loss_recon + loss_KL).mean() + loss_recon = loss_recon.mean() + loss_KL = loss_KL.mean() + + self.log("train_loss", loss, prog_bar=True) + self.log("loss_recon", loss_recon, prog_bar=True) + self.log("loss_KL", loss_KL) + self.log("learning_rate", self.optimizers().param_groups[0]["lr"]) + self.log("mean(z_location)", torch.mean(z_location)) + self.log("mean(z_scale)", torch.mean(z_scale)) + return loss + + def configure_optimizers(self): + """Default Adam optimizer if missing from the configuration file.""" + return Adam(self.parameters(), lr=1e-3) + + def project(self, images): + z_location, _ = self.encode(images) + return z_location + + def reconstruct(self, coordinates): + return self.decode(coordinates) + + def reconstruction_loss(self, images, reconstructions): + return torch.sqrt( + nn.MSELoss(reduction="none")( + reconstructions.reshape(-1, self.total_input_size), + images.reshape(-1, self.total_input_size), + ).mean(dim=1) + ) diff --git a/src/spherinator/models/rotational_autoencoder.py b/src/spherinator/models/rotational_autoencoder.py index a29802b..c3e5c9e 100644 --- a/src/spherinator/models/rotational_autoencoder.py +++ b/src/spherinator/models/rotational_autoencoder.py @@ -4,8 +4,6 @@ import torch import torch.linalg import torch.nn as nn -import torch.nn.functional as F -import torchvision.transforms.v2.functional as functional from torch.optim import Adam from .convolutional_decoder import ConvolutionalDecoder @@ -70,30 +68,15 @@ def forward(self, x): def training_step(self, batch, batch_idx): - with torch.no_grad(): - crop = functional.center_crop(batch, [self.crop_size, self.crop_size]) - scaled = functional.resize( - crop, [self.input_size, self.input_size], antialias=True - ) - - recon = self.forward(scaled) - loss = self.reconstruction_loss(scaled, recon) - - for i in range(1, self.rotations): - with torch.no_grad(): - rotate = functional.rotate( - batch, 360.0 / self.rotations * i, expand=False - ) - crop = functional.center_crop(rotate, [self.crop_size, self.crop_size]) - scaled = functional.resize( - crop, [self.input_size, self.input_size], antialias=True - ) + best_scaled_image, _, _, _ = self.find_best_rotation(batch) + recon = self.forward(best_scaled_image) + loss = self.reconstruction_loss(best_scaled_image, recon) - loss = torch.min(loss, self.reconstruction_loss(scaled, recon)) - - # divide by the brightness of the image - if self.norm_brightness: - loss = loss / torch.sum(scaled, (1, 2, 3)) * self.total_input_size + # divide by the brightness of the image + if self.norm_brightness: + loss = ( + loss / torch.sum(best_scaled_image, (1, 2, 3)) * self.total_input_size + ) loss = loss.mean() From 8a76c7c0fdbfc7fd4c02f78b16289c74ce65b184 Mon Sep 17 00:00:00 2001 From: Bernd Doser Date: Wed, 10 Jul 2024 17:20:39 +0200 Subject: [PATCH 16/20] switch off autocast for torch.no_grad --- ...otational_variational_autoencoder_power.py | 37 +++++++++++-------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/src/spherinator/models/rotational_variational_autoencoder_power.py b/src/spherinator/models/rotational_variational_autoencoder_power.py index faccc31..78c2da0 100644 --- a/src/spherinator/models/rotational_variational_autoencoder_power.py +++ b/src/spherinator/models/rotational_variational_autoencoder_power.py @@ -94,22 +94,27 @@ def forward(self, x): return (z_location, z_scale), (q_z, p_z), z, recon def training_step(self, batch, batch_idx): - best_scaled_image, _, _, _ = self.find_best_rotation(batch) - (z_location, z_scale), (q_z, p_z), _, recon = self.forward(best_scaled_image) - - loss_recon = self.reconstruction_loss(best_scaled_image, recon) - loss_KL = torch.distributions.kl.kl_divergence(q_z, p_z) * self.beta - loss = (loss_recon + loss_KL).mean() - loss_recon = loss_recon.mean() - loss_KL = loss_KL.mean() - - self.log("train_loss", loss, prog_bar=True) - self.log("loss_recon", loss_recon, prog_bar=True) - self.log("loss_KL", loss_KL) - self.log("learning_rate", self.optimizers().param_groups[0]["lr"]) - self.log("mean(z_location)", torch.mean(z_location)) - self.log("mean(z_scale)", torch.mean(z_scale)) - return loss + with torch.autocast("cuda", enabled=False): + best_scaled_image, _, _, _ = self.find_best_rotation(batch) + + with torch.autocast("cuda", enabled=True): + (z_location, z_scale), (q_z, p_z), _, recon = self.forward( + best_scaled_image + ) + + loss_recon = self.reconstruction_loss(best_scaled_image, recon) + loss_KL = torch.distributions.kl.kl_divergence(q_z, p_z) * self.beta + loss = (loss_recon + loss_KL).mean() + loss_recon = loss_recon.mean() + loss_KL = loss_KL.mean() + + self.log("train_loss", loss, prog_bar=True) + self.log("loss_recon", loss_recon, prog_bar=True) + self.log("loss_KL", loss_KL) + self.log("learning_rate", self.optimizers().param_groups[0]["lr"]) + self.log("mean(z_location)", torch.mean(z_location)) + self.log("mean(z_scale)", torch.mean(z_scale)) + return loss def configure_optimizers(self): """Default Adam optimizer if missing from the configuration file.""" From 9de13533c66d72d5e93fad9b47bc08f96629b4af Mon Sep 17 00:00:00 2001 From: Bernd Doser Date: Wed, 10 Jul 2024 17:48:37 +0200 Subject: [PATCH 17/20] torch dynamo export not supported for python 3.12, skip tests --- tests/test_dynamo_export.py | 6 ++++++ tests/test_onnx_export.py | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/tests/test_dynamo_export.py b/tests/test_dynamo_export.py index 5ff78b7..ed9b096 100644 --- a/tests/test_dynamo_export.py +++ b/tests/test_dynamo_export.py @@ -1,3 +1,5 @@ +import sys + import pytest import torch import torch.nn as nn @@ -13,6 +15,10 @@ def forward(self, x): return self.dist.rsample(x.shape) +@pytest.mark.skipif( + sys.version_info > (3, 11), + reason="torch dynamo export not supported for python 3.12", +) @pytest.mark.parametrize( ("module", "input"), [ diff --git a/tests/test_onnx_export.py b/tests/test_onnx_export.py index 7dc7168..01e01da 100644 --- a/tests/test_onnx_export.py +++ b/tests/test_onnx_export.py @@ -1,3 +1,5 @@ +import sys + import pytest import torch import torch.nn as nn @@ -44,6 +46,10 @@ def forward(self, x): return self.dist.rsample(x.shape) +@pytest.mark.skipif( + sys.version_info > (3, 11), + reason="torch dynamo export not supported for python 3.12", +) @pytest.mark.parametrize( ("module", "input"), [ From 8578d9affbaa7054778f737b43419bca05bb3af7 Mon Sep 17 00:00:00 2001 From: Bernd Doser Date: Mon, 22 Jul 2024 13:18:26 +0200 Subject: [PATCH 18/20] fix flake8 warnings --- src/spherinator/data/galaxy_zoo_data_module.py | 2 +- src/spherinator/data/illustris_sdss_data_module.py | 2 +- src/spherinator/data/images_dataset.py | 1 - src/spherinator/data/shapes_data_module.py | 2 +- tests/test_illustris_sdss_data_module.py | 2 +- tests/test_power_spherical.py | 2 +- 6 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/spherinator/data/galaxy_zoo_data_module.py b/src/spherinator/data/galaxy_zoo_data_module.py index 221eed3..9759d95 100644 --- a/src/spherinator/data/galaxy_zoo_data_module.py +++ b/src/spherinator/data/galaxy_zoo_data_module.py @@ -65,7 +65,7 @@ def setup(self, stage: str): Args: stage (str): Defines for which stage the data is needed. """ - if not stage in ["fit", "processing", "images", "thumbnail_images"]: + if stage not in ["fit", "processing", "images", "thumbnail_images"]: raise ValueError(f"Stage {stage} not supported.") if stage == "fit" and self.data_train is None: diff --git a/src/spherinator/data/illustris_sdss_data_module.py b/src/spherinator/data/illustris_sdss_data_module.py index 318c63a..4c2af4d 100644 --- a/src/spherinator/data/illustris_sdss_data_module.py +++ b/src/spherinator/data/illustris_sdss_data_module.py @@ -93,7 +93,7 @@ def setup(self, stage: str): Args: stage (str): Defines for which stage the data is needed. """ - if not stage in ["fit", "processing", "images", "thumbnail_images"]: + if stage not in ["fit", "processing", "images", "thumbnail_images"]: raise ValueError(f"Stage {stage} not supported.") if stage == "fit" and self.data_train is None: diff --git a/src/spherinator/data/images_dataset.py b/src/spherinator/data/images_dataset.py index d14778d..163ab90 100644 --- a/src/spherinator/data/images_dataset.py +++ b/src/spherinator/data/images_dataset.py @@ -4,7 +4,6 @@ import os from pathlib import Path -import numpy as np import skimage.io as io import torch from torch.utils.data import Dataset diff --git a/src/spherinator/data/shapes_data_module.py b/src/spherinator/data/shapes_data_module.py index 951eb0c..851f750 100644 --- a/src/spherinator/data/shapes_data_module.py +++ b/src/spherinator/data/shapes_data_module.py @@ -76,7 +76,7 @@ def setup(self, stage: str): stage (str): Defines for which stage the data is needed. For the moment just fitting is supported. """ - if not stage in ["fit", "processing", "images", "thumbnail_images"]: + if stage not in ["fit", "processing", "images", "thumbnail_images"]: raise ValueError(f"Stage {stage} not supported.") if stage == "fit" and self.data_train is None: diff --git a/tests/test_illustris_sdss_data_module.py b/tests/test_illustris_sdss_data_module.py index c0865f3..644bacb 100644 --- a/tests/test_illustris_sdss_data_module.py +++ b/tests/test_illustris_sdss_data_module.py @@ -14,7 +14,7 @@ def test_empty(): data = IllustrisSdssDataModule(["tests/data/"], num_workers=1) - assert data.train_dataloader() == None + assert data.train_dataloader() is None try: data.setup("fit") diff --git a/tests/test_power_spherical.py b/tests/test_power_spherical.py index 46a6a4e..f62a105 100644 --- a/tests/test_power_spherical.py +++ b/tests/test_power_spherical.py @@ -5,7 +5,7 @@ def test_power_spherical_2d(): dist = PowerSpherical(torch.Tensor([0.0, 0.0]), torch.Tensor([1.0])) - assert dist.has_rsample == True + assert dist.has_rsample is True assert torch.allclose(dist.rsample(), torch.Tensor([-0.9971, 0.0766]), rtol=1e-3) assert torch.allclose(dist.rsample(), torch.Tensor([-0.5954, 0.8034]), rtol=1e-3) From a1c54da86ae6df0049b56f93d4ceafb02581c22d Mon Sep 17 00:00:00 2001 From: Bernd Doser Date: Wed, 24 Jul 2024 10:43:30 +0200 Subject: [PATCH 19/20] disable autocast for torch.no_grad for all autoencoders --- .../models/rotational2_autoencoder.py | 55 +++++++++-------- ...tational2_variational_autoencoder_power.py | 61 ++++++++++--------- .../models/rotational_autoencoder.py | 36 ++++++----- 3 files changed, 82 insertions(+), 70 deletions(-) diff --git a/src/spherinator/models/rotational2_autoencoder.py b/src/spherinator/models/rotational2_autoencoder.py index cfb2f82..cb5e916 100644 --- a/src/spherinator/models/rotational2_autoencoder.py +++ b/src/spherinator/models/rotational2_autoencoder.py @@ -68,37 +68,40 @@ def forward(self, x): return recon def training_step(self, batch, batch_idx): - - with torch.no_grad(): - crop = functional.center_crop(batch, [self.crop_size, self.crop_size]) - scaled = functional.resize( - crop, [self.input_size, self.input_size], antialias=True - ) - - recon = self.forward(scaled) - loss = self.reconstruction_loss(scaled, recon) - - for i in range(1, self.rotations): + with torch.autocast("cuda", enabled=False): with torch.no_grad(): - rotate = functional.rotate( - batch, 360.0 / self.rotations * i, expand=False - ) - crop = functional.center_crop(rotate, [self.crop_size, self.crop_size]) + crop = functional.center_crop(batch, [self.crop_size, self.crop_size]) scaled = functional.resize( crop, [self.input_size, self.input_size], antialias=True ) - loss = torch.min(loss, self.reconstruction_loss(scaled, recon)) - - # divide by the brightness of the image - if self.norm_brightness: - loss = loss / torch.sum(scaled, (1, 2, 3)) * self.total_input_size - - loss = loss.mean() - - self.log("train_loss", loss, prog_bar=True) - self.log("learning_rate", self.optimizers().param_groups[0]["lr"]) - return loss + with torch.autocast("cuda", enabled=True): + recon = self.forward(scaled) + loss = self.reconstruction_loss(scaled, recon) + + for i in range(1, self.rotations): + with torch.no_grad(): + rotate = functional.rotate( + batch, 360.0 / self.rotations * i, expand=False + ) + crop = functional.center_crop( + rotate, [self.crop_size, self.crop_size] + ) + scaled = functional.resize( + crop, [self.input_size, self.input_size], antialias=True + ) + + loss = torch.min(loss, self.reconstruction_loss(scaled, recon)) + + # divide by the brightness of the image + if self.norm_brightness: + loss = loss / torch.sum(scaled, (1, 2, 3)) * self.total_input_size + + loss = loss.mean() + + self.log("train_loss", loss, prog_bar=True) + self.log("learning_rate", self.optimizers().param_groups[0]["lr"]) + return loss def configure_optimizers(self): """Default Adam optimizer if missing from the configuration file.""" diff --git a/src/spherinator/models/rotational2_variational_autoencoder_power.py b/src/spherinator/models/rotational2_variational_autoencoder_power.py index b402ea6..f71e43d 100644 --- a/src/spherinator/models/rotational2_variational_autoencoder_power.py +++ b/src/spherinator/models/rotational2_variational_autoencoder_power.py @@ -95,40 +95,45 @@ def forward(self, x): return (z_location, z_scale), (q_z, p_z), z, recon def training_step(self, batch, batch_idx): - - with torch.no_grad(): - crop = functional.center_crop(batch, [self.crop_size, self.crop_size]) - scaled = functional.resize( - crop, [self.input_size, self.input_size], antialias=True - ) - - (z_location, z_scale), (q_z, p_z), _, recon = self.forward(scaled) - loss_recon = self.reconstruction_loss(scaled, recon) - - for i in range(1, self.rotations): + with torch.autocast("cuda", enabled=False): with torch.no_grad(): - rotate = functional.rotate( - batch, 360.0 / self.rotations * i, expand=False - ) - crop = functional.center_crop(rotate, [self.crop_size, self.crop_size]) + crop = functional.center_crop(batch, [self.crop_size, self.crop_size]) scaled = functional.resize( crop, [self.input_size, self.input_size], antialias=True ) - loss_recon = torch.min(loss_recon, self.reconstruction_loss(scaled, recon)) - - loss_KL = torch.distributions.kl.kl_divergence(q_z, p_z) * self.beta - loss = (loss_recon + loss_KL).mean() - loss_recon = loss_recon.mean() - loss_KL = loss_KL.mean() + with torch.autocast("cuda", enabled=True): + (z_location, z_scale), (q_z, p_z), _, recon = self.forward(scaled) + loss_recon = self.reconstruction_loss(scaled, recon) + + for i in range(1, self.rotations): + with torch.no_grad(): + rotate = functional.rotate( + batch, 360.0 / self.rotations * i, expand=False + ) + crop = functional.center_crop( + rotate, [self.crop_size, self.crop_size] + ) + scaled = functional.resize( + crop, [self.input_size, self.input_size], antialias=True + ) + + loss_recon = torch.min( + loss_recon, self.reconstruction_loss(scaled, recon) + ) - self.log("train_loss", loss, prog_bar=True) - self.log("loss_recon", loss_recon, prog_bar=True) - self.log("loss_KL", loss_KL) - self.log("learning_rate", self.optimizers().param_groups[0]["lr"]) - self.log("mean(z_location)", torch.mean(z_location)) - self.log("mean(z_scale)", torch.mean(z_scale)) - return loss + loss_KL = torch.distributions.kl.kl_divergence(q_z, p_z) * self.beta + loss = (loss_recon + loss_KL).mean() + loss_recon = loss_recon.mean() + loss_KL = loss_KL.mean() + + self.log("train_loss", loss, prog_bar=True) + self.log("loss_recon", loss_recon, prog_bar=True) + self.log("loss_KL", loss_KL) + self.log("learning_rate", self.optimizers().param_groups[0]["lr"]) + self.log("mean(z_location)", torch.mean(z_location)) + self.log("mean(z_scale)", torch.mean(z_scale)) + return loss def configure_optimizers(self): """Default Adam optimizer if missing from the configuration file.""" diff --git a/src/spherinator/models/rotational_autoencoder.py b/src/spherinator/models/rotational_autoencoder.py index c3e5c9e..1879cd1 100644 --- a/src/spherinator/models/rotational_autoencoder.py +++ b/src/spherinator/models/rotational_autoencoder.py @@ -67,22 +67,26 @@ def forward(self, x): return recon def training_step(self, batch, batch_idx): - - best_scaled_image, _, _, _ = self.find_best_rotation(batch) - recon = self.forward(best_scaled_image) - loss = self.reconstruction_loss(best_scaled_image, recon) - - # divide by the brightness of the image - if self.norm_brightness: - loss = ( - loss / torch.sum(best_scaled_image, (1, 2, 3)) * self.total_input_size - ) - - loss = loss.mean() - - self.log("train_loss", loss, prog_bar=True) - self.log("learning_rate", self.optimizers().param_groups[0]["lr"]) - return loss + with torch.autocast("cuda", enabled=False): + best_scaled_image, _, _, _ = self.find_best_rotation(batch) + + with torch.autocast("cuda", enabled=True): + recon = self.forward(best_scaled_image) + loss = self.reconstruction_loss(best_scaled_image, recon) + + # divide by the brightness of the image + if self.norm_brightness: + loss = ( + loss + / torch.sum(best_scaled_image, (1, 2, 3)) + * self.total_input_size + ) + + loss = loss.mean() + + self.log("train_loss", loss, prog_bar=True) + self.log("learning_rate", self.optimizers().param_groups[0]["lr"]) + return loss def configure_optimizers(self): """Default Adam optimizer if missing from the configuration file.""" From 574960f6c08fa0004cac66b26719a58be3fc5b29 Mon Sep 17 00:00:00 2001 From: Bernd Doser Date: Wed, 24 Jul 2024 11:10:01 +0200 Subject: [PATCH 20/20] poetry update --- poetry.lock | 1049 ++++++++++++++++++++++++++------------------------- 1 file changed, 531 insertions(+), 518 deletions(-) diff --git a/poetry.lock b/poetry.lock index 1209068..c75c4f9 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. [[package]] name = "absl-py" @@ -197,13 +197,13 @@ test-all = ["astropy[test]", "coverage[toml]", "ipython (>=4.2)", "objgraph", "s [[package]] name = "astropy-iers-data" -version = "0.2024.6.24.0.31.11" +version = "0.2024.7.22.0.34.13" description = "IERS Earth Rotation and Leap Second tables for the astropy core package" optional = false python-versions = ">=3.8" files = [ - {file = "astropy_iers_data-0.2024.6.24.0.31.11-py3-none-any.whl", hash = "sha256:0b3799034b0b76af8f915ef822d38cc90e00e235db0cb688018e4f567a8babb9"}, - {file = "astropy_iers_data-0.2024.6.24.0.31.11.tar.gz", hash = "sha256:ef0197b7b84dea248031e553687ea1dc58d7ac9473043693b2d33b46d81a9a12"}, + {file = "astropy_iers_data-0.2024.7.22.0.34.13-py3-none-any.whl", hash = "sha256:567a6cb261dd62f60862ee8d38e70fb2c88dfad03e962bc8138397a22e33003d"}, + {file = "astropy_iers_data-0.2024.7.22.0.34.13.tar.gz", hash = "sha256:9bbb4bfc28bc8e834a6b3946a312ce3490c285abeab8fd9b1e98b11fdee6f92c"}, ] [package.extras] @@ -274,13 +274,13 @@ dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] [[package]] name = "certifi" -version = "2024.6.2" +version = "2024.7.4" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.6.2-py3-none-any.whl", hash = "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56"}, - {file = "certifi-2024.6.2.tar.gz", hash = "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516"}, + {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, + {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, ] [[package]] @@ -567,63 +567,63 @@ test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] [[package]] name = "coverage" -version = "7.5.4" +version = "7.6.0" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.5.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6cfb5a4f556bb51aba274588200a46e4dd6b505fb1a5f8c5ae408222eb416f99"}, - {file = "coverage-7.5.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2174e7c23e0a454ffe12267a10732c273243b4f2d50d07544a91198f05c48f47"}, - {file = "coverage-7.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2214ee920787d85db1b6a0bd9da5f8503ccc8fcd5814d90796c2f2493a2f4d2e"}, - {file = "coverage-7.5.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1137f46adb28e3813dec8c01fefadcb8c614f33576f672962e323b5128d9a68d"}, - {file = "coverage-7.5.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b385d49609f8e9efc885790a5a0e89f2e3ae042cdf12958b6034cc442de428d3"}, - {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b4a474f799456e0eb46d78ab07303286a84a3140e9700b9e154cfebc8f527016"}, - {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5cd64adedf3be66f8ccee418473c2916492d53cbafbfcff851cbec5a8454b136"}, - {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e564c2cf45d2f44a9da56f4e3a26b2236504a496eb4cb0ca7221cd4cc7a9aca9"}, - {file = "coverage-7.5.4-cp310-cp310-win32.whl", hash = "sha256:7076b4b3a5f6d2b5d7f1185fde25b1e54eb66e647a1dfef0e2c2bfaf9b4c88c8"}, - {file = "coverage-7.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:018a12985185038a5b2bcafab04ab833a9a0f2c59995b3cec07e10074c78635f"}, - {file = "coverage-7.5.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:db14f552ac38f10758ad14dd7b983dbab424e731588d300c7db25b6f89e335b5"}, - {file = "coverage-7.5.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3257fdd8e574805f27bb5342b77bc65578e98cbc004a92232106344053f319ba"}, - {file = "coverage-7.5.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a6612c99081d8d6134005b1354191e103ec9705d7ba2754e848211ac8cacc6b"}, - {file = "coverage-7.5.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d45d3cbd94159c468b9b8c5a556e3f6b81a8d1af2a92b77320e887c3e7a5d080"}, - {file = "coverage-7.5.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed550e7442f278af76d9d65af48069f1fb84c9f745ae249c1a183c1e9d1b025c"}, - {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7a892be37ca35eb5019ec85402c3371b0f7cda5ab5056023a7f13da0961e60da"}, - {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8192794d120167e2a64721d88dbd688584675e86e15d0569599257566dec9bf0"}, - {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:820bc841faa502e727a48311948e0461132a9c8baa42f6b2b84a29ced24cc078"}, - {file = "coverage-7.5.4-cp311-cp311-win32.whl", hash = "sha256:6aae5cce399a0f065da65c7bb1e8abd5c7a3043da9dceb429ebe1b289bc07806"}, - {file = "coverage-7.5.4-cp311-cp311-win_amd64.whl", hash = "sha256:d2e344d6adc8ef81c5a233d3a57b3c7d5181f40e79e05e1c143da143ccb6377d"}, - {file = "coverage-7.5.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:54317c2b806354cbb2dc7ac27e2b93f97096912cc16b18289c5d4e44fc663233"}, - {file = "coverage-7.5.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:042183de01f8b6d531e10c197f7f0315a61e8d805ab29c5f7b51a01d62782747"}, - {file = "coverage-7.5.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6bb74ed465d5fb204b2ec41d79bcd28afccf817de721e8a807d5141c3426638"}, - {file = "coverage-7.5.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3d45ff86efb129c599a3b287ae2e44c1e281ae0f9a9bad0edc202179bcc3a2e"}, - {file = "coverage-7.5.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5013ed890dc917cef2c9f765c4c6a8ae9df983cd60dbb635df8ed9f4ebc9f555"}, - {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1014fbf665fef86cdfd6cb5b7371496ce35e4d2a00cda501cf9f5b9e6fced69f"}, - {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3684bc2ff328f935981847082ba4fdc950d58906a40eafa93510d1b54c08a66c"}, - {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:581ea96f92bf71a5ec0974001f900db495488434a6928a2ca7f01eee20c23805"}, - {file = "coverage-7.5.4-cp312-cp312-win32.whl", hash = "sha256:73ca8fbc5bc622e54627314c1a6f1dfdd8db69788f3443e752c215f29fa87a0b"}, - {file = "coverage-7.5.4-cp312-cp312-win_amd64.whl", hash = "sha256:cef4649ec906ea7ea5e9e796e68b987f83fa9a718514fe147f538cfeda76d7a7"}, - {file = "coverage-7.5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdd31315fc20868c194130de9ee6bfd99755cc9565edff98ecc12585b90be882"}, - {file = "coverage-7.5.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:02ff6e898197cc1e9fa375581382b72498eb2e6d5fc0b53f03e496cfee3fac6d"}, - {file = "coverage-7.5.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d05c16cf4b4c2fc880cb12ba4c9b526e9e5d5bb1d81313d4d732a5b9fe2b9d53"}, - {file = "coverage-7.5.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5986ee7ea0795a4095ac4d113cbb3448601efca7f158ec7f7087a6c705304e4"}, - {file = "coverage-7.5.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5df54843b88901fdc2f598ac06737f03d71168fd1175728054c8f5a2739ac3e4"}, - {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ab73b35e8d109bffbda9a3e91c64e29fe26e03e49addf5b43d85fc426dde11f9"}, - {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:aea072a941b033813f5e4814541fc265a5c12ed9720daef11ca516aeacd3bd7f"}, - {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:16852febd96acd953b0d55fc842ce2dac1710f26729b31c80b940b9afcd9896f"}, - {file = "coverage-7.5.4-cp38-cp38-win32.whl", hash = "sha256:8f894208794b164e6bd4bba61fc98bf6b06be4d390cf2daacfa6eca0a6d2bb4f"}, - {file = "coverage-7.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:e2afe743289273209c992075a5a4913e8d007d569a406ffed0bd080ea02b0633"}, - {file = "coverage-7.5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b95c3a8cb0463ba9f77383d0fa8c9194cf91f64445a63fc26fb2327e1e1eb088"}, - {file = "coverage-7.5.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3d7564cc09dd91b5a6001754a5b3c6ecc4aba6323baf33a12bd751036c998be4"}, - {file = "coverage-7.5.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44da56a2589b684813f86d07597fdf8a9c6ce77f58976727329272f5a01f99f7"}, - {file = "coverage-7.5.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e16f3d6b491c48c5ae726308e6ab1e18ee830b4cdd6913f2d7f77354b33f91c8"}, - {file = "coverage-7.5.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbc5958cb471e5a5af41b0ddaea96a37e74ed289535e8deca404811f6cb0bc3d"}, - {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a04e990a2a41740b02d6182b498ee9796cf60eefe40cf859b016650147908029"}, - {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ddbd2f9713a79e8e7242d7c51f1929611e991d855f414ca9996c20e44a895f7c"}, - {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b1ccf5e728ccf83acd313c89f07c22d70d6c375a9c6f339233dcf792094bcbf7"}, - {file = "coverage-7.5.4-cp39-cp39-win32.whl", hash = "sha256:56b4eafa21c6c175b3ede004ca12c653a88b6f922494b023aeb1e836df953ace"}, - {file = "coverage-7.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:65e528e2e921ba8fd67d9055e6b9f9e34b21ebd6768ae1c1723f4ea6ace1234d"}, - {file = "coverage-7.5.4-pp38.pp39.pp310-none-any.whl", hash = "sha256:79b356f3dd5b26f3ad23b35c75dbdaf1f9e2450b6bcefc6d0825ea0aa3f86ca5"}, - {file = "coverage-7.5.4.tar.gz", hash = "sha256:a44963520b069e12789d0faea4e9fdb1e410cdc4aab89d94f7f55cbb7fef0353"}, + {file = "coverage-7.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dff044f661f59dace805eedb4a7404c573b6ff0cdba4a524141bc63d7be5c7fd"}, + {file = "coverage-7.6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a8659fd33ee9e6ca03950cfdcdf271d645cf681609153f218826dd9805ab585c"}, + {file = "coverage-7.6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7792f0ab20df8071d669d929c75c97fecfa6bcab82c10ee4adb91c7a54055463"}, + {file = "coverage-7.6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4b3cd1ca7cd73d229487fa5caca9e4bc1f0bca96526b922d61053ea751fe791"}, + {file = "coverage-7.6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7e128f85c0b419907d1f38e616c4f1e9f1d1b37a7949f44df9a73d5da5cd53c"}, + {file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a94925102c89247530ae1dab7dc02c690942566f22e189cbd53579b0693c0783"}, + {file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dcd070b5b585b50e6617e8972f3fbbee786afca71b1936ac06257f7e178f00f6"}, + {file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d50a252b23b9b4dfeefc1f663c568a221092cbaded20a05a11665d0dbec9b8fb"}, + {file = "coverage-7.6.0-cp310-cp310-win32.whl", hash = "sha256:0e7b27d04131c46e6894f23a4ae186a6a2207209a05df5b6ad4caee6d54a222c"}, + {file = "coverage-7.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:54dece71673b3187c86226c3ca793c5f891f9fc3d8aa183f2e3653da18566169"}, + {file = "coverage-7.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7b525ab52ce18c57ae232ba6f7010297a87ced82a2383b1afd238849c1ff933"}, + {file = "coverage-7.6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bea27c4269234e06f621f3fac3925f56ff34bc14521484b8f66a580aacc2e7d"}, + {file = "coverage-7.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed8d1d1821ba5fc88d4a4f45387b65de52382fa3ef1f0115a4f7a20cdfab0e94"}, + {file = "coverage-7.6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01c322ef2bbe15057bc4bf132b525b7e3f7206f071799eb8aa6ad1940bcf5fb1"}, + {file = "coverage-7.6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03cafe82c1b32b770a29fd6de923625ccac3185a54a5e66606da26d105f37dac"}, + {file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0d1b923fc4a40c5832be4f35a5dab0e5ff89cddf83bb4174499e02ea089daf57"}, + {file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4b03741e70fb811d1a9a1d75355cf391f274ed85847f4b78e35459899f57af4d"}, + {file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a73d18625f6a8a1cbb11eadc1d03929f9510f4131879288e3f7922097a429f63"}, + {file = "coverage-7.6.0-cp311-cp311-win32.whl", hash = "sha256:65fa405b837060db569a61ec368b74688f429b32fa47a8929a7a2f9b47183713"}, + {file = "coverage-7.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:6379688fb4cfa921ae349c76eb1a9ab26b65f32b03d46bb0eed841fd4cb6afb1"}, + {file = "coverage-7.6.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f7db0b6ae1f96ae41afe626095149ecd1b212b424626175a6633c2999eaad45b"}, + {file = "coverage-7.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bbdf9a72403110a3bdae77948b8011f644571311c2fb35ee15f0f10a8fc082e8"}, + {file = "coverage-7.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cc44bf0315268e253bf563f3560e6c004efe38f76db03a1558274a6e04bf5d5"}, + {file = "coverage-7.6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da8549d17489cd52f85a9829d0e1d91059359b3c54a26f28bec2c5d369524807"}, + {file = "coverage-7.6.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0086cd4fc71b7d485ac93ca4239c8f75732c2ae3ba83f6be1c9be59d9e2c6382"}, + {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1fad32ee9b27350687035cb5fdf9145bc9cf0a094a9577d43e909948ebcfa27b"}, + {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:044a0985a4f25b335882b0966625270a8d9db3d3409ddc49a4eb00b0ef5e8cee"}, + {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:76d5f82213aa78098b9b964ea89de4617e70e0d43e97900c2778a50856dac605"}, + {file = "coverage-7.6.0-cp312-cp312-win32.whl", hash = "sha256:3c59105f8d58ce500f348c5b56163a4113a440dad6daa2294b5052a10db866da"}, + {file = "coverage-7.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:ca5d79cfdae420a1d52bf177de4bc2289c321d6c961ae321503b2ca59c17ae67"}, + {file = "coverage-7.6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d39bd10f0ae453554798b125d2f39884290c480f56e8a02ba7a6ed552005243b"}, + {file = "coverage-7.6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:beb08e8508e53a568811016e59f3234d29c2583f6b6e28572f0954a6b4f7e03d"}, + {file = "coverage-7.6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2e16f4cd2bc4d88ba30ca2d3bbf2f21f00f382cf4e1ce3b1ddc96c634bc48ca"}, + {file = "coverage-7.6.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6616d1c9bf1e3faea78711ee42a8b972367d82ceae233ec0ac61cc7fec09fa6b"}, + {file = "coverage-7.6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad4567d6c334c46046d1c4c20024de2a1c3abc626817ae21ae3da600f5779b44"}, + {file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d17c6a415d68cfe1091d3296ba5749d3d8696e42c37fca5d4860c5bf7b729f03"}, + {file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9146579352d7b5f6412735d0f203bbd8d00113a680b66565e205bc605ef81bc6"}, + {file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:cdab02a0a941af190df8782aafc591ef3ad08824f97850b015c8c6a8b3877b0b"}, + {file = "coverage-7.6.0-cp38-cp38-win32.whl", hash = "sha256:df423f351b162a702c053d5dddc0fc0ef9a9e27ea3f449781ace5f906b664428"}, + {file = "coverage-7.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:f2501d60d7497fd55e391f423f965bbe9e650e9ffc3c627d5f0ac516026000b8"}, + {file = "coverage-7.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7221f9ac9dad9492cecab6f676b3eaf9185141539d5c9689d13fd6b0d7de840c"}, + {file = "coverage-7.6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ddaaa91bfc4477d2871442bbf30a125e8fe6b05da8a0015507bfbf4718228ab2"}, + {file = "coverage-7.6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4cbe651f3904e28f3a55d6f371203049034b4ddbce65a54527a3f189ca3b390"}, + {file = "coverage-7.6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:831b476d79408ab6ccfadaaf199906c833f02fdb32c9ab907b1d4aa0713cfa3b"}, + {file = "coverage-7.6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46c3d091059ad0b9c59d1034de74a7f36dcfa7f6d3bde782c49deb42438f2450"}, + {file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4d5fae0a22dc86259dee66f2cc6c1d3e490c4a1214d7daa2a93d07491c5c04b6"}, + {file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:07ed352205574aad067482e53dd606926afebcb5590653121063fbf4e2175166"}, + {file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:49c76cdfa13015c4560702574bad67f0e15ca5a2872c6a125f6327ead2b731dd"}, + {file = "coverage-7.6.0-cp39-cp39-win32.whl", hash = "sha256:482855914928c8175735a2a59c8dc5806cf7d8f032e4820d52e845d1f731dca2"}, + {file = "coverage-7.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:543ef9179bc55edfd895154a51792b01c017c87af0ebaae092720152e19e42ca"}, + {file = "coverage-7.6.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:6fe885135c8a479d3e37a7aae61cbd3a0fb2deccb4dda3c25f92a49189f766d6"}, + {file = "coverage-7.6.0.tar.gz", hash = "sha256:289cc803fa1dc901f84701ac10c9ee873619320f2f9aff38794db4a4a0268d51"}, ] [package.dependencies] @@ -727,13 +727,13 @@ files = [ [[package]] name = "exceptiongroup" -version = "1.2.1" +version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, - {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, + {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, + {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, ] [package.extras] @@ -801,53 +801,53 @@ pyflakes = ">=3.2.0,<3.3.0" [[package]] name = "fonttools" -version = "4.53.0" +version = "4.53.1" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.53.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:52a6e0a7a0bf611c19bc8ec8f7592bdae79c8296c70eb05917fd831354699b20"}, - {file = "fonttools-4.53.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:099634631b9dd271d4a835d2b2a9e042ccc94ecdf7e2dd9f7f34f7daf333358d"}, - {file = "fonttools-4.53.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e40013572bfb843d6794a3ce076c29ef4efd15937ab833f520117f8eccc84fd6"}, - {file = "fonttools-4.53.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:715b41c3e231f7334cbe79dfc698213dcb7211520ec7a3bc2ba20c8515e8a3b5"}, - {file = "fonttools-4.53.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74ae2441731a05b44d5988d3ac2cf784d3ee0a535dbed257cbfff4be8bb49eb9"}, - {file = "fonttools-4.53.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:95db0c6581a54b47c30860d013977b8a14febc206c8b5ff562f9fe32738a8aca"}, - {file = "fonttools-4.53.0-cp310-cp310-win32.whl", hash = "sha256:9cd7a6beec6495d1dffb1033d50a3f82dfece23e9eb3c20cd3c2444d27514068"}, - {file = "fonttools-4.53.0-cp310-cp310-win_amd64.whl", hash = "sha256:daaef7390e632283051e3cf3e16aff2b68b247e99aea916f64e578c0449c9c68"}, - {file = "fonttools-4.53.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a209d2e624ba492df4f3bfad5996d1f76f03069c6133c60cd04f9a9e715595ec"}, - {file = "fonttools-4.53.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4f520d9ac5b938e6494f58a25c77564beca7d0199ecf726e1bd3d56872c59749"}, - {file = "fonttools-4.53.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eceef49f457253000e6a2d0f7bd08ff4e9fe96ec4ffce2dbcb32e34d9c1b8161"}, - {file = "fonttools-4.53.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa1f3e34373aa16045484b4d9d352d4c6b5f9f77ac77a178252ccbc851e8b2ee"}, - {file = "fonttools-4.53.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:28d072169fe8275fb1a0d35e3233f6df36a7e8474e56cb790a7258ad822b6fd6"}, - {file = "fonttools-4.53.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4a2a6ba400d386e904fd05db81f73bee0008af37799a7586deaa4aef8cd5971e"}, - {file = "fonttools-4.53.0-cp311-cp311-win32.whl", hash = "sha256:bb7273789f69b565d88e97e9e1da602b4ee7ba733caf35a6c2affd4334d4f005"}, - {file = "fonttools-4.53.0-cp311-cp311-win_amd64.whl", hash = "sha256:9fe9096a60113e1d755e9e6bda15ef7e03391ee0554d22829aa506cdf946f796"}, - {file = "fonttools-4.53.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d8f191a17369bd53a5557a5ee4bab91d5330ca3aefcdf17fab9a497b0e7cff7a"}, - {file = "fonttools-4.53.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:93156dd7f90ae0a1b0e8871032a07ef3178f553f0c70c386025a808f3a63b1f4"}, - {file = "fonttools-4.53.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bff98816cb144fb7b85e4b5ba3888a33b56ecef075b0e95b95bcd0a5fbf20f06"}, - {file = "fonttools-4.53.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:973d030180eca8255b1bce6ffc09ef38a05dcec0e8320cc9b7bcaa65346f341d"}, - {file = "fonttools-4.53.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c4ee5a24e281fbd8261c6ab29faa7fd9a87a12e8c0eed485b705236c65999109"}, - {file = "fonttools-4.53.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bd5bc124fae781a4422f61b98d1d7faa47985f663a64770b78f13d2c072410c2"}, - {file = "fonttools-4.53.0-cp312-cp312-win32.whl", hash = "sha256:a239afa1126b6a619130909c8404070e2b473dd2b7fc4aacacd2e763f8597fea"}, - {file = "fonttools-4.53.0-cp312-cp312-win_amd64.whl", hash = "sha256:45b4afb069039f0366a43a5d454bc54eea942bfb66b3fc3e9a2c07ef4d617380"}, - {file = "fonttools-4.53.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:93bc9e5aaa06ff928d751dc6be889ff3e7d2aa393ab873bc7f6396a99f6fbb12"}, - {file = "fonttools-4.53.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2367d47816cc9783a28645bc1dac07f8ffc93e0f015e8c9fc674a5b76a6da6e4"}, - {file = "fonttools-4.53.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:907fa0b662dd8fc1d7c661b90782ce81afb510fc4b7aa6ae7304d6c094b27bce"}, - {file = "fonttools-4.53.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e0ad3c6ea4bd6a289d958a1eb922767233f00982cf0fe42b177657c86c80a8f"}, - {file = "fonttools-4.53.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:73121a9b7ff93ada888aaee3985a88495489cc027894458cb1a736660bdfb206"}, - {file = "fonttools-4.53.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:ee595d7ba9bba130b2bec555a40aafa60c26ce68ed0cf509983e0f12d88674fd"}, - {file = "fonttools-4.53.0-cp38-cp38-win32.whl", hash = "sha256:fca66d9ff2ac89b03f5aa17e0b21a97c21f3491c46b583bb131eb32c7bab33af"}, - {file = "fonttools-4.53.0-cp38-cp38-win_amd64.whl", hash = "sha256:31f0e3147375002aae30696dd1dc596636abbd22fca09d2e730ecde0baad1d6b"}, - {file = "fonttools-4.53.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7d6166192dcd925c78a91d599b48960e0a46fe565391c79fe6de481ac44d20ac"}, - {file = "fonttools-4.53.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef50ec31649fbc3acf6afd261ed89d09eb909b97cc289d80476166df8438524d"}, - {file = "fonttools-4.53.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f193f060391a455920d61684a70017ef5284ccbe6023bb056e15e5ac3de11d1"}, - {file = "fonttools-4.53.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba9f09ff17f947392a855e3455a846f9855f6cf6bec33e9a427d3c1d254c712f"}, - {file = "fonttools-4.53.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0c555e039d268445172b909b1b6bdcba42ada1cf4a60e367d68702e3f87e5f64"}, - {file = "fonttools-4.53.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5a4788036201c908079e89ae3f5399b33bf45b9ea4514913f4dbbe4fac08efe0"}, - {file = "fonttools-4.53.0-cp39-cp39-win32.whl", hash = "sha256:d1a24f51a3305362b94681120c508758a88f207fa0a681c16b5a4172e9e6c7a9"}, - {file = "fonttools-4.53.0-cp39-cp39-win_amd64.whl", hash = "sha256:1e677bfb2b4bd0e5e99e0f7283e65e47a9814b0486cb64a41adf9ef110e078f2"}, - {file = "fonttools-4.53.0-py3-none-any.whl", hash = "sha256:6b4f04b1fbc01a3569d63359f2227c89ab294550de277fd09d8fca6185669fa4"}, - {file = "fonttools-4.53.0.tar.gz", hash = "sha256:c93ed66d32de1559b6fc348838c7572d5c0ac1e4a258e76763a5caddd8944002"}, + {file = "fonttools-4.53.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0679a30b59d74b6242909945429dbddb08496935b82f91ea9bf6ad240ec23397"}, + {file = "fonttools-4.53.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e8bf06b94694251861ba7fdeea15c8ec0967f84c3d4143ae9daf42bbc7717fe3"}, + {file = "fonttools-4.53.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b96cd370a61f4d083c9c0053bf634279b094308d52fdc2dd9a22d8372fdd590d"}, + {file = "fonttools-4.53.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1c7c5aa18dd3b17995898b4a9b5929d69ef6ae2af5b96d585ff4005033d82f0"}, + {file = "fonttools-4.53.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e013aae589c1c12505da64a7d8d023e584987e51e62006e1bb30d72f26522c41"}, + {file = "fonttools-4.53.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9efd176f874cb6402e607e4cc9b4a9cd584d82fc34a4b0c811970b32ba62501f"}, + {file = "fonttools-4.53.1-cp310-cp310-win32.whl", hash = "sha256:c8696544c964500aa9439efb6761947393b70b17ef4e82d73277413f291260a4"}, + {file = "fonttools-4.53.1-cp310-cp310-win_amd64.whl", hash = "sha256:8959a59de5af6d2bec27489e98ef25a397cfa1774b375d5787509c06659b3671"}, + {file = "fonttools-4.53.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:da33440b1413bad53a8674393c5d29ce64d8c1a15ef8a77c642ffd900d07bfe1"}, + {file = "fonttools-4.53.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5ff7e5e9bad94e3a70c5cd2fa27f20b9bb9385e10cddab567b85ce5d306ea923"}, + {file = "fonttools-4.53.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6e7170d675d12eac12ad1a981d90f118c06cf680b42a2d74c6c931e54b50719"}, + {file = "fonttools-4.53.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bee32ea8765e859670c4447b0817514ca79054463b6b79784b08a8df3a4d78e3"}, + {file = "fonttools-4.53.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6e08f572625a1ee682115223eabebc4c6a2035a6917eac6f60350aba297ccadb"}, + {file = "fonttools-4.53.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b21952c092ffd827504de7e66b62aba26fdb5f9d1e435c52477e6486e9d128b2"}, + {file = "fonttools-4.53.1-cp311-cp311-win32.whl", hash = "sha256:9dfdae43b7996af46ff9da520998a32b105c7f098aeea06b2226b30e74fbba88"}, + {file = "fonttools-4.53.1-cp311-cp311-win_amd64.whl", hash = "sha256:d4d0096cb1ac7a77b3b41cd78c9b6bc4a400550e21dc7a92f2b5ab53ed74eb02"}, + {file = "fonttools-4.53.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d92d3c2a1b39631a6131c2fa25b5406855f97969b068e7e08413325bc0afba58"}, + {file = "fonttools-4.53.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3b3c8ebafbee8d9002bd8f1195d09ed2bd9ff134ddec37ee8f6a6375e6a4f0e8"}, + {file = "fonttools-4.53.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32f029c095ad66c425b0ee85553d0dc326d45d7059dbc227330fc29b43e8ba60"}, + {file = "fonttools-4.53.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10f5e6c3510b79ea27bb1ebfcc67048cde9ec67afa87c7dd7efa5c700491ac7f"}, + {file = "fonttools-4.53.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f677ce218976496a587ab17140da141557beb91d2a5c1a14212c994093f2eae2"}, + {file = "fonttools-4.53.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9e6ceba2a01b448e36754983d376064730690401da1dd104ddb543519470a15f"}, + {file = "fonttools-4.53.1-cp312-cp312-win32.whl", hash = "sha256:791b31ebbc05197d7aa096bbc7bd76d591f05905d2fd908bf103af4488e60670"}, + {file = "fonttools-4.53.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ed170b5e17da0264b9f6fae86073be3db15fa1bd74061c8331022bca6d09bab"}, + {file = "fonttools-4.53.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c818c058404eb2bba05e728d38049438afd649e3c409796723dfc17cd3f08749"}, + {file = "fonttools-4.53.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:651390c3b26b0c7d1f4407cad281ee7a5a85a31a110cbac5269de72a51551ba2"}, + {file = "fonttools-4.53.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e54f1bba2f655924c1138bbc7fa91abd61f45c68bd65ab5ed985942712864bbb"}, + {file = "fonttools-4.53.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9cd19cf4fe0595ebdd1d4915882b9440c3a6d30b008f3cc7587c1da7b95be5f"}, + {file = "fonttools-4.53.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2af40ae9cdcb204fc1d8f26b190aa16534fcd4f0df756268df674a270eab575d"}, + {file = "fonttools-4.53.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:35250099b0cfb32d799fb5d6c651220a642fe2e3c7d2560490e6f1d3f9ae9169"}, + {file = "fonttools-4.53.1-cp38-cp38-win32.whl", hash = "sha256:f08df60fbd8d289152079a65da4e66a447efc1d5d5a4d3f299cdd39e3b2e4a7d"}, + {file = "fonttools-4.53.1-cp38-cp38-win_amd64.whl", hash = "sha256:7b6b35e52ddc8fb0db562133894e6ef5b4e54e1283dff606fda3eed938c36fc8"}, + {file = "fonttools-4.53.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75a157d8d26c06e64ace9df037ee93a4938a4606a38cb7ffaf6635e60e253b7a"}, + {file = "fonttools-4.53.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4824c198f714ab5559c5be10fd1adf876712aa7989882a4ec887bf1ef3e00e31"}, + {file = "fonttools-4.53.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:becc5d7cb89c7b7afa8321b6bb3dbee0eec2b57855c90b3e9bf5fb816671fa7c"}, + {file = "fonttools-4.53.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84ec3fb43befb54be490147b4a922b5314e16372a643004f182babee9f9c3407"}, + {file = "fonttools-4.53.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:73379d3ffdeecb376640cd8ed03e9d2d0e568c9d1a4e9b16504a834ebadc2dfb"}, + {file = "fonttools-4.53.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:02569e9a810f9d11f4ae82c391ebc6fb5730d95a0657d24d754ed7763fb2d122"}, + {file = "fonttools-4.53.1-cp39-cp39-win32.whl", hash = "sha256:aae7bd54187e8bf7fd69f8ab87b2885253d3575163ad4d669a262fe97f0136cb"}, + {file = "fonttools-4.53.1-cp39-cp39-win_amd64.whl", hash = "sha256:e5b708073ea3d684235648786f5f6153a48dc8762cdfe5563c57e80787c29fbb"}, + {file = "fonttools-4.53.1-py3-none-any.whl", hash = "sha256:f1f8758a2ad110bd6432203a344269f445a2907dc24ef6bccfd0ac4e14e0d71d"}, + {file = "fonttools-4.53.1.tar.gz", hash = "sha256:e128778a8e9bc11159ce5447f76766cefbd876f44bd79aff030287254e4752c4"}, ] [package.extras] @@ -952,13 +952,13 @@ files = [ [[package]] name = "fsspec" -version = "2024.6.0" +version = "2024.6.1" description = "File-system specification" optional = false python-versions = ">=3.8" files = [ - {file = "fsspec-2024.6.0-py3-none-any.whl", hash = "sha256:58d7122eb8a1a46f7f13453187bfea4972d66bf01618d37366521b1998034cee"}, - {file = "fsspec-2024.6.0.tar.gz", hash = "sha256:f579960a56e6d8038a9efc8f9c77279ec12e6299aa86b0769a7e9c46b94527c2"}, + {file = "fsspec-2024.6.1-py3-none-any.whl", hash = "sha256:3cb443f8bcd2efb31295a5b9fdb02aee81d8452c80d28f97a6d0959e6cee101e"}, + {file = "fsspec-2024.6.1.tar.gz", hash = "sha256:fad7d7e209dd4c1208e3bbfda706620e0da5142bebbd9c384afb95b07e798e49"}, ] [package.dependencies] @@ -1026,86 +1026,86 @@ test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", [[package]] name = "grpcio" -version = "1.64.1" +version = "1.65.1" description = "HTTP/2-based RPC framework" optional = false python-versions = ">=3.8" files = [ - {file = "grpcio-1.64.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:55697ecec192bc3f2f3cc13a295ab670f51de29884ca9ae6cd6247df55df2502"}, - {file = "grpcio-1.64.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:3b64ae304c175671efdaa7ec9ae2cc36996b681eb63ca39c464958396697daff"}, - {file = "grpcio-1.64.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:bac71b4b28bc9af61efcdc7630b166440bbfbaa80940c9a697271b5e1dabbc61"}, - {file = "grpcio-1.64.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c024ffc22d6dc59000faf8ad781696d81e8e38f4078cb0f2630b4a3cf231a90"}, - {file = "grpcio-1.64.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7cd5c1325f6808b8ae31657d281aadb2a51ac11ab081ae335f4f7fc44c1721d"}, - {file = "grpcio-1.64.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0a2813093ddb27418a4c99f9b1c223fab0b053157176a64cc9db0f4557b69bd9"}, - {file = "grpcio-1.64.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2981c7365a9353f9b5c864595c510c983251b1ab403e05b1ccc70a3d9541a73b"}, - {file = "grpcio-1.64.1-cp310-cp310-win32.whl", hash = "sha256:1262402af5a511c245c3ae918167eca57342c72320dffae5d9b51840c4b2f86d"}, - {file = "grpcio-1.64.1-cp310-cp310-win_amd64.whl", hash = "sha256:19264fc964576ddb065368cae953f8d0514ecc6cb3da8903766d9fb9d4554c33"}, - {file = "grpcio-1.64.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:58b1041e7c870bb30ee41d3090cbd6f0851f30ae4eb68228955d973d3efa2e61"}, - {file = "grpcio-1.64.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bbc5b1d78a7822b0a84c6f8917faa986c1a744e65d762ef6d8be9d75677af2ca"}, - {file = "grpcio-1.64.1-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:5841dd1f284bd1b3d8a6eca3a7f062b06f1eec09b184397e1d1d43447e89a7ae"}, - {file = "grpcio-1.64.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8caee47e970b92b3dd948371230fcceb80d3f2277b3bf7fbd7c0564e7d39068e"}, - {file = "grpcio-1.64.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73819689c169417a4f978e562d24f2def2be75739c4bed1992435d007819da1b"}, - {file = "grpcio-1.64.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6503b64c8b2dfad299749cad1b595c650c91e5b2c8a1b775380fcf8d2cbba1e9"}, - {file = "grpcio-1.64.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1de403fc1305fd96cfa75e83be3dee8538f2413a6b1685b8452301c7ba33c294"}, - {file = "grpcio-1.64.1-cp311-cp311-win32.whl", hash = "sha256:d4d29cc612e1332237877dfa7fe687157973aab1d63bd0f84cf06692f04c0367"}, - {file = "grpcio-1.64.1-cp311-cp311-win_amd64.whl", hash = "sha256:5e56462b05a6f860b72f0fa50dca06d5b26543a4e88d0396259a07dc30f4e5aa"}, - {file = "grpcio-1.64.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:4657d24c8063e6095f850b68f2d1ba3b39f2b287a38242dcabc166453e950c59"}, - {file = "grpcio-1.64.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:62b4e6eb7bf901719fce0ca83e3ed474ae5022bb3827b0a501e056458c51c0a1"}, - {file = "grpcio-1.64.1-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:ee73a2f5ca4ba44fa33b4d7d2c71e2c8a9e9f78d53f6507ad68e7d2ad5f64a22"}, - {file = "grpcio-1.64.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:198908f9b22e2672a998870355e226a725aeab327ac4e6ff3a1399792ece4762"}, - {file = "grpcio-1.64.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39b9d0acaa8d835a6566c640f48b50054f422d03e77e49716d4c4e8e279665a1"}, - {file = "grpcio-1.64.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:5e42634a989c3aa6049f132266faf6b949ec2a6f7d302dbb5c15395b77d757eb"}, - {file = "grpcio-1.64.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b1a82e0b9b3022799c336e1fc0f6210adc019ae84efb7321d668129d28ee1efb"}, - {file = "grpcio-1.64.1-cp312-cp312-win32.whl", hash = "sha256:55260032b95c49bee69a423c2f5365baa9369d2f7d233e933564d8a47b893027"}, - {file = "grpcio-1.64.1-cp312-cp312-win_amd64.whl", hash = "sha256:c1a786ac592b47573a5bb7e35665c08064a5d77ab88a076eec11f8ae86b3e3f6"}, - {file = "grpcio-1.64.1-cp38-cp38-linux_armv7l.whl", hash = "sha256:a011ac6c03cfe162ff2b727bcb530567826cec85eb8d4ad2bfb4bd023287a52d"}, - {file = "grpcio-1.64.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4d6dab6124225496010bd22690f2d9bd35c7cbb267b3f14e7a3eb05c911325d4"}, - {file = "grpcio-1.64.1-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:a5e771d0252e871ce194d0fdcafd13971f1aae0ddacc5f25615030d5df55c3a2"}, - {file = "grpcio-1.64.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2c3c1b90ab93fed424e454e93c0ed0b9d552bdf1b0929712b094f5ecfe7a23ad"}, - {file = "grpcio-1.64.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20405cb8b13fd779135df23fabadc53b86522d0f1cba8cca0e87968587f50650"}, - {file = "grpcio-1.64.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0cc79c982ccb2feec8aad0e8fb0d168bcbca85bc77b080d0d3c5f2f15c24ea8f"}, - {file = "grpcio-1.64.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a3a035c37ce7565b8f4f35ff683a4db34d24e53dc487e47438e434eb3f701b2a"}, - {file = "grpcio-1.64.1-cp38-cp38-win32.whl", hash = "sha256:1257b76748612aca0f89beec7fa0615727fd6f2a1ad580a9638816a4b2eb18fd"}, - {file = "grpcio-1.64.1-cp38-cp38-win_amd64.whl", hash = "sha256:0a12ddb1678ebc6a84ec6b0487feac020ee2b1659cbe69b80f06dbffdb249122"}, - {file = "grpcio-1.64.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:75dbbf415026d2862192fe1b28d71f209e2fd87079d98470db90bebe57b33179"}, - {file = "grpcio-1.64.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e3d9f8d1221baa0ced7ec7322a981e28deb23749c76eeeb3d33e18b72935ab62"}, - {file = "grpcio-1.64.1-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:5f8b75f64d5d324c565b263c67dbe4f0af595635bbdd93bb1a88189fc62ed2e5"}, - {file = "grpcio-1.64.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c84ad903d0d94311a2b7eea608da163dace97c5fe9412ea311e72c3684925602"}, - {file = "grpcio-1.64.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:940e3ec884520155f68a3b712d045e077d61c520a195d1a5932c531f11883489"}, - {file = "grpcio-1.64.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f10193c69fc9d3d726e83bbf0f3d316f1847c3071c8c93d8090cf5f326b14309"}, - {file = "grpcio-1.64.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ac15b6c2c80a4d1338b04d42a02d376a53395ddf0ec9ab157cbaf44191f3ffdd"}, - {file = "grpcio-1.64.1-cp39-cp39-win32.whl", hash = "sha256:03b43d0ccf99c557ec671c7dede64f023c7da9bb632ac65dbc57f166e4970040"}, - {file = "grpcio-1.64.1-cp39-cp39-win_amd64.whl", hash = "sha256:ed6091fa0adcc7e4ff944090cf203a52da35c37a130efa564ded02b7aff63bcd"}, - {file = "grpcio-1.64.1.tar.gz", hash = "sha256:8d51dd1c59d5fa0f34266b80a3805ec29a1f26425c2a54736133f6d87fc4968a"}, + {file = "grpcio-1.65.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:3dc5f928815b8972fb83b78d8db5039559f39e004ec93ebac316403fe031a062"}, + {file = "grpcio-1.65.1-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:8333ca46053c35484c9f2f7e8d8ec98c1383a8675a449163cea31a2076d93de8"}, + {file = "grpcio-1.65.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:7af64838b6e615fff0ec711960ed9b6ee83086edfa8c32670eafb736f169d719"}, + {file = "grpcio-1.65.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbb64b4166362d9326f7efbf75b1c72106c1aa87f13a8c8b56a1224fac152f5c"}, + {file = "grpcio-1.65.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8422dc13ad93ec8caa2612b5032a2b9cd6421c13ed87f54db4a3a2c93afaf77"}, + {file = "grpcio-1.65.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:4effc0562b6c65d4add6a873ca132e46ba5e5a46f07c93502c37a9ae7f043857"}, + {file = "grpcio-1.65.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a6c71575a2fedf259724981fd73a18906513d2f306169c46262a5bae956e6364"}, + {file = "grpcio-1.65.1-cp310-cp310-win32.whl", hash = "sha256:34966cf526ef0ea616e008d40d989463e3db157abb213b2f20c6ce0ae7928875"}, + {file = "grpcio-1.65.1-cp310-cp310-win_amd64.whl", hash = "sha256:ca931de5dd6d9eb94ff19a2c9434b23923bce6f767179fef04dfa991f282eaad"}, + {file = "grpcio-1.65.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:bbb46330cc643ecf10bd9bd4ca8e7419a14b6b9dedd05f671c90fb2c813c6037"}, + {file = "grpcio-1.65.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d827a6fb9215b961eb73459ad7977edb9e748b23e3407d21c845d1d8ef6597e5"}, + {file = "grpcio-1.65.1-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:6e71aed8835f8d9fbcb84babc93a9da95955d1685021cceb7089f4f1e717d719"}, + {file = "grpcio-1.65.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a1c84560b3b2d34695c9ba53ab0264e2802721c530678a8f0a227951f453462"}, + {file = "grpcio-1.65.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:27adee2338d697e71143ed147fe286c05810965d5d30ec14dd09c22479bfe48a"}, + {file = "grpcio-1.65.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f62652ddcadc75d0e7aa629e96bb61658f85a993e748333715b4ab667192e4e8"}, + {file = "grpcio-1.65.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:71a05fd814700dd9cb7d9a507f2f6a1ef85866733ccaf557eedacec32d65e4c2"}, + {file = "grpcio-1.65.1-cp311-cp311-win32.whl", hash = "sha256:b590f1ad056294dfaeac0b7e1b71d3d5ace638d8dd1f1147ce4bd13458783ba8"}, + {file = "grpcio-1.65.1-cp311-cp311-win_amd64.whl", hash = "sha256:12e9bdf3b5fd48e5fbe5b3da382ad8f97c08b47969f3cca81dd9b36b86ed39e2"}, + {file = "grpcio-1.65.1-cp312-cp312-linux_armv7l.whl", hash = "sha256:54cb822e177374b318b233e54b6856c692c24cdbd5a3ba5335f18a47396bac8f"}, + {file = "grpcio-1.65.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:aaf3c54419a28d45bd1681372029f40e5bfb58e5265e3882eaf21e4a5f81a119"}, + {file = "grpcio-1.65.1-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:557de35bdfbe8bafea0a003dbd0f4da6d89223ac6c4c7549d78e20f92ead95d9"}, + {file = "grpcio-1.65.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8bfd95ef3b097f0cc86ade54eafefa1c8ed623aa01a26fbbdcd1a3650494dd11"}, + {file = "grpcio-1.65.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e6a8f3d6c41e6b642870afe6cafbaf7b61c57317f9ec66d0efdaf19db992b90"}, + {file = "grpcio-1.65.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1faaf7355ceed07ceaef0b9dcefa4c98daf1dd8840ed75c2de128c3f4a4d859d"}, + {file = "grpcio-1.65.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:60f1f38eed830488ad2a1b11579ef0f345ff16fffdad1d24d9fbc97ba31804ff"}, + {file = "grpcio-1.65.1-cp312-cp312-win32.whl", hash = "sha256:e75acfa52daf5ea0712e8aa82f0003bba964de7ae22c26d208cbd7bc08500177"}, + {file = "grpcio-1.65.1-cp312-cp312-win_amd64.whl", hash = "sha256:ff5a84907e51924973aa05ed8759210d8cdae7ffcf9e44fd17646cf4a902df59"}, + {file = "grpcio-1.65.1-cp38-cp38-linux_armv7l.whl", hash = "sha256:1fbd6331f18c3acd7e09d17fd840c096f56eaf0ef830fbd50af45ae9dc8dfd83"}, + {file = "grpcio-1.65.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:de5b6be29116e094c5ef9d9e4252e7eb143e3d5f6bd6d50a78075553ab4930b0"}, + {file = "grpcio-1.65.1-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:e4a3cdba62b2d6aeae6027ae65f350de6dc082b72e6215eccf82628e79efe9ba"}, + {file = "grpcio-1.65.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:941c4869aa229d88706b78187d60d66aca77fe5c32518b79e3c3e03fc26109a2"}, + {file = "grpcio-1.65.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f40cebe5edb518d78b8131e87cb83b3ee688984de38a232024b9b44e74ee53d3"}, + {file = "grpcio-1.65.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2ca684ba331fb249d8a1ce88db5394e70dbcd96e58d8c4b7e0d7b141a453dce9"}, + {file = "grpcio-1.65.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8558f0083ddaf5de64a59c790bffd7568e353914c0c551eae2955f54ee4b857f"}, + {file = "grpcio-1.65.1-cp38-cp38-win32.whl", hash = "sha256:8d8143a3e3966f85dce6c5cc45387ec36552174ba5712c5dc6fcc0898fb324c0"}, + {file = "grpcio-1.65.1-cp38-cp38-win_amd64.whl", hash = "sha256:76e81a86424d6ca1ce7c16b15bdd6a964a42b40544bf796a48da241fdaf61153"}, + {file = "grpcio-1.65.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:cb5175f45c980ff418998723ea1b3869cce3766d2ab4e4916fbd3cedbc9d0ed3"}, + {file = "grpcio-1.65.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b12c1aa7b95abe73b3e04e052c8b362655b41c7798da69f1eaf8d186c7d204df"}, + {file = "grpcio-1.65.1-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:3019fb50128b21a5e018d89569ffaaaa361680e1346c2f261bb84a91082eb3d3"}, + {file = "grpcio-1.65.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ae15275ed98ea267f64ee9ddedf8ecd5306a5b5bb87972a48bfe24af24153e8"}, + {file = "grpcio-1.65.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f096ffb881f37e8d4f958b63c74bfc400c7cebd7a944b027357cd2fb8d91a57"}, + {file = "grpcio-1.65.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2f56b5a68fdcf17a0a1d524bf177218c3c69b3947cb239ea222c6f1867c3ab68"}, + {file = "grpcio-1.65.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:941596d419b9736ab548aa0feb5bbba922f98872668847bf0720b42d1d227b9e"}, + {file = "grpcio-1.65.1-cp39-cp39-win32.whl", hash = "sha256:5fd7337a823b890215f07d429f4f193d24b80d62a5485cf88ee06648591a0c57"}, + {file = "grpcio-1.65.1-cp39-cp39-win_amd64.whl", hash = "sha256:1bceeec568372cbebf554eae1b436b06c2ff24cfaf04afade729fb9035408c6c"}, + {file = "grpcio-1.65.1.tar.gz", hash = "sha256:3c492301988cd720cd145d84e17318d45af342e29ef93141228f9cd73222368b"}, ] [package.extras] -protobuf = ["grpcio-tools (>=1.64.1)"] +protobuf = ["grpcio-tools (>=1.65.1)"] [[package]] name = "healpy" -version = "1.17.1" +version = "1.17.3" description = "Healpix tools package for Python" optional = false python-versions = ">=3.9" files = [ - {file = "healpy-1.17.1-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:19a5eea85f348896eb58e572ce25845cc0dc40661508b6b4b6e8fb4f34d50d74"}, - {file = "healpy-1.17.1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:e06abb17b17e2ce586de37b0327dccd334d60802a4e20d7b67f349e248e6fd0f"}, - {file = "healpy-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:574c714c17a23ae21668df4587b63f25d977436be685df51a1d11be217079ee9"}, - {file = "healpy-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610fe0255a5dd72108ad9778f0ca90422ebfa34ace098cace93b470186c9f6cc"}, - {file = "healpy-1.17.1-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:63fbd4dbdac0d869aacb65d952ce0415c20393107fbe3ded18f682ba6b5e4a51"}, - {file = "healpy-1.17.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:50b17c796fa90679d9618d6cbeb048ad4c82f226d97b0575f6f62c2ef7f8a788"}, - {file = "healpy-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80dee19bec6029df43ab606c4caefae945f787edc8a9e551a3189d437c0b52ba"}, - {file = "healpy-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b05ba7ae36708371cce9b01934d86d22d17b0a81898b7b7c83e6f99b64933b62"}, - {file = "healpy-1.17.1-cp312-cp312-macosx_11_0_x86_64.whl", hash = "sha256:8a9db38eca26764b671156529edd6a19f9b5d5c9ed3f2bf190c8b1b93575a4ef"}, - {file = "healpy-1.17.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:c66f35a77def27cfc444f1f9a36521c0a954a88eba7d11bec8c10616e0bb4a5b"}, - {file = "healpy-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:378e36660d3df4ef5c85c1b0d782d5993c86daefafe0a1e4594e7f7a71792583"}, - {file = "healpy-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f5ea378e683f877f70870744abfbeb900d20e43ba024074763e3999d4db5402"}, - {file = "healpy-1.17.1-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:26fc9a22939c04b09bdda3a9e72fb6969dd8e446b420ea7947b7e146d4c6c075"}, - {file = "healpy-1.17.1-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:36e4699ed00aaec7dad9d22d8de635900e4a7b1bb4e6ce2dc9c0cb3ef47e6ec1"}, - {file = "healpy-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f521714cf325bc2886c95a7cd9e6a81d4e4583c6d478b0ffbe8d08d4da7d7954"}, - {file = "healpy-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f18548572b6a702e57071b70cc9818fe7ed74edaccbab5987ff55c6e9fd9b3a"}, - {file = "healpy-1.17.1.tar.gz", hash = "sha256:6469fc9669e4cc6068c1509ba67228f215db57b3c2d6f00bd1eb481d97732e88"}, + {file = "healpy-1.17.3-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:13ed8e7f3204e37139d0f4fbb1d9b7d4dd73564a3972770567ee50a1fa8c0fec"}, + {file = "healpy-1.17.3-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:f5cfddd9891ab586fde558462c3b2e998c5d0d8ffe1bcbfb127a89265a119385"}, + {file = "healpy-1.17.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd908103b524734c5beb01741714accb9f61a567563abf1c76c99e611c286756"}, + {file = "healpy-1.17.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9792a37410605dd746508bc9cb8b3b1421d789fcb3e79cd9e3249aee8ff22920"}, + {file = "healpy-1.17.3-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:b1d942184d54e1422c19fd1ea8c35eaea6cdef8c678e3bd287f5322f600db466"}, + {file = "healpy-1.17.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:1d8c60405fde26362ed10eba474fd4c9c075d819c5574fd7f99cda2f827711d5"}, + {file = "healpy-1.17.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4669267121a170792416e4310b3d6f9d9819059ecd4be61b4adc443911adc57e"}, + {file = "healpy-1.17.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f27a8f897a15279a5f240bb17f24d784a69a28f0830ed00fffee5070c5aadec"}, + {file = "healpy-1.17.3-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:465e8627ffafeefff94e7705614f3fbb0c517dd4f04d33aa15bfe704c0e9352e"}, + {file = "healpy-1.17.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:7ae3632a05c588a76bcac187a8e7cbb065c4d4051af47875a0e162cd28ca2243"}, + {file = "healpy-1.17.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39577afa822c03d321211373eb18116711796762f2288ff399df8c139a7f53dc"}, + {file = "healpy-1.17.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4afac0cb7f6bebbf821fbe0dc17da5ab8dffdb60bdee9b04451b30c06d94ddd3"}, + {file = "healpy-1.17.3-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:77d5cd25e6d01cada2c8e61f1a35307ff66bbd1b0620304bdeae0c606ca0e21f"}, + {file = "healpy-1.17.3-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:5a50e3db968ac5168669cd4bd8b1b8e2db34031483f731e687c6c3e55c31a294"}, + {file = "healpy-1.17.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc12ed80c985c909272736e959a4d98c8d0b7bfbe7f34accb0c00658da1d0d59"}, + {file = "healpy-1.17.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea016d3ffa69396ec145ec0f630fd2f34f659b0fe5d33d17666bc9b57c043237"}, + {file = "healpy-1.17.3.tar.gz", hash = "sha256:4b9f6ae44c6a5a2922b6542b2086d53cc3a6b51543d856d18406fb984edbec5f"}, ] [package.dependencies] @@ -1172,13 +1172,13 @@ files = [ [[package]] name = "importlib-metadata" -version = "8.0.0" +version = "8.1.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-8.0.0-py3-none-any.whl", hash = "sha256:15584cf2b1bf449d98ff8a6ff1abef57bf20f3ac6454f431736cd3e660921b2f"}, - {file = "importlib_metadata-8.0.0.tar.gz", hash = "sha256:188bd24e4c346d3f0a933f275c2fec67050326a856b9a359881d7c2a697e8812"}, + {file = "importlib_metadata-8.1.0-py3-none-any.whl", hash = "sha256:3cd29f739ed65973840b068e3132135ce954c254d48b5b640484467ef7ab3c8c"}, + {file = "importlib_metadata-8.1.0.tar.gz", hash = "sha256:fcdcb1d5ead7bdf3dd32657bb94ebe9d2aabfe89a19782ddc32da5041d6ebfb4"}, ] [package.dependencies] @@ -1234,13 +1234,13 @@ files = [ [[package]] name = "ipykernel" -version = "6.29.4" +version = "6.29.5" description = "IPython Kernel for Jupyter" optional = false python-versions = ">=3.8" files = [ - {file = "ipykernel-6.29.4-py3-none-any.whl", hash = "sha256:1181e653d95c6808039c509ef8e67c4126b3b3af7781496c7cbfb5ed938a27da"}, - {file = "ipykernel-6.29.4.tar.gz", hash = "sha256:3d44070060f9475ac2092b760123fadf105d2e2493c24848b6691a7c4f42af5c"}, + {file = "ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5"}, + {file = "ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215"}, ] [package.dependencies] @@ -1351,13 +1351,13 @@ files = [ [[package]] name = "jsonargparse" -version = "4.30.0" +version = "4.32.0" description = "Implement minimal boilerplate CLIs derived from type hints and parse from command line, config files and environment variables." optional = false python-versions = ">=3.7" files = [ - {file = "jsonargparse-4.30.0-py3-none-any.whl", hash = "sha256:1856c76c32bc1c94d323916ec75bb3cec49bbc2072a4e2fe9fe9ba6a7ec2343f"}, - {file = "jsonargparse-4.30.0.tar.gz", hash = "sha256:de3502c5852546c57b9d3dac6fd2a28fe312bc70df3ea877d2435944eebeea46"}, + {file = "jsonargparse-4.32.0-py3-none-any.whl", hash = "sha256:2da92d37be875b91672ce117eecfcd4ed9841fae099d8081d3cf819703d7de1a"}, + {file = "jsonargparse-4.32.0.tar.gz", hash = "sha256:a93f29506e9780b28fc6854c3b3718f4a74d92bf7f0c1f4c34e3047cd5d8be42"}, ] [package.dependencies] @@ -1370,7 +1370,7 @@ typing-extensions = {version = ">=3.10.0.0", optional = true, markers = "python_ all = ["jsonargparse[fsspec]", "jsonargparse[jsonnet]", "jsonargparse[jsonschema]", "jsonargparse[omegaconf]", "jsonargparse[reconplogger]", "jsonargparse[ruyaml]", "jsonargparse[signatures]", "jsonargparse[typing-extensions]", "jsonargparse[urls]"] argcomplete = ["argcomplete (>=2.0.0)", "argcomplete (>=3.3.0)"] coverage = ["jsonargparse[test-no-urls]", "pytest-cov (>=4.0.0)"] -dev = ["build (>=0.10.0)", "jsonargparse[coverage]", "jsonargparse[doc]", "jsonargparse[mypy]", "jsonargparse[test]", "pre-commit (>=2.19.0)", "tox (>=3.25.0)"] +dev = ["build (>=0.10.0)", "jsonargparse[coverage]", "jsonargparse[doc]", "jsonargparse[test]", "pre-commit (>=2.19.0)", "tox (>=3.25.0)"] doc = ["Sphinx (>=1.7.9)", "autodocsumm (>=0.1.10)", "sphinx-autodoc-typehints (>=1.19.5)", "sphinx-rtd-theme (>=1.2.2)"] fsspec = ["fsspec (>=0.8.4)"] jsonnet = ["jsonnet (>=0.13.0)", "jsonnet-binary (>=0.17.0)"] @@ -1388,13 +1388,13 @@ urls = ["requests (>=2.18.4)"] [[package]] name = "jsonschema" -version = "4.22.0" +version = "4.23.0" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.8" files = [ - {file = "jsonschema-4.22.0-py3-none-any.whl", hash = "sha256:ff4cfd6b1367a40e7bc6411caec72effadd3db0bbe5017de188f2d6108335802"}, - {file = "jsonschema-4.22.0.tar.gz", hash = "sha256:5b22d434a45935119af990552c862e5d6d564e8f6601206b305a61fdf661a2b7"}, + {file = "jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"}, + {file = "jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4"}, ] [package.dependencies] @@ -1405,7 +1405,7 @@ rpds-py = ">=0.7.1" [package.extras] format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] -format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=24.6.0)"] [[package]] name = "jsonschema-specifications" @@ -1466,13 +1466,13 @@ test = ["ipykernel", "pre-commit", "pytest (<8)", "pytest-cov", "pytest-timeout" [[package]] name = "jupytext" -version = "1.16.2" +version = "1.16.3" description = "Jupyter notebooks as Markdown documents, Julia, Python or R scripts" optional = false python-versions = ">=3.8" files = [ - {file = "jupytext-1.16.2-py3-none-any.whl", hash = "sha256:197a43fef31dca612b68b311e01b8abd54441c7e637810b16b6cb8f2ab66065e"}, - {file = "jupytext-1.16.2.tar.gz", hash = "sha256:8627dd9becbbebd79cc4a4ed4727d89d78e606b4b464eab72357b3b029023a14"}, + {file = "jupytext-1.16.3-py3-none-any.whl", hash = "sha256:870e0d7a716dcb1303df6ad1cec65e3315a20daedd808a55cb3dae2d56e4ed20"}, + {file = "jupytext-1.16.3.tar.gz", hash = "sha256:1ebac990461dd9f477ff7feec9e3003fa1acc89f3c16ba01b73f79fd76f01a98"}, ] [package.dependencies] @@ -1484,11 +1484,11 @@ pyyaml = "*" tomli = {version = "*", markers = "python_version < \"3.11\""} [package.extras] -dev = ["autopep8", "black", "flake8", "gitpython", "ipykernel", "isort", "jupyter-fs (<0.4.0)", "jupyter-server (!=2.11)", "nbconvert", "pre-commit", "pytest", "pytest-cov (>=2.6.1)", "pytest-randomly", "pytest-xdist", "sphinx-gallery (<0.8)"] +dev = ["autopep8", "black", "flake8", "gitpython", "ipykernel", "isort", "jupyter-fs (>=1.0)", "jupyter-server (!=2.11)", "nbconvert", "pre-commit", "pytest", "pytest-cov (>=2.6.1)", "pytest-randomly", "pytest-xdist", "sphinx-gallery (<0.8)"] docs = ["myst-parser", "sphinx", "sphinx-copybutton", "sphinx-rtd-theme"] test = ["pytest", "pytest-randomly", "pytest-xdist"] test-cov = ["ipykernel", "jupyter-server (!=2.11)", "nbconvert", "pytest", "pytest-cov (>=2.6.1)", "pytest-randomly", "pytest-xdist"] -test-external = ["autopep8", "black", "flake8", "gitpython", "ipykernel", "isort", "jupyter-fs (<0.4.0)", "jupyter-server (!=2.11)", "nbconvert", "pre-commit", "pytest", "pytest-randomly", "pytest-xdist", "sphinx-gallery (<0.8)"] +test-external = ["autopep8", "black", "flake8", "gitpython", "ipykernel", "isort", "jupyter-fs (>=1.0)", "jupyter-server (!=2.11)", "nbconvert", "pre-commit", "pytest", "pytest-randomly", "pytest-xdist", "sphinx-gallery (<0.8)"] test-functional = ["pytest", "pytest-randomly", "pytest-xdist"] test-integration = ["ipykernel", "jupyter-server (!=2.11)", "nbconvert", "pytest", "pytest-randomly", "pytest-xdist"] test-ui = ["calysto-bash"] @@ -1627,18 +1627,18 @@ test = ["pytest (>=7.4)", "pytest-cov (>=4.1)"] [[package]] name = "lightning" -version = "2.3.0" +version = "2.3.3" description = "The Deep Learning framework to train, deploy, and ship AI products Lightning fast." optional = false python-versions = ">=3.8" files = [ - {file = "lightning-2.3.0-py3-none-any.whl", hash = "sha256:ed66c2053be1295c8452b996b719badf5a26a0652607c121103dfdd5d2dccfae"}, - {file = "lightning-2.3.0.tar.gz", hash = "sha256:4bb4d6e3650d2d5f544ad60853a22efc4e164aa71b9596d13f0454b29df05130"}, + {file = "lightning-2.3.3-py3-none-any.whl", hash = "sha256:5b4950f20b5117f30aad7820709cfa56669567cf4ded93df502b3dee443a6a5d"}, + {file = "lightning-2.3.3.tar.gz", hash = "sha256:7f454711895c1c6e455766f01fa39522e25e5ab54c15c5e5fbad342fa92bc93c"}, ] [package.dependencies] fsspec = {version = ">=2022.5.0,<2026.0", extras = ["http"]} -lightning-utilities = ">=0.8.0,<2.0" +lightning-utilities = ">=0.10.0,<2.0" numpy = ">=1.17.2,<3.0" packaging = ">=20.0,<25.0" pytorch-lightning = "*" @@ -1649,45 +1649,36 @@ tqdm = ">=4.57.0,<6.0" typing-extensions = ">=4.4.0,<6.0" [package.extras] -all = ["Jinja2 (<4.0)", "PyYAML (<7.0)", "aiohttp (>=3.8.0,<4.0)", "arrow (>=1.2.0,<2.0)", "backoff (>=2.2.1,<3.0)", "beautifulsoup4 (>=4.8.0,<5.0)", "bitsandbytes (>=0.42.0,<1.0)", "click (<9.0)", "croniter (>=1.3.0,<1.5.0)", "dateutils (<1.0)", "deepdiff (>=5.7.0,<7.0)", "deepspeed (>=0.8.2,<=0.9.3)", "docker (>=5.0.0,<7.0)", "fastapi (>=0.92.0,<1.0)", "fsspec[http] (>=2022.5.0,<2024.0)", "hydra-core (>=1.0.5,<2.0)", "inquirer (>=2.10.0,<4.0)", "ipython[all] (<9.0)", "jsonargparse[signatures] (>=4.27.7,<5.0)", "lightning-api-access (>=0.0.3)", "lightning-cloud (==0.5.69)", "lightning-fabric (>=1.9.0)", "lightning-utilities (>=0.8.0,<1.0)", "matplotlib (>3.1,<4.0)", "omegaconf (>=2.0.5,<3.0)", "packaging", "psutil (<6.0)", "pydantic (>=1.7.4)", "python-multipart (>=0.0.5,<1.0)", "pytorch-lightning (>=1.9.0)", "redis (>=4.0.1,<6.0)", "requests (<3.0)", "rich (>=12.3.0,<14.0)", "s3fs (>=2022.5.0,<2024.0)", "starlette", "tensorboardX (>=2.2,<3.0)", "torchmetrics (>=0.10.0,<2.0)", "torchvision (>=0.15.0,<1.0)", "traitlets (>=5.3.0,<6.0)", "typing-extensions (>=4.4.0,<5.0)", "urllib3 (<3.0)", "uvicorn (<1.0)", "websocket-client (<2.0)", "websockets (<12.0)"] -app = ["Jinja2 (<4.0)", "PyYAML (<7.0)", "arrow (>=1.2.0,<2.0)", "backoff (>=2.2.1,<3.0)", "beautifulsoup4 (>=4.8.0,<5.0)", "click (<9.0)", "croniter (>=1.3.0,<1.5.0)", "dateutils (<1.0)", "deepdiff (>=5.7.0,<7.0)", "fastapi (>=0.92.0,<1.0)", "fsspec[http] (>=2022.5.0,<2024.0)", "inquirer (>=2.10.0,<4.0)", "lightning-cloud (==0.5.69)", "lightning-utilities (>=0.8.0,<1.0)", "packaging", "psutil (<6.0)", "pydantic (>=1.7.4)", "python-multipart (>=0.0.5,<1.0)", "requests (<3.0)", "rich (>=12.3.0,<14.0)", "starlette", "traitlets (>=5.3.0,<6.0)", "typing-extensions (>=4.4.0,<5.0)", "urllib3 (<3.0)", "uvicorn (<1.0)", "websocket-client (<2.0)", "websockets (<12.0)"] -app-all = ["Jinja2 (<4.0)", "PyYAML (<7.0)", "aiohttp (>=3.8.0,<4.0)", "arrow (>=1.2.0,<2.0)", "backoff (>=2.2.1,<3.0)", "beautifulsoup4 (>=4.8.0,<5.0)", "click (<9.0)", "croniter (>=1.3.0,<1.5.0)", "dateutils (<1.0)", "deepdiff (>=5.7.0,<7.0)", "docker (>=5.0.0,<7.0)", "fastapi (>=0.92.0,<1.0)", "fsspec[http] (>=2022.5.0,<2024.0)", "inquirer (>=2.10.0,<4.0)", "lightning-api-access (>=0.0.3)", "lightning-cloud (==0.5.69)", "lightning-fabric (>=1.9.0)", "lightning-utilities (>=0.8.0,<1.0)", "packaging", "psutil (<6.0)", "pydantic (>=1.7.4)", "python-multipart (>=0.0.5,<1.0)", "pytorch-lightning (>=1.9.0)", "redis (>=4.0.1,<6.0)", "requests (<3.0)", "rich (>=12.3.0,<14.0)", "s3fs (>=2022.5.0,<2024.0)", "starlette", "traitlets (>=5.3.0,<6.0)", "typing-extensions (>=4.4.0,<5.0)", "urllib3 (<3.0)", "uvicorn (<1.0)", "websocket-client (<2.0)", "websockets (<12.0)"] -app-cloud = ["docker (>=5.0.0,<7.0)", "redis (>=4.0.1,<6.0)", "s3fs (>=2022.5.0,<2024.0)"] -app-components = ["aiohttp (>=3.8.0,<4.0)", "lightning-api-access (>=0.0.3)", "lightning-fabric (>=1.9.0)", "pytorch-lightning (>=1.9.0)"] -app-dev = ["Jinja2 (<4.0)", "PyYAML (<7.0)", "aiohttp (>=3.8.0,<4.0)", "arrow (>=1.2.0,<2.0)", "backoff (>=2.2.1,<3.0)", "beautifulsoup4 (>=4.8.0,<5.0)", "click (<9.0)", "coverage (==7.3.1)", "croniter (>=1.3.0,<1.5.0)", "dateutils (<1.0)", "deepdiff (>=5.7.0,<7.0)", "docker (>=5.0.0,<7.0)", "fastapi (>=0.92.0,<1.0)", "fsspec[http] (>=2022.5.0,<2024.0)", "httpx (==0.25.0)", "inquirer (>=2.10.0,<4.0)", "lightning-api-access (>=0.0.3)", "lightning-cloud (==0.5.69)", "lightning-fabric (>=1.9.0)", "lightning-utilities (>=0.8.0,<1.0)", "packaging", "pandas", "playwright (==1.38.0)", "psutil (<6.0)", "pydantic (>=1.7.4)", "pympler", "pytest (==7.4.0)", "pytest-asyncio (==0.21.1)", "pytest-cov (==4.1.0)", "pytest-doctestplus (==1.0.0)", "pytest-rerunfailures (==12.0)", "pytest-timeout (==2.1.0)", "pytest-xdist (==3.3.1)", "python-multipart (>=0.0.5,<1.0)", "pytorch-lightning (>=1.9.0)", "redis (>=4.0.1,<6.0)", "requests (<3.0)", "requests-mock (==1.11.0)", "rich (>=12.3.0,<14.0)", "s3fs (>=2022.5.0,<2024.0)", "setuptools (<69.0)", "starlette", "traitlets (>=5.3.0,<6.0)", "trio (<0.22.0)", "typing-extensions (>=4.4.0,<5.0)", "urllib3 (<3.0)", "uvicorn (<1.0)", "websocket-client (<2.0)", "websockets (<12.0)"] -app-extra = ["Jinja2 (<4.0)", "PyYAML (<7.0)", "aiohttp (>=3.8.0,<4.0)", "arrow (>=1.2.0,<2.0)", "backoff (>=2.2.1,<3.0)", "beautifulsoup4 (>=4.8.0,<5.0)", "click (<9.0)", "croniter (>=1.3.0,<1.5.0)", "dateutils (<1.0)", "deepdiff (>=5.7.0,<7.0)", "docker (>=5.0.0,<7.0)", "fastapi (>=0.92.0,<1.0)", "fsspec[http] (>=2022.5.0,<2024.0)", "inquirer (>=2.10.0,<4.0)", "lightning-api-access (>=0.0.3)", "lightning-cloud (==0.5.69)", "lightning-fabric (>=1.9.0)", "lightning-utilities (>=0.8.0,<1.0)", "packaging", "psutil (<6.0)", "pydantic (>=1.7.4)", "python-multipart (>=0.0.5,<1.0)", "pytorch-lightning (>=1.9.0)", "redis (>=4.0.1,<6.0)", "requests (<3.0)", "rich (>=12.3.0,<14.0)", "s3fs (>=2022.5.0,<2024.0)", "starlette", "traitlets (>=5.3.0,<6.0)", "typing-extensions (>=4.4.0,<5.0)", "urllib3 (<3.0)", "uvicorn (<1.0)", "websocket-client (<2.0)", "websockets (<12.0)"] -app-test = ["coverage (==7.3.1)", "httpx (==0.25.0)", "pandas", "playwright (==1.38.0)", "psutil (<6.0)", "pympler", "pytest (==7.4.0)", "pytest-asyncio (==0.21.1)", "pytest-cov (==4.1.0)", "pytest-doctestplus (==1.0.0)", "pytest-rerunfailures (==12.0)", "pytest-timeout (==2.1.0)", "pytest-xdist (==3.3.1)", "requests-mock (==1.11.0)", "setuptools (<69.0)", "trio (<0.22.0)"] -cloud = ["docker (>=5.0.0,<7.0)", "redis (>=4.0.1,<6.0)", "s3fs (>=2022.5.0,<2024.0)"] -components = ["aiohttp (>=3.8.0,<4.0)", "lightning-api-access (>=0.0.3)", "lightning-fabric (>=1.9.0)", "pytorch-lightning (>=1.9.0)"] +all = ["bitsandbytes (>=0.42.0,<1.0)", "deepspeed (>=0.8.2,<=0.9.3)", "hydra-core (>=1.2.0,<2.0)", "ipython[all] (<9.0)", "jsonargparse[signatures] (>=4.27.7,<5.0)", "lightning-utilities (>=0.8.0,<1.0)", "matplotlib (>3.1,<4.0)", "omegaconf (>=2.2.3,<3.0)", "requests (<3.0)", "rich (>=12.3.0,<14.0)", "tensorboardX (>=2.2,<3.0)", "torchmetrics (>=0.10.0,<2.0)", "torchvision (>=0.15.0,<1.0)"] +app = ["lightning-app (>=2.3.3,<3.0)"] data = ["litdata (>=0.2.0rc,<1.0)"] -dev = ["Jinja2 (<4.0)", "PyYAML (<7.0)", "aiohttp (>=3.8.0,<4.0)", "arrow (>=1.2.0,<2.0)", "backoff (>=2.2.1,<3.0)", "beautifulsoup4 (>=4.8.0,<5.0)", "bitsandbytes (>=0.42.0,<1.0)", "click (<9.0)", "click (==8.1.7)", "cloudpickle (>=1.3,<3.0)", "coverage (==7.3.1)", "croniter (>=1.3.0,<1.5.0)", "dateutils (<1.0)", "deepdiff (>=5.7.0,<7.0)", "deepspeed (>=0.8.2,<=0.9.3)", "docker (>=5.0.0,<7.0)", "fastapi", "fastapi (>=0.92.0,<1.0)", "fsspec[http] (>=2022.5.0,<2024.0)", "httpx (==0.25.0)", "hydra-core (>=1.0.5,<2.0)", "inquirer (>=2.10.0,<4.0)", "ipython[all] (<9.0)", "jsonargparse[signatures] (>=4.27.7,<5.0)", "lightning-api-access (>=0.0.3)", "lightning-cloud (==0.5.69)", "lightning-fabric (>=1.9.0)", "lightning-utilities (>=0.8.0,<1.0)", "matplotlib (>3.1,<4.0)", "omegaconf (>=2.0.5,<3.0)", "onnx (>=0.14.0,<2.0)", "onnxruntime (>=0.15.0,<2.0)", "packaging", "pandas", "pandas (>1.0,<3.0)", "playwright (==1.38.0)", "psutil (<6.0)", "pydantic (>=1.7.4)", "pympler", "pytest (==7.4.0)", "pytest-asyncio (==0.21.1)", "pytest-cov (==4.1.0)", "pytest-doctestplus (==1.0.0)", "pytest-random-order (==1.1.0)", "pytest-rerunfailures (==12.0)", "pytest-timeout (==2.1.0)", "pytest-xdist (==3.3.1)", "python-multipart (>=0.0.5,<1.0)", "pytorch-lightning (>=1.9.0)", "redis (>=4.0.1,<6.0)", "requests (<3.0)", "requests-mock (==1.11.0)", "rich (>=12.3.0,<14.0)", "s3fs (>=2022.5.0,<2024.0)", "scikit-learn (>0.22.1,<2.0)", "setuptools (<69.0)", "starlette", "tensorboard (>=2.9.1,<3.0)", "tensorboardX (>=2.2,<3.0)", "torchmetrics (>=0.10.0,<2.0)", "torchmetrics (>=0.7.0,<2.0)", "torchvision (>=0.15.0,<1.0)", "traitlets (>=5.3.0,<6.0)", "trio (<0.22.0)", "typing-extensions (>=4.4.0,<5.0)", "urllib3 (<3.0)", "uvicorn", "uvicorn (<1.0)", "websocket-client (<2.0)", "websockets (<12.0)"] +dev = ["bitsandbytes (>=0.42.0,<1.0)", "click (==8.1.7)", "cloudpickle (>=1.3,<3.0)", "coverage (==7.3.1)", "deepspeed (>=0.8.2,<=0.9.3)", "fastapi", "hydra-core (>=1.2.0,<2.0)", "ipython[all] (<9.0)", "jsonargparse[signatures] (>=4.27.7,<5.0)", "lightning-utilities (>=0.8.0,<1.0)", "matplotlib (>3.1,<4.0)", "omegaconf (>=2.2.3,<3.0)", "onnx (>=0.14.0,<2.0)", "onnxruntime (>=0.15.0,<2.0)", "pandas (>1.0,<3.0)", "psutil (<6.0)", "pytest (==7.4.0)", "pytest-cov (==4.1.0)", "pytest-random-order (==1.1.0)", "pytest-rerunfailures (==12.0)", "pytest-timeout (==2.1.0)", "requests (<3.0)", "rich (>=12.3.0,<14.0)", "scikit-learn (>0.22.1,<2.0)", "tensorboard (>=2.9.1,<3.0)", "tensorboardX (>=2.2,<3.0)", "torchmetrics (>=0.10.0,<2.0)", "torchmetrics (>=0.7.0,<2.0)", "torchvision (>=0.15.0,<1.0)", "uvicorn"] examples = ["ipython[all] (<9.0)", "lightning-utilities (>=0.8.0,<1.0)", "requests (<3.0)", "torchmetrics (>=0.10.0,<2.0)", "torchvision (>=0.15.0,<1.0)"] -extra = ["Jinja2 (<4.0)", "PyYAML (<7.0)", "aiohttp (>=3.8.0,<4.0)", "arrow (>=1.2.0,<2.0)", "backoff (>=2.2.1,<3.0)", "beautifulsoup4 (>=4.8.0,<5.0)", "bitsandbytes (>=0.42.0,<1.0)", "click (<9.0)", "croniter (>=1.3.0,<1.5.0)", "dateutils (<1.0)", "deepdiff (>=5.7.0,<7.0)", "docker (>=5.0.0,<7.0)", "fastapi (>=0.92.0,<1.0)", "fsspec[http] (>=2022.5.0,<2024.0)", "hydra-core (>=1.0.5,<2.0)", "inquirer (>=2.10.0,<4.0)", "jsonargparse[signatures] (>=4.27.7,<5.0)", "lightning-api-access (>=0.0.3)", "lightning-cloud (==0.5.69)", "lightning-fabric (>=1.9.0)", "lightning-utilities (>=0.8.0,<1.0)", "matplotlib (>3.1,<4.0)", "omegaconf (>=2.0.5,<3.0)", "packaging", "psutil (<6.0)", "pydantic (>=1.7.4)", "python-multipart (>=0.0.5,<1.0)", "pytorch-lightning (>=1.9.0)", "redis (>=4.0.1,<6.0)", "requests (<3.0)", "rich (>=12.3.0,<14.0)", "s3fs (>=2022.5.0,<2024.0)", "starlette", "tensorboardX (>=2.2,<3.0)", "traitlets (>=5.3.0,<6.0)", "typing-extensions (>=4.4.0,<5.0)", "urllib3 (<3.0)", "uvicorn (<1.0)", "websocket-client (<2.0)", "websockets (<12.0)"] +extra = ["bitsandbytes (>=0.42.0,<1.0)", "hydra-core (>=1.2.0,<2.0)", "jsonargparse[signatures] (>=4.27.7,<5.0)", "matplotlib (>3.1,<4.0)", "omegaconf (>=2.2.3,<3.0)", "rich (>=12.3.0,<14.0)", "tensorboardX (>=2.2,<3.0)"] fabric-all = ["bitsandbytes (>=0.42.0,<1.0)", "deepspeed (>=0.8.2,<=0.9.3)", "lightning-utilities (>=0.8.0,<1.0)", "torchmetrics (>=0.10.0,<2.0)", "torchvision (>=0.15.0,<1.0)"] fabric-dev = ["bitsandbytes (>=0.42.0,<1.0)", "click (==8.1.7)", "coverage (==7.3.1)", "deepspeed (>=0.8.2,<=0.9.3)", "lightning-utilities (>=0.8.0,<1.0)", "pytest (==7.4.0)", "pytest-cov (==4.1.0)", "pytest-random-order (==1.1.0)", "pytest-rerunfailures (==12.0)", "pytest-timeout (==2.1.0)", "tensorboardX (>=2.2,<3.0)", "torchmetrics (>=0.10.0,<2.0)", "torchmetrics (>=0.7.0,<2.0)", "torchvision (>=0.15.0,<1.0)"] fabric-examples = ["lightning-utilities (>=0.8.0,<1.0)", "torchmetrics (>=0.10.0,<2.0)", "torchvision (>=0.15.0,<1.0)"] fabric-strategies = ["bitsandbytes (>=0.42.0,<1.0)", "deepspeed (>=0.8.2,<=0.9.3)"] fabric-test = ["click (==8.1.7)", "coverage (==7.3.1)", "pytest (==7.4.0)", "pytest-cov (==4.1.0)", "pytest-random-order (==1.1.0)", "pytest-rerunfailures (==12.0)", "pytest-timeout (==2.1.0)", "tensorboardX (>=2.2,<3.0)", "torchmetrics (>=0.7.0,<2.0)"] -pytorch-all = ["bitsandbytes (>=0.42.0,<1.0)", "deepspeed (>=0.8.2,<=0.9.3)", "hydra-core (>=1.0.5,<2.0)", "ipython[all] (<9.0)", "jsonargparse[signatures] (>=4.27.7,<5.0)", "lightning-utilities (>=0.8.0,<1.0)", "matplotlib (>3.1,<4.0)", "omegaconf (>=2.0.5,<3.0)", "requests (<3.0)", "rich (>=12.3.0,<14.0)", "tensorboardX (>=2.2,<3.0)", "torchmetrics (>=0.10.0,<2.0)", "torchvision (>=0.15.0,<1.0)"] -pytorch-dev = ["bitsandbytes (>=0.42.0,<1.0)", "cloudpickle (>=1.3,<3.0)", "coverage (==7.3.1)", "deepspeed (>=0.8.2,<=0.9.3)", "fastapi", "hydra-core (>=1.0.5,<2.0)", "ipython[all] (<9.0)", "jsonargparse[signatures] (>=4.27.7,<5.0)", "lightning-utilities (>=0.8.0,<1.0)", "matplotlib (>3.1,<4.0)", "omegaconf (>=2.0.5,<3.0)", "onnx (>=0.14.0,<2.0)", "onnxruntime (>=0.15.0,<2.0)", "pandas (>1.0,<3.0)", "psutil (<6.0)", "pytest (==7.4.0)", "pytest-cov (==4.1.0)", "pytest-random-order (==1.1.0)", "pytest-rerunfailures (==12.0)", "pytest-timeout (==2.1.0)", "requests (<3.0)", "rich (>=12.3.0,<14.0)", "scikit-learn (>0.22.1,<2.0)", "tensorboard (>=2.9.1,<3.0)", "tensorboardX (>=2.2,<3.0)", "torchmetrics (>=0.10.0,<2.0)", "torchvision (>=0.15.0,<1.0)", "uvicorn"] +pytorch-all = ["bitsandbytes (>=0.42.0,<1.0)", "deepspeed (>=0.8.2,<=0.9.3)", "hydra-core (>=1.2.0,<2.0)", "ipython[all] (<9.0)", "jsonargparse[signatures] (>=4.27.7,<5.0)", "lightning-utilities (>=0.8.0,<1.0)", "matplotlib (>3.1,<4.0)", "omegaconf (>=2.2.3,<3.0)", "requests (<3.0)", "rich (>=12.3.0,<14.0)", "tensorboardX (>=2.2,<3.0)", "torchmetrics (>=0.10.0,<2.0)", "torchvision (>=0.15.0,<1.0)"] +pytorch-dev = ["bitsandbytes (>=0.42.0,<1.0)", "cloudpickle (>=1.3,<3.0)", "coverage (==7.3.1)", "deepspeed (>=0.8.2,<=0.9.3)", "fastapi", "hydra-core (>=1.2.0,<2.0)", "ipython[all] (<9.0)", "jsonargparse[signatures] (>=4.27.7,<5.0)", "lightning-utilities (>=0.8.0,<1.0)", "matplotlib (>3.1,<4.0)", "omegaconf (>=2.2.3,<3.0)", "onnx (>=0.14.0,<2.0)", "onnxruntime (>=0.15.0,<2.0)", "pandas (>1.0,<3.0)", "psutil (<6.0)", "pytest (==7.4.0)", "pytest-cov (==4.1.0)", "pytest-random-order (==1.1.0)", "pytest-rerunfailures (==12.0)", "pytest-timeout (==2.1.0)", "requests (<3.0)", "rich (>=12.3.0,<14.0)", "scikit-learn (>0.22.1,<2.0)", "tensorboard (>=2.9.1,<3.0)", "tensorboardX (>=2.2,<3.0)", "torchmetrics (>=0.10.0,<2.0)", "torchvision (>=0.15.0,<1.0)", "uvicorn"] pytorch-examples = ["ipython[all] (<9.0)", "lightning-utilities (>=0.8.0,<1.0)", "requests (<3.0)", "torchmetrics (>=0.10.0,<2.0)", "torchvision (>=0.15.0,<1.0)"] -pytorch-extra = ["bitsandbytes (>=0.42.0,<1.0)", "hydra-core (>=1.0.5,<2.0)", "jsonargparse[signatures] (>=4.27.7,<5.0)", "matplotlib (>3.1,<4.0)", "omegaconf (>=2.0.5,<3.0)", "rich (>=12.3.0,<14.0)", "tensorboardX (>=2.2,<3.0)"] +pytorch-extra = ["bitsandbytes (>=0.42.0,<1.0)", "hydra-core (>=1.2.0,<2.0)", "jsonargparse[signatures] (>=4.27.7,<5.0)", "matplotlib (>3.1,<4.0)", "omegaconf (>=2.2.3,<3.0)", "rich (>=12.3.0,<14.0)", "tensorboardX (>=2.2,<3.0)"] pytorch-strategies = ["deepspeed (>=0.8.2,<=0.9.3)"] pytorch-test = ["cloudpickle (>=1.3,<3.0)", "coverage (==7.3.1)", "fastapi", "onnx (>=0.14.0,<2.0)", "onnxruntime (>=0.15.0,<2.0)", "pandas (>1.0,<3.0)", "psutil (<6.0)", "pytest (==7.4.0)", "pytest-cov (==4.1.0)", "pytest-random-order (==1.1.0)", "pytest-rerunfailures (==12.0)", "pytest-timeout (==2.1.0)", "scikit-learn (>0.22.1,<2.0)", "tensorboard (>=2.9.1,<3.0)", "uvicorn"] -store = ["Jinja2 (<4.0)", "PyYAML (<7.0)", "arrow (>=1.2.0,<2.0)", "backoff (>=2.2.1,<3.0)", "beautifulsoup4 (>=4.8.0,<5.0)", "click (<9.0)", "croniter (>=1.3.0,<1.5.0)", "dateutils (<1.0)", "deepdiff (>=5.7.0,<7.0)", "fastapi (>=0.92.0,<1.0)", "fsspec[http] (>=2022.5.0,<2024.0)", "inquirer (>=2.10.0,<4.0)", "lightning-cloud (==0.5.69)", "lightning-utilities (>=0.8.0,<1.0)", "packaging", "psutil (<6.0)", "pydantic (>=1.7.4)", "python-multipart (>=0.0.5,<1.0)", "requests (<3.0)", "rich (>=12.3.0,<14.0)", "starlette", "traitlets (>=5.3.0,<6.0)", "typing-extensions (>=4.4.0,<5.0)", "urllib3 (<3.0)", "uvicorn (<1.0)", "websocket-client (<2.0)", "websockets (<12.0)"] store-test = ["coverage (==7.3.1)", "pytest (==7.4.0)", "pytest-cov (==4.1.0)", "pytest-random-order (==1.1.0)", "pytest-rerunfailures (==12.0)", "pytest-timeout (==2.1.0)"] strategies = ["bitsandbytes (>=0.42.0,<1.0)", "deepspeed (>=0.8.2,<=0.9.3)"] -test = ["click (==8.1.7)", "cloudpickle (>=1.3,<3.0)", "coverage (==7.3.1)", "fastapi", "httpx (==0.25.0)", "onnx (>=0.14.0,<2.0)", "onnxruntime (>=0.15.0,<2.0)", "pandas", "pandas (>1.0,<3.0)", "playwright (==1.38.0)", "psutil (<6.0)", "pympler", "pytest (==7.4.0)", "pytest-asyncio (==0.21.1)", "pytest-cov (==4.1.0)", "pytest-doctestplus (==1.0.0)", "pytest-random-order (==1.1.0)", "pytest-rerunfailures (==12.0)", "pytest-timeout (==2.1.0)", "pytest-xdist (==3.3.1)", "requests-mock (==1.11.0)", "scikit-learn (>0.22.1,<2.0)", "setuptools (<69.0)", "tensorboard (>=2.9.1,<3.0)", "tensorboardX (>=2.2,<3.0)", "torchmetrics (>=0.7.0,<2.0)", "trio (<0.22.0)", "uvicorn"] +test = ["click (==8.1.7)", "cloudpickle (>=1.3,<3.0)", "coverage (==7.3.1)", "fastapi", "onnx (>=0.14.0,<2.0)", "onnxruntime (>=0.15.0,<2.0)", "pandas (>1.0,<3.0)", "psutil (<6.0)", "pytest (==7.4.0)", "pytest-cov (==4.1.0)", "pytest-random-order (==1.1.0)", "pytest-rerunfailures (==12.0)", "pytest-timeout (==2.1.0)", "scikit-learn (>0.22.1,<2.0)", "tensorboard (>=2.9.1,<3.0)", "tensorboardX (>=2.2,<3.0)", "torchmetrics (>=0.7.0,<2.0)", "uvicorn"] [[package]] name = "lightning-utilities" -version = "0.11.3.post0" +version = "0.11.6" description = "Lightning toolbox for across the our ecosystem." optional = false python-versions = ">=3.8" files = [ - {file = "lightning_utilities-0.11.3.post0-py3-none-any.whl", hash = "sha256:2aec1d067e5ab61a8978f879998850a97f9a3764ee54aade329552706b0d189b"}, - {file = "lightning_utilities-0.11.3.post0.tar.gz", hash = "sha256:7485fad0e3c5607a6bde4507935689c553a2c91325de2127b4bb8171a601e236"}, + {file = "lightning_utilities-0.11.6-py3-none-any.whl", hash = "sha256:ecd9953c316cbaf56ad820fbe7bd062187b9973c4a23d47b076cd59dc080a310"}, + {file = "lightning_utilities-0.11.6.tar.gz", hash = "sha256:79fc27ef8ec8b8d55a537920f2c7610270c0c9e037fa6efc78f1aa34ec8cdf04"}, ] [package.dependencies] @@ -1813,40 +1804,40 @@ files = [ [[package]] name = "matplotlib" -version = "3.9.0" +version = "3.9.1" description = "Python plotting package" optional = false python-versions = ">=3.9" files = [ - {file = "matplotlib-3.9.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2bcee1dffaf60fe7656183ac2190bd630842ff87b3153afb3e384d966b57fe56"}, - {file = "matplotlib-3.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3f988bafb0fa39d1074ddd5bacd958c853e11def40800c5824556eb630f94d3b"}, - {file = "matplotlib-3.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe428e191ea016bb278758c8ee82a8129c51d81d8c4bc0846c09e7e8e9057241"}, - {file = "matplotlib-3.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaf3978060a106fab40c328778b148f590e27f6fa3cd15a19d6892575bce387d"}, - {file = "matplotlib-3.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2e7f03e5cbbfacdd48c8ea394d365d91ee8f3cae7e6ec611409927b5ed997ee4"}, - {file = "matplotlib-3.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:13beb4840317d45ffd4183a778685e215939be7b08616f431c7795276e067463"}, - {file = "matplotlib-3.9.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:063af8587fceeac13b0936c42a2b6c732c2ab1c98d38abc3337e430e1ff75e38"}, - {file = "matplotlib-3.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9a2fa6d899e17ddca6d6526cf6e7ba677738bf2a6a9590d702c277204a7c6152"}, - {file = "matplotlib-3.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:550cdda3adbd596078cca7d13ed50b77879104e2e46392dcd7c75259d8f00e85"}, - {file = "matplotlib-3.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76cce0f31b351e3551d1f3779420cf8f6ec0d4a8cf9c0237a3b549fd28eb4abb"}, - {file = "matplotlib-3.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c53aeb514ccbbcbab55a27f912d79ea30ab21ee0531ee2c09f13800efb272674"}, - {file = "matplotlib-3.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:a5be985db2596d761cdf0c2eaf52396f26e6a64ab46bd8cd810c48972349d1be"}, - {file = "matplotlib-3.9.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:c79f3a585f1368da6049318bdf1f85568d8d04b2e89fc24b7e02cc9b62017382"}, - {file = "matplotlib-3.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bdd1ecbe268eb3e7653e04f451635f0fb0f77f07fd070242b44c076c9106da84"}, - {file = "matplotlib-3.9.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d38e85a1a6d732f645f1403ce5e6727fd9418cd4574521d5803d3d94911038e5"}, - {file = "matplotlib-3.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a490715b3b9984fa609116481b22178348c1a220a4499cda79132000a79b4db"}, - {file = "matplotlib-3.9.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8146ce83cbc5dc71c223a74a1996d446cd35cfb6a04b683e1446b7e6c73603b7"}, - {file = "matplotlib-3.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:d91a4ffc587bacf5c4ce4ecfe4bcd23a4b675e76315f2866e588686cc97fccdf"}, - {file = "matplotlib-3.9.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:616fabf4981a3b3c5a15cd95eba359c8489c4e20e03717aea42866d8d0465956"}, - {file = "matplotlib-3.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cd53c79fd02f1c1808d2cfc87dd3cf4dbc63c5244a58ee7944497107469c8d8a"}, - {file = "matplotlib-3.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06a478f0d67636554fa78558cfbcd7b9dba85b51f5c3b5a0c9be49010cf5f321"}, - {file = "matplotlib-3.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81c40af649d19c85f8073e25e5806926986806fa6d54be506fbf02aef47d5a89"}, - {file = "matplotlib-3.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52146fc3bd7813cc784562cb93a15788be0b2875c4655e2cc6ea646bfa30344b"}, - {file = "matplotlib-3.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:0fc51eaa5262553868461c083d9adadb11a6017315f3a757fc45ec6ec5f02888"}, - {file = "matplotlib-3.9.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bd4f2831168afac55b881db82a7730992aa41c4f007f1913465fb182d6fb20c0"}, - {file = "matplotlib-3.9.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:290d304e59be2b33ef5c2d768d0237f5bd132986bdcc66f80bc9bcc300066a03"}, - {file = "matplotlib-3.9.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ff2e239c26be4f24bfa45860c20ffccd118d270c5b5d081fa4ea409b5469fcd"}, - {file = "matplotlib-3.9.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:af4001b7cae70f7eaacfb063db605280058246de590fa7874f00f62259f2df7e"}, - {file = "matplotlib-3.9.0.tar.gz", hash = "sha256:e6d29ea6c19e34b30fb7d88b7081f869a03014f66fe06d62cc77d5a6ea88ed7a"}, + {file = "matplotlib-3.9.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:7ccd6270066feb9a9d8e0705aa027f1ff39f354c72a87efe8fa07632f30fc6bb"}, + {file = "matplotlib-3.9.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:591d3a88903a30a6d23b040c1e44d1afdd0d778758d07110eb7596f811f31842"}, + {file = "matplotlib-3.9.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd2a59ff4b83d33bca3b5ec58203cc65985367812cb8c257f3e101632be86d92"}, + {file = "matplotlib-3.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fc001516ffcf1a221beb51198b194d9230199d6842c540108e4ce109ac05cc0"}, + {file = "matplotlib-3.9.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:83c6a792f1465d174c86d06f3ae85a8fe36e6f5964633ae8106312ec0921fdf5"}, + {file = "matplotlib-3.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:421851f4f57350bcf0811edd754a708d2275533e84f52f6760b740766c6747a7"}, + {file = "matplotlib-3.9.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:b3fce58971b465e01b5c538f9d44915640c20ec5ff31346e963c9e1cd66fa812"}, + {file = "matplotlib-3.9.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a973c53ad0668c53e0ed76b27d2eeeae8799836fd0d0caaa4ecc66bf4e6676c0"}, + {file = "matplotlib-3.9.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82cd5acf8f3ef43f7532c2f230249720f5dc5dd40ecafaf1c60ac8200d46d7eb"}, + {file = "matplotlib-3.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab38a4f3772523179b2f772103d8030215b318fef6360cb40558f585bf3d017f"}, + {file = "matplotlib-3.9.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2315837485ca6188a4b632c5199900e28d33b481eb083663f6a44cfc8987ded3"}, + {file = "matplotlib-3.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:a0c977c5c382f6696caf0bd277ef4f936da7e2aa202ff66cad5f0ac1428ee15b"}, + {file = "matplotlib-3.9.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:565d572efea2b94f264dd86ef27919515aa6d629252a169b42ce5f570db7f37b"}, + {file = "matplotlib-3.9.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6d397fd8ccc64af2ec0af1f0efc3bacd745ebfb9d507f3f552e8adb689ed730a"}, + {file = "matplotlib-3.9.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26040c8f5121cd1ad712abffcd4b5222a8aec3a0fe40bc8542c94331deb8780d"}, + {file = "matplotlib-3.9.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d12cb1837cffaac087ad6b44399d5e22b78c729de3cdae4629e252067b705e2b"}, + {file = "matplotlib-3.9.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0e835c6988edc3d2d08794f73c323cc62483e13df0194719ecb0723b564e0b5c"}, + {file = "matplotlib-3.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:44a21d922f78ce40435cb35b43dd7d573cf2a30138d5c4b709d19f00e3907fd7"}, + {file = "matplotlib-3.9.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:0c584210c755ae921283d21d01f03a49ef46d1afa184134dd0f95b0202ee6f03"}, + {file = "matplotlib-3.9.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:11fed08f34fa682c2b792942f8902e7aefeed400da71f9e5816bea40a7ce28fe"}, + {file = "matplotlib-3.9.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0000354e32efcfd86bda75729716b92f5c2edd5b947200be9881f0a671565c33"}, + {file = "matplotlib-3.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4db17fea0ae3aceb8e9ac69c7e3051bae0b3d083bfec932240f9bf5d0197a049"}, + {file = "matplotlib-3.9.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:208cbce658b72bf6a8e675058fbbf59f67814057ae78165d8a2f87c45b48d0ff"}, + {file = "matplotlib-3.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:dc23f48ab630474264276be156d0d7710ac6c5a09648ccdf49fef9200d8cbe80"}, + {file = "matplotlib-3.9.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:3fda72d4d472e2ccd1be0e9ccb6bf0d2eaf635e7f8f51d737ed7e465ac020cb3"}, + {file = "matplotlib-3.9.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:84b3ba8429935a444f1fdc80ed930babbe06725bcf09fbeb5c8757a2cd74af04"}, + {file = "matplotlib-3.9.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b918770bf3e07845408716e5bbda17eadfc3fcbd9307dc67f37d6cf834bb3d98"}, + {file = "matplotlib-3.9.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f1f2e5d29e9435c97ad4c36fb6668e89aee13d48c75893e25cef064675038ac9"}, + {file = "matplotlib-3.9.1.tar.gz", hash = "sha256:de06b19b8db95dd33d0dc17c926c7c9ebed9f572074b6fac4f65068a6814d010"}, ] [package.dependencies] @@ -2333,13 +2324,14 @@ files = [ [[package]] name = "nvidia-nvjitlink-cu12" -version = "12.5.40" +version = "12.5.82" description = "Nvidia JIT LTO Library" optional = false python-versions = ">=3" files = [ - {file = "nvidia_nvjitlink_cu12-12.5.40-py3-none-manylinux2014_x86_64.whl", hash = "sha256:d9714f27c1d0f0895cd8915c07a87a1d0029a0aa36acaf9156952ec2a8a12189"}, - {file = "nvidia_nvjitlink_cu12-12.5.40-py3-none-win_amd64.whl", hash = "sha256:c3401dc8543b52d3a8158007a0c1ab4e9c768fcbd24153a48c86972102197ddd"}, + {file = "nvidia_nvjitlink_cu12-12.5.82-py3-none-manylinux2014_aarch64.whl", hash = "sha256:98103729cc5226e13ca319a10bbf9433bbbd44ef64fe72f45f067cacc14b8d27"}, + {file = "nvidia_nvjitlink_cu12-12.5.82-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f9b37bc5c8cf7509665cb6ada5aaa0ce65618f2332b7d3e78e9790511f111212"}, + {file = "nvidia_nvjitlink_cu12-12.5.82-py3-none-win_amd64.whl", hash = "sha256:e782564d705ff0bf61ac3e1bf730166da66dd2fe9012f111ede5fc49b64ae697"}, ] [[package]] @@ -2527,84 +2519,95 @@ ptyprocess = ">=0.5" [[package]] name = "pillow" -version = "10.3.0" +version = "10.4.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.8" files = [ - {file = "pillow-10.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45"}, - {file = "pillow-10.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c"}, - {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78618cdbccaa74d3f88d0ad6cb8ac3007f1a6fa5c6f19af64b55ca170bfa1edf"}, - {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261ddb7ca91fcf71757979534fb4c128448b5b4c55cb6152d280312062f69599"}, - {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ce49c67f4ea0609933d01c0731b34b8695a7a748d6c8d186f95e7d085d2fe475"}, - {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b14f16f94cbc61215115b9b1236f9c18403c15dd3c52cf629072afa9d54c1cbf"}, - {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d33891be6df59d93df4d846640f0e46f1a807339f09e79a8040bc887bdcd7ed3"}, - {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b50811d664d392f02f7761621303eba9d1b056fb1868c8cdf4231279645c25f5"}, - {file = "pillow-10.3.0-cp310-cp310-win32.whl", hash = "sha256:ca2870d5d10d8726a27396d3ca4cf7976cec0f3cb706debe88e3a5bd4610f7d2"}, - {file = "pillow-10.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:f0d0591a0aeaefdaf9a5e545e7485f89910c977087e7de2b6c388aec32011e9f"}, - {file = "pillow-10.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:ccce24b7ad89adb5a1e34a6ba96ac2530046763912806ad4c247356a8f33a67b"}, - {file = "pillow-10.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:5f77cf66e96ae734717d341c145c5949c63180842a545c47a0ce7ae52ca83795"}, - {file = "pillow-10.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e4b878386c4bf293578b48fc570b84ecfe477d3b77ba39a6e87150af77f40c57"}, - {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdcbb4068117dfd9ce0138d068ac512843c52295ed996ae6dd1faf537b6dbc27"}, - {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9797a6c8fe16f25749b371c02e2ade0efb51155e767a971c61734b1bf6293994"}, - {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:9e91179a242bbc99be65e139e30690e081fe6cb91a8e77faf4c409653de39451"}, - {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1b87bd9d81d179bd8ab871603bd80d8645729939f90b71e62914e816a76fc6bd"}, - {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:81d09caa7b27ef4e61cb7d8fbf1714f5aec1c6b6c5270ee53504981e6e9121ad"}, - {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:048ad577748b9fa4a99a0548c64f2cb8d672d5bf2e643a739ac8faff1164238c"}, - {file = "pillow-10.3.0-cp311-cp311-win32.whl", hash = "sha256:7161ec49ef0800947dc5570f86568a7bb36fa97dd09e9827dc02b718c5643f09"}, - {file = "pillow-10.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:8eb0908e954d093b02a543dc963984d6e99ad2b5e36503d8a0aaf040505f747d"}, - {file = "pillow-10.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:4e6f7d1c414191c1199f8996d3f2282b9ebea0945693fb67392c75a3a320941f"}, - {file = "pillow-10.3.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84"}, - {file = "pillow-10.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19"}, - {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338"}, - {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1"}, - {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462"}, - {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a"}, - {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef"}, - {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3"}, - {file = "pillow-10.3.0-cp312-cp312-win32.whl", hash = "sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d"}, - {file = "pillow-10.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b"}, - {file = "pillow-10.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a"}, - {file = "pillow-10.3.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:4eaa22f0d22b1a7e93ff0a596d57fdede2e550aecffb5a1ef1106aaece48e96b"}, - {file = "pillow-10.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cd5e14fbf22a87321b24c88669aad3a51ec052eb145315b3da3b7e3cc105b9a2"}, - {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1530e8f3a4b965eb6a7785cf17a426c779333eb62c9a7d1bbcf3ffd5bf77a4aa"}, - {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d512aafa1d32efa014fa041d38868fda85028e3f930a96f85d49c7d8ddc0383"}, - {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:339894035d0ede518b16073bdc2feef4c991ee991a29774b33e515f1d308e08d"}, - {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:aa7e402ce11f0885305bfb6afb3434b3cd8f53b563ac065452d9d5654c7b86fd"}, - {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0ea2a783a2bdf2a561808fe4a7a12e9aa3799b701ba305de596bc48b8bdfce9d"}, - {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c78e1b00a87ce43bb37642c0812315b411e856a905d58d597750eb79802aaaa3"}, - {file = "pillow-10.3.0-cp38-cp38-win32.whl", hash = "sha256:72d622d262e463dfb7595202d229f5f3ab4b852289a1cd09650362db23b9eb0b"}, - {file = "pillow-10.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:2034f6759a722da3a3dbd91a81148cf884e91d1b747992ca288ab88c1de15999"}, - {file = "pillow-10.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2ed854e716a89b1afcedea551cd85f2eb2a807613752ab997b9974aaa0d56936"}, - {file = "pillow-10.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dc1a390a82755a8c26c9964d457d4c9cbec5405896cba94cf51f36ea0d855002"}, - {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4203efca580f0dd6f882ca211f923168548f7ba334c189e9eab1178ab840bf60"}, - {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3102045a10945173d38336f6e71a8dc71bcaeed55c3123ad4af82c52807b9375"}, - {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:6fb1b30043271ec92dc65f6d9f0b7a830c210b8a96423074b15c7bc999975f57"}, - {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8"}, - {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b09b86b27a064c9624d0a6c54da01c1beaf5b6cadfa609cf63789b1d08a797b9"}, - {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d3b2348a78bc939b4fed6552abfd2e7988e0f81443ef3911a4b8498ca084f6eb"}, - {file = "pillow-10.3.0-cp39-cp39-win32.whl", hash = "sha256:45ebc7b45406febf07fef35d856f0293a92e7417ae7933207e90bf9090b70572"}, - {file = "pillow-10.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:0ba26351b137ca4e0db0342d5d00d2e355eb29372c05afd544ebf47c0956ffeb"}, - {file = "pillow-10.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:50fd3f6b26e3441ae07b7c979309638b72abc1a25da31a81a7fbd9495713ef4f"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3"}, - {file = "pillow-10.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a"}, - {file = "pillow-10.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591"}, - {file = "pillow-10.3.0.tar.gz", hash = "sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d"}, + {file = "pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e"}, + {file = "pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc"}, + {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e"}, + {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46"}, + {file = "pillow-10.4.0-cp310-cp310-win32.whl", hash = "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984"}, + {file = "pillow-10.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141"}, + {file = "pillow-10.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1"}, + {file = "pillow-10.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c"}, + {file = "pillow-10.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319"}, + {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d"}, + {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696"}, + {file = "pillow-10.4.0-cp311-cp311-win32.whl", hash = "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496"}, + {file = "pillow-10.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91"}, + {file = "pillow-10.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22"}, + {file = "pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94"}, + {file = "pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a"}, + {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b"}, + {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9"}, + {file = "pillow-10.4.0-cp312-cp312-win32.whl", hash = "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42"}, + {file = "pillow-10.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a"}, + {file = "pillow-10.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9"}, + {file = "pillow-10.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3"}, + {file = "pillow-10.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc"}, + {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a"}, + {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309"}, + {file = "pillow-10.4.0-cp313-cp313-win32.whl", hash = "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060"}, + {file = "pillow-10.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea"}, + {file = "pillow-10.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d"}, + {file = "pillow-10.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736"}, + {file = "pillow-10.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd"}, + {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84"}, + {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0"}, + {file = "pillow-10.4.0-cp38-cp38-win32.whl", hash = "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e"}, + {file = "pillow-10.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab"}, + {file = "pillow-10.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d"}, + {file = "pillow-10.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c"}, + {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1"}, + {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df"}, + {file = "pillow-10.4.0-cp39-cp39-win32.whl", hash = "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef"}, + {file = "pillow-10.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5"}, + {file = "pillow-10.4.0-cp39-cp39-win_arm64.whl", hash = "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3"}, + {file = "pillow-10.4.0.tar.gz", hash = "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06"}, ] [package.extras] -docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +docs = ["furo", "olefile", "sphinx (>=7.3)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] fpx = ["olefile"] mic = ["olefile"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] @@ -2613,20 +2616,21 @@ xmp = ["defusedxml"] [[package]] name = "pip-licenses" -version = "4.4.0" +version = "4.5.1" description = "Dump the software license list of Python packages installed with pip." optional = false python-versions = "~=3.8" files = [ - {file = "pip-licenses-4.4.0.tar.gz", hash = "sha256:996817118375445243a34faafe23c06f6b2d250247c4046571b5a6722d45be69"}, - {file = "pip_licenses-4.4.0-py3-none-any.whl", hash = "sha256:dbad2ac5a25f574cabe2716f2f031a0c5fa359bed9b3ef615301f4e546893b46"}, + {file = "pip-licenses-4.5.1.tar.gz", hash = "sha256:fad5f56fbaa56b8e414434e36c32394a9412ff10ddf2cef92b51951bdf193869"}, + {file = "pip_licenses-4.5.1-py3-none-any.whl", hash = "sha256:7c982bc6837f47d32d4016b43d9174c0ce723b450710a2111a3ebbb910f152b7"}, ] [package.dependencies] prettytable = ">=2.3.0" +tomli = ">=2" [package.extras] -test = ["docutils", "mypy", "pytest-cov", "pytest-pycodestyle", "pytest-runner"] +test = ["docutils", "mypy", "pytest-cov", "pytest-pycodestyle", "pytest-runner", "tomli-w"] [[package]] name = "platformdirs" @@ -2672,13 +2676,13 @@ files = [ [[package]] name = "prettytable" -version = "3.10.0" +version = "3.10.2" description = "A simple Python library for easily displaying tabular data in a visually appealing ASCII table format" optional = false python-versions = ">=3.8" files = [ - {file = "prettytable-3.10.0-py3-none-any.whl", hash = "sha256:6536efaf0757fdaa7d22e78b3aac3b69ea1b7200538c2c6995d649365bddab92"}, - {file = "prettytable-3.10.0.tar.gz", hash = "sha256:9665594d137fb08a1117518c25551e0ede1687197cf353a4fdc78d27e1073568"}, + {file = "prettytable-3.10.2-py3-none-any.whl", hash = "sha256:1cbfdeb4bcc73976a778a0fb33cb6d752e75396f16574dcb3e2d6332fd93c76a"}, + {file = "prettytable-3.10.2.tar.gz", hash = "sha256:29ec6c34260191d42cd4928c28d56adec360ac2b1208a26c7e4f14b90cc8bc84"}, ] [package.dependencies] @@ -2762,13 +2766,13 @@ files = [ [[package]] name = "pure-eval" -version = "0.2.2" +version = "0.2.3" description = "Safely evaluate AST nodes without side effects" optional = false python-versions = "*" files = [ - {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, - {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, + {file = "pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0"}, + {file = "pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"}, ] [package.extras] @@ -2864,13 +2868,13 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pytest" -version = "8.2.2" +version = "8.3.1" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-8.2.2-py3-none-any.whl", hash = "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343"}, - {file = "pytest-8.2.2.tar.gz", hash = "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977"}, + {file = "pytest-8.3.1-py3-none-any.whl", hash = "sha256:e9600ccf4f563976e2c99fa02c7624ab938296551f280835ee6516df8bc4ae8c"}, + {file = "pytest-8.3.1.tar.gz", hash = "sha256:7e8e5c5abd6e93cb1cc151f23e57adc31fcf8cfd2a3ff2da63e23f732de35db6"}, ] [package.dependencies] @@ -2878,7 +2882,7 @@ colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" packaging = "*" -pluggy = ">=1.5,<2.0" +pluggy = ">=1.5,<2" tomli = {version = ">=1", markers = "python_version < \"3.11\""} [package.extras] @@ -2918,18 +2922,18 @@ six = ">=1.5" [[package]] name = "pytorch-lightning" -version = "2.3.0" +version = "2.3.3" description = "PyTorch Lightning is the lightweight PyTorch wrapper for ML researchers. Scale your models. Write less boilerplate." optional = false python-versions = ">=3.8" files = [ - {file = "pytorch-lightning-2.3.0.tar.gz", hash = "sha256:89caf90e3543b314508493f26e0eca8d5e10e43e3d9e6c143acd8ddceb584ce2"}, - {file = "pytorch_lightning-2.3.0-py3-none-any.whl", hash = "sha256:b8eec361f4342ca628d0d8e6985511c9515435e4db62c5e982bb1c53a5a5140a"}, + {file = "pytorch-lightning-2.3.3.tar.gz", hash = "sha256:5f974015425af6873b5689246c5495ca12686b446751479273c154b73aeea843"}, + {file = "pytorch_lightning-2.3.3-py3-none-any.whl", hash = "sha256:4365e3f2874e223e63cb42628d24c88c2bdc8d1794453cac38c0619b31115fba"}, ] [package.dependencies] fsspec = {version = ">=2022.5.0", extras = ["http"]} -lightning-utilities = ">=0.8.0" +lightning-utilities = ">=0.10.0" numpy = ">=1.17.2" packaging = ">=20.0" PyYAML = ">=5.4" @@ -2939,11 +2943,11 @@ tqdm = ">=4.57.0" typing-extensions = ">=4.4.0" [package.extras] -all = ["bitsandbytes (>=0.42.0)", "deepspeed (>=0.8.2,<=0.9.3)", "hydra-core (>=1.0.5)", "ipython[all] (<8.15.0)", "jsonargparse[signatures] (>=4.27.7)", "lightning-utilities (>=0.8.0)", "matplotlib (>3.1)", "omegaconf (>=2.0.5)", "requests (<2.32.0)", "rich (>=12.3.0)", "tensorboardX (>=2.2)", "torchmetrics (>=0.10.0)", "torchvision (>=0.15.0)"] +all = ["bitsandbytes (>=0.42.0)", "deepspeed (>=0.8.2,<=0.9.3)", "hydra-core (>=1.2.0)", "ipython[all] (<8.15.0)", "jsonargparse[signatures] (>=4.27.7)", "lightning-utilities (>=0.8.0)", "matplotlib (>3.1)", "omegaconf (>=2.2.3)", "requests (<2.32.0)", "rich (>=12.3.0)", "tensorboardX (>=2.2)", "torchmetrics (>=0.10.0)", "torchvision (>=0.15.0)"] deepspeed = ["deepspeed (>=0.8.2,<=0.9.3)"] -dev = ["bitsandbytes (>=0.42.0)", "cloudpickle (>=1.3)", "coverage (==7.3.1)", "deepspeed (>=0.8.2,<=0.9.3)", "fastapi", "hydra-core (>=1.0.5)", "ipython[all] (<8.15.0)", "jsonargparse[signatures] (>=4.27.7)", "lightning-utilities (>=0.8.0)", "matplotlib (>3.1)", "omegaconf (>=2.0.5)", "onnx (>=0.14.0)", "onnxruntime (>=0.15.0)", "pandas (>1.0)", "psutil (<5.9.6)", "pytest (==7.4.0)", "pytest-cov (==4.1.0)", "pytest-random-order (==1.1.0)", "pytest-rerunfailures (==12.0)", "pytest-timeout (==2.1.0)", "requests (<2.32.0)", "rich (>=12.3.0)", "scikit-learn (>0.22.1)", "tensorboard (>=2.9.1)", "tensorboardX (>=2.2)", "torchmetrics (>=0.10.0)", "torchvision (>=0.15.0)", "uvicorn"] +dev = ["bitsandbytes (>=0.42.0)", "cloudpickle (>=1.3)", "coverage (==7.3.1)", "deepspeed (>=0.8.2,<=0.9.3)", "fastapi", "hydra-core (>=1.2.0)", "ipython[all] (<8.15.0)", "jsonargparse[signatures] (>=4.27.7)", "lightning-utilities (>=0.8.0)", "matplotlib (>3.1)", "omegaconf (>=2.2.3)", "onnx (>=0.14.0)", "onnxruntime (>=0.15.0)", "pandas (>1.0)", "psutil (<5.9.6)", "pytest (==7.4.0)", "pytest-cov (==4.1.0)", "pytest-random-order (==1.1.0)", "pytest-rerunfailures (==12.0)", "pytest-timeout (==2.1.0)", "requests (<2.32.0)", "rich (>=12.3.0)", "scikit-learn (>0.22.1)", "tensorboard (>=2.9.1)", "tensorboardX (>=2.2)", "torchmetrics (>=0.10.0)", "torchvision (>=0.15.0)", "uvicorn"] examples = ["ipython[all] (<8.15.0)", "lightning-utilities (>=0.8.0)", "requests (<2.32.0)", "torchmetrics (>=0.10.0)", "torchvision (>=0.15.0)"] -extra = ["bitsandbytes (>=0.42.0)", "hydra-core (>=1.0.5)", "jsonargparse[signatures] (>=4.27.7)", "matplotlib (>3.1)", "omegaconf (>=2.0.5)", "rich (>=12.3.0)", "tensorboardX (>=2.2)"] +extra = ["bitsandbytes (>=0.42.0)", "hydra-core (>=1.2.0)", "jsonargparse[signatures] (>=4.27.7)", "matplotlib (>3.1)", "omegaconf (>=2.2.3)", "rich (>=12.3.0)", "tensorboardX (>=2.2)"] strategies = ["deepspeed (>=0.8.2,<=0.9.3)"] test = ["cloudpickle (>=1.3)", "coverage (==7.3.1)", "fastapi", "onnx (>=0.14.0)", "onnxruntime (>=0.15.0)", "pandas (>1.0)", "psutil (<5.9.6)", "pytest (==7.4.0)", "pytest-cov (==4.1.0)", "pytest-random-order (==1.1.0)", "pytest-rerunfailures (==12.0)", "pytest-timeout (==2.1.0)", "scikit-learn (>0.22.1)", "tensorboard (>=2.9.1)", "uvicorn"] @@ -3006,6 +3010,7 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, @@ -3194,110 +3199,110 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "rpds-py" -version = "0.18.1" +version = "0.19.0" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.8" files = [ - {file = "rpds_py-0.18.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:d31dea506d718693b6b2cffc0648a8929bdc51c70a311b2770f09611caa10d53"}, - {file = "rpds_py-0.18.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:732672fbc449bab754e0b15356c077cc31566df874964d4801ab14f71951ea80"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a98a1f0552b5f227a3d6422dbd61bc6f30db170939bd87ed14f3c339aa6c7c9"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f1944ce16401aad1e3f7d312247b3d5de7981f634dc9dfe90da72b87d37887d"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38e14fb4e370885c4ecd734f093a2225ee52dc384b86fa55fe3f74638b2cfb09"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08d74b184f9ab6289b87b19fe6a6d1a97fbfea84b8a3e745e87a5de3029bf944"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d70129cef4a8d979caa37e7fe957202e7eee8ea02c5e16455bc9808a59c6b2f0"}, - {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ce0bb20e3a11bd04461324a6a798af34d503f8d6f1aa3d2aa8901ceaf039176d"}, - {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:81c5196a790032e0fc2464c0b4ab95f8610f96f1f2fa3d4deacce6a79852da60"}, - {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:f3027be483868c99b4985fda802a57a67fdf30c5d9a50338d9db646d590198da"}, - {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d44607f98caa2961bab4fa3c4309724b185b464cdc3ba6f3d7340bac3ec97cc1"}, - {file = "rpds_py-0.18.1-cp310-none-win32.whl", hash = "sha256:c273e795e7a0f1fddd46e1e3cb8be15634c29ae8ff31c196debb620e1edb9333"}, - {file = "rpds_py-0.18.1-cp310-none-win_amd64.whl", hash = "sha256:8352f48d511de5f973e4f2f9412736d7dea76c69faa6d36bcf885b50c758ab9a"}, - {file = "rpds_py-0.18.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6b5ff7e1d63a8281654b5e2896d7f08799378e594f09cf3674e832ecaf396ce8"}, - {file = "rpds_py-0.18.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8927638a4d4137a289e41d0fd631551e89fa346d6dbcfc31ad627557d03ceb6d"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:154bf5c93d79558b44e5b50cc354aa0459e518e83677791e6adb0b039b7aa6a7"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07f2139741e5deb2c5154a7b9629bc5aa48c766b643c1a6750d16f865a82c5fc"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c7672e9fba7425f79019db9945b16e308ed8bc89348c23d955c8c0540da0a07"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:489bdfe1abd0406eba6b3bb4fdc87c7fa40f1031de073d0cfb744634cc8fa261"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c20f05e8e3d4fc76875fc9cb8cf24b90a63f5a1b4c5b9273f0e8225e169b100"}, - {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:967342e045564cef76dfcf1edb700b1e20838d83b1aa02ab313e6a497cf923b8"}, - {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2cc7c1a47f3a63282ab0f422d90ddac4aa3034e39fc66a559ab93041e6505da7"}, - {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f7afbfee1157e0f9376c00bb232e80a60e59ed716e3211a80cb8506550671e6e"}, - {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9e6934d70dc50f9f8ea47081ceafdec09245fd9f6032669c3b45705dea096b88"}, - {file = "rpds_py-0.18.1-cp311-none-win32.whl", hash = "sha256:c69882964516dc143083d3795cb508e806b09fc3800fd0d4cddc1df6c36e76bb"}, - {file = "rpds_py-0.18.1-cp311-none-win_amd64.whl", hash = "sha256:70a838f7754483bcdc830444952fd89645569e7452e3226de4a613a4c1793fb2"}, - {file = "rpds_py-0.18.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3dd3cd86e1db5aadd334e011eba4e29d37a104b403e8ca24dcd6703c68ca55b3"}, - {file = "rpds_py-0.18.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:05f3d615099bd9b13ecf2fc9cf2d839ad3f20239c678f461c753e93755d629ee"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35b2b771b13eee8729a5049c976197ff58a27a3829c018a04341bcf1ae409b2b"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ee17cd26b97d537af8f33635ef38be873073d516fd425e80559f4585a7b90c43"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b646bf655b135ccf4522ed43d6902af37d3f5dbcf0da66c769a2b3938b9d8184"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19ba472b9606c36716062c023afa2484d1e4220548751bda14f725a7de17b4f6"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e30ac5e329098903262dc5bdd7e2086e0256aa762cc8b744f9e7bf2a427d3f8"}, - {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d58ad6317d188c43750cb76e9deacf6051d0f884d87dc6518e0280438648a9ac"}, - {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e1735502458621921cee039c47318cb90b51d532c2766593be6207eec53e5c4c"}, - {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f5bab211605d91db0e2995a17b5c6ee5edec1270e46223e513eaa20da20076ac"}, - {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2fc24a329a717f9e2448f8cd1f960f9dac4e45b6224d60734edeb67499bab03a"}, - {file = "rpds_py-0.18.1-cp312-none-win32.whl", hash = "sha256:1805d5901779662d599d0e2e4159d8a82c0b05faa86ef9222bf974572286b2b6"}, - {file = "rpds_py-0.18.1-cp312-none-win_amd64.whl", hash = "sha256:720edcb916df872d80f80a1cc5ea9058300b97721efda8651efcd938a9c70a72"}, - {file = "rpds_py-0.18.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:c827576e2fa017a081346dce87d532a5310241648eb3700af9a571a6e9fc7e74"}, - {file = "rpds_py-0.18.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:aa3679e751408d75a0b4d8d26d6647b6d9326f5e35c00a7ccd82b78ef64f65f8"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0abeee75434e2ee2d142d650d1e54ac1f8b01e6e6abdde8ffd6eeac6e9c38e20"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed402d6153c5d519a0faf1bb69898e97fb31613b49da27a84a13935ea9164dfc"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:338dee44b0cef8b70fd2ef54b4e09bb1b97fc6c3a58fea5db6cc083fd9fc2724"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7750569d9526199c5b97e5a9f8d96a13300950d910cf04a861d96f4273d5b104"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:607345bd5912aacc0c5a63d45a1f73fef29e697884f7e861094e443187c02be5"}, - {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:207c82978115baa1fd8d706d720b4a4d2b0913df1c78c85ba73fe6c5804505f0"}, - {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6d1e42d2735d437e7e80bab4d78eb2e459af48c0a46e686ea35f690b93db792d"}, - {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5463c47c08630007dc0fe99fb480ea4f34a89712410592380425a9b4e1611d8e"}, - {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:06d218939e1bf2ca50e6b0ec700ffe755e5216a8230ab3e87c059ebb4ea06afc"}, - {file = "rpds_py-0.18.1-cp38-none-win32.whl", hash = "sha256:312fe69b4fe1ffbe76520a7676b1e5ac06ddf7826d764cc10265c3b53f96dbe9"}, - {file = "rpds_py-0.18.1-cp38-none-win_amd64.whl", hash = "sha256:9437ca26784120a279f3137ee080b0e717012c42921eb07861b412340f85bae2"}, - {file = "rpds_py-0.18.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:19e515b78c3fc1039dd7da0a33c28c3154458f947f4dc198d3c72db2b6b5dc93"}, - {file = "rpds_py-0.18.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7b28c5b066bca9a4eb4e2f2663012debe680f097979d880657f00e1c30875a0"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:673fdbbf668dd958eff750e500495ef3f611e2ecc209464f661bc82e9838991e"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d960de62227635d2e61068f42a6cb6aae91a7fe00fca0e3aeed17667c8a34611"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:352a88dc7892f1da66b6027af06a2e7e5d53fe05924cc2cfc56495b586a10b72"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e0ee01ad8260184db21468a6e1c37afa0529acc12c3a697ee498d3c2c4dcaf3"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4c39ad2f512b4041343ea3c7894339e4ca7839ac38ca83d68a832fc8b3748ab"}, - {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aaa71ee43a703c321906813bb252f69524f02aa05bf4eec85f0c41d5d62d0f4c"}, - {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6cd8098517c64a85e790657e7b1e509b9fe07487fd358e19431cb120f7d96338"}, - {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:4adec039b8e2928983f885c53b7cc4cda8965b62b6596501a0308d2703f8af1b"}, - {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:32b7daaa3e9389db3695964ce8e566e3413b0c43e3394c05e4b243a4cd7bef26"}, - {file = "rpds_py-0.18.1-cp39-none-win32.whl", hash = "sha256:2625f03b105328729f9450c8badda34d5243231eef6535f80064d57035738360"}, - {file = "rpds_py-0.18.1-cp39-none-win_amd64.whl", hash = "sha256:bf18932d0003c8c4d51a39f244231986ab23ee057d235a12b2684ea26a353590"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cbfbea39ba64f5e53ae2915de36f130588bba71245b418060ec3330ebf85678e"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:a3d456ff2a6a4d2adcdf3c1c960a36f4fd2fec6e3b4902a42a384d17cf4e7a65"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7700936ef9d006b7ef605dc53aa364da2de5a3aa65516a1f3ce73bf82ecfc7ae"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:51584acc5916212e1bf45edd17f3a6b05fe0cbb40482d25e619f824dccb679de"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:942695a206a58d2575033ff1e42b12b2aece98d6003c6bc739fbf33d1773b12f"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b906b5f58892813e5ba5c6056d6a5ad08f358ba49f046d910ad992196ea61397"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6f8e3fecca256fefc91bb6765a693d96692459d7d4c644660a9fff32e517843"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7732770412bab81c5a9f6d20aeb60ae943a9b36dcd990d876a773526468e7163"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:bd1105b50ede37461c1d51b9698c4f4be6e13e69a908ab7751e3807985fc0346"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:618916f5535784960f3ecf8111581f4ad31d347c3de66d02e728de460a46303c"}, - {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:17c6d2155e2423f7e79e3bb18151c686d40db42d8645e7977442170c360194d4"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6c4c4c3f878df21faf5fac86eda32671c27889e13570645a9eea0a1abdd50922"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:fab6ce90574645a0d6c58890e9bcaac8d94dff54fb51c69e5522a7358b80ab64"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:531796fb842b53f2695e94dc338929e9f9dbf473b64710c28af5a160b2a8927d"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:740884bc62a5e2bbb31e584f5d23b32320fd75d79f916f15a788d527a5e83644"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:998125738de0158f088aef3cb264a34251908dd2e5d9966774fdab7402edfab7"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e2be6e9dd4111d5b31ba3b74d17da54a8319d8168890fbaea4b9e5c3de630ae5"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0cee71bc618cd93716f3c1bf56653740d2d13ddbd47673efa8bf41435a60daa"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2c3caec4ec5cd1d18e5dd6ae5194d24ed12785212a90b37f5f7f06b8bedd7139"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:27bba383e8c5231cd559affe169ca0b96ec78d39909ffd817f28b166d7ddd4d8"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:a888e8bdb45916234b99da2d859566f1e8a1d2275a801bb8e4a9644e3c7e7909"}, - {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6031b25fb1b06327b43d841f33842b383beba399884f8228a6bb3df3088485ff"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48c2faaa8adfacefcbfdb5f2e2e7bdad081e5ace8d182e5f4ade971f128e6bb3"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:d85164315bd68c0806768dc6bb0429c6f95c354f87485ee3593c4f6b14def2bd"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6afd80f6c79893cfc0574956f78a0add8c76e3696f2d6a15bca2c66c415cf2d4"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa242ac1ff583e4ec7771141606aafc92b361cd90a05c30d93e343a0c2d82a89"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21be4770ff4e08698e1e8e0bce06edb6ea0626e7c8f560bc08222880aca6a6f"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c45a639e93a0c5d4b788b2613bd637468edd62f8f95ebc6fcc303d58ab3f0a8"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:910e71711d1055b2768181efa0a17537b2622afeb0424116619817007f8a2b10"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b9bb1f182a97880f6078283b3505a707057c42bf55d8fca604f70dedfdc0772a"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1d54f74f40b1f7aaa595a02ff42ef38ca654b1469bef7d52867da474243cc633"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:8d2e182c9ee01135e11e9676e9a62dfad791a7a467738f06726872374a83db49"}, - {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:636a15acc588f70fda1661234761f9ed9ad79ebed3f2125d44be0862708b666e"}, - {file = "rpds_py-0.18.1.tar.gz", hash = "sha256:dc48b479d540770c811fbd1eb9ba2bb66951863e448efec2e2c102625328e92f"}, + {file = "rpds_py-0.19.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:fb37bd599f031f1a6fb9e58ec62864ccf3ad549cf14bac527dbfa97123edcca4"}, + {file = "rpds_py-0.19.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3384d278df99ec2c6acf701d067147320b864ef6727405d6470838476e44d9e8"}, + {file = "rpds_py-0.19.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e54548e0be3ac117595408fd4ca0ac9278fde89829b0b518be92863b17ff67a2"}, + {file = "rpds_py-0.19.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8eb488ef928cdbc05a27245e52de73c0d7c72a34240ef4d9893fdf65a8c1a955"}, + {file = "rpds_py-0.19.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a5da93debdfe27b2bfc69eefb592e1831d957b9535e0943a0ee8b97996de21b5"}, + {file = "rpds_py-0.19.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:79e205c70afddd41f6ee79a8656aec738492a550247a7af697d5bd1aee14f766"}, + {file = "rpds_py-0.19.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:959179efb3e4a27610e8d54d667c02a9feaa86bbabaf63efa7faa4dfa780d4f1"}, + {file = "rpds_py-0.19.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a6e605bb9edcf010f54f8b6a590dd23a4b40a8cb141255eec2a03db249bc915b"}, + {file = "rpds_py-0.19.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9133d75dc119a61d1a0ded38fb9ba40a00ef41697cc07adb6ae098c875195a3f"}, + {file = "rpds_py-0.19.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dd36b712d35e757e28bf2f40a71e8f8a2d43c8b026d881aa0c617b450d6865c9"}, + {file = "rpds_py-0.19.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:354f3a91718489912f2e0fc331c24eaaf6a4565c080e00fbedb6015857c00582"}, + {file = "rpds_py-0.19.0-cp310-none-win32.whl", hash = "sha256:ebcbf356bf5c51afc3290e491d3722b26aaf5b6af3c1c7f6a1b757828a46e336"}, + {file = "rpds_py-0.19.0-cp310-none-win_amd64.whl", hash = "sha256:75a6076289b2df6c8ecb9d13ff79ae0cad1d5fb40af377a5021016d58cd691ec"}, + {file = "rpds_py-0.19.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6d45080095e585f8c5097897313def60caa2046da202cdb17a01f147fb263b81"}, + {file = "rpds_py-0.19.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c5c9581019c96f865483d031691a5ff1cc455feb4d84fc6920a5ffc48a794d8a"}, + {file = "rpds_py-0.19.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1540d807364c84516417115c38f0119dfec5ea5c0dd9a25332dea60b1d26fc4d"}, + {file = "rpds_py-0.19.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9e65489222b410f79711dc3d2d5003d2757e30874096b2008d50329ea4d0f88c"}, + {file = "rpds_py-0.19.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9da6f400eeb8c36f72ef6646ea530d6d175a4f77ff2ed8dfd6352842274c1d8b"}, + {file = "rpds_py-0.19.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:37f46bb11858717e0efa7893c0f7055c43b44c103e40e69442db5061cb26ed34"}, + {file = "rpds_py-0.19.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:071d4adc734de562bd11d43bd134330fb6249769b2f66b9310dab7460f4bf714"}, + {file = "rpds_py-0.19.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9625367c8955e4319049113ea4f8fee0c6c1145192d57946c6ffcd8fe8bf48dd"}, + {file = "rpds_py-0.19.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e19509145275d46bc4d1e16af0b57a12d227c8253655a46bbd5ec317e941279d"}, + {file = "rpds_py-0.19.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d438e4c020d8c39961deaf58f6913b1bf8832d9b6f62ec35bd93e97807e9cbc"}, + {file = "rpds_py-0.19.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:90bf55d9d139e5d127193170f38c584ed3c79e16638890d2e36f23aa1630b952"}, + {file = "rpds_py-0.19.0-cp311-none-win32.whl", hash = "sha256:8d6ad132b1bc13d05ffe5b85e7a01a3998bf3a6302ba594b28d61b8c2cf13aaf"}, + {file = "rpds_py-0.19.0-cp311-none-win_amd64.whl", hash = "sha256:7ec72df7354e6b7f6eb2a17fa6901350018c3a9ad78e48d7b2b54d0412539a67"}, + {file = "rpds_py-0.19.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:5095a7c838a8647c32aa37c3a460d2c48debff7fc26e1136aee60100a8cd8f68"}, + {file = "rpds_py-0.19.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f2f78ef14077e08856e788fa482107aa602636c16c25bdf59c22ea525a785e9"}, + {file = "rpds_py-0.19.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7cc6cb44f8636fbf4a934ca72f3e786ba3c9f9ba4f4d74611e7da80684e48d2"}, + {file = "rpds_py-0.19.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cf902878b4af334a09de7a45badbff0389e7cf8dc2e4dcf5f07125d0b7c2656d"}, + {file = "rpds_py-0.19.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:688aa6b8aa724db1596514751ffb767766e02e5c4a87486ab36b8e1ebc1aedac"}, + {file = "rpds_py-0.19.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57dbc9167d48e355e2569346b5aa4077f29bf86389c924df25c0a8b9124461fb"}, + {file = "rpds_py-0.19.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b4cf5a9497874822341c2ebe0d5850fed392034caadc0bad134ab6822c0925b"}, + {file = "rpds_py-0.19.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8a790d235b9d39c70a466200d506bb33a98e2ee374a9b4eec7a8ac64c2c261fa"}, + {file = "rpds_py-0.19.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1d16089dfa58719c98a1c06f2daceba6d8e3fb9b5d7931af4a990a3c486241cb"}, + {file = "rpds_py-0.19.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:bc9128e74fe94650367fe23f37074f121b9f796cabbd2f928f13e9661837296d"}, + {file = "rpds_py-0.19.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c8f77e661ffd96ff104bebf7d0f3255b02aa5d5b28326f5408d6284c4a8b3248"}, + {file = "rpds_py-0.19.0-cp312-none-win32.whl", hash = "sha256:5f83689a38e76969327e9b682be5521d87a0c9e5a2e187d2bc6be4765f0d4600"}, + {file = "rpds_py-0.19.0-cp312-none-win_amd64.whl", hash = "sha256:06925c50f86da0596b9c3c64c3837b2481337b83ef3519e5db2701df695453a4"}, + {file = "rpds_py-0.19.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:52e466bea6f8f3a44b1234570244b1cff45150f59a4acae3fcc5fd700c2993ca"}, + {file = "rpds_py-0.19.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e21cc693045fda7f745c790cb687958161ce172ffe3c5719ca1764e752237d16"}, + {file = "rpds_py-0.19.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b31f059878eb1f5da8b2fd82480cc18bed8dcd7fb8fe68370e2e6285fa86da6"}, + {file = "rpds_py-0.19.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1dd46f309e953927dd018567d6a9e2fb84783963650171f6c5fe7e5c41fd5666"}, + {file = "rpds_py-0.19.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:34a01a4490e170376cd79258b7f755fa13b1a6c3667e872c8e35051ae857a92b"}, + {file = "rpds_py-0.19.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bcf426a8c38eb57f7bf28932e68425ba86def6e756a5b8cb4731d8e62e4e0223"}, + {file = "rpds_py-0.19.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f68eea5df6347d3f1378ce992d86b2af16ad7ff4dcb4a19ccdc23dea901b87fb"}, + {file = "rpds_py-0.19.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dab8d921b55a28287733263c0e4c7db11b3ee22aee158a4de09f13c93283c62d"}, + {file = "rpds_py-0.19.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6fe87efd7f47266dfc42fe76dae89060038f1d9cb911f89ae7e5084148d1cc08"}, + {file = "rpds_py-0.19.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:535d4b52524a961d220875688159277f0e9eeeda0ac45e766092bfb54437543f"}, + {file = "rpds_py-0.19.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:8b1a94b8afc154fbe36978a511a1f155f9bd97664e4f1f7a374d72e180ceb0ae"}, + {file = "rpds_py-0.19.0-cp38-none-win32.whl", hash = "sha256:7c98298a15d6b90c8f6e3caa6457f4f022423caa5fa1a1ca7a5e9e512bdb77a4"}, + {file = "rpds_py-0.19.0-cp38-none-win_amd64.whl", hash = "sha256:b0da31853ab6e58a11db3205729133ce0df26e6804e93079dee095be3d681dc1"}, + {file = "rpds_py-0.19.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:5039e3cef7b3e7a060de468a4a60a60a1f31786da94c6cb054e7a3c75906111c"}, + {file = "rpds_py-0.19.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab1932ca6cb8c7499a4d87cb21ccc0d3326f172cfb6a64021a889b591bb3045c"}, + {file = "rpds_py-0.19.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2afd2164a1e85226fcb6a1da77a5c8896c18bfe08e82e8ceced5181c42d2179"}, + {file = "rpds_py-0.19.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b1c30841f5040de47a0046c243fc1b44ddc87d1b12435a43b8edff7e7cb1e0d0"}, + {file = "rpds_py-0.19.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f757f359f30ec7dcebca662a6bd46d1098f8b9fb1fcd661a9e13f2e8ce343ba1"}, + {file = "rpds_py-0.19.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15e65395a59d2e0e96caf8ee5389ffb4604e980479c32742936ddd7ade914b22"}, + {file = "rpds_py-0.19.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb0f6eb3a320f24b94d177e62f4074ff438f2ad9d27e75a46221904ef21a7b05"}, + {file = "rpds_py-0.19.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b228e693a2559888790936e20f5f88b6e9f8162c681830eda303bad7517b4d5a"}, + {file = "rpds_py-0.19.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2575efaa5d949c9f4e2cdbe7d805d02122c16065bfb8d95c129372d65a291a0b"}, + {file = "rpds_py-0.19.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:5c872814b77a4e84afa293a1bee08c14daed1068b2bb1cc312edbf020bbbca2b"}, + {file = "rpds_py-0.19.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:850720e1b383df199b8433a20e02b25b72f0fded28bc03c5bd79e2ce7ef050be"}, + {file = "rpds_py-0.19.0-cp39-none-win32.whl", hash = "sha256:ce84a7efa5af9f54c0aa7692c45861c1667080814286cacb9958c07fc50294fb"}, + {file = "rpds_py-0.19.0-cp39-none-win_amd64.whl", hash = "sha256:1c26da90b8d06227d7769f34915913911222d24ce08c0ab2d60b354e2d9c7aff"}, + {file = "rpds_py-0.19.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:75969cf900d7be665ccb1622a9aba225cf386bbc9c3bcfeeab9f62b5048f4a07"}, + {file = "rpds_py-0.19.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8445f23f13339da640d1be8e44e5baf4af97e396882ebbf1692aecd67f67c479"}, + {file = "rpds_py-0.19.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5a7c1062ef8aea3eda149f08120f10795835fc1c8bc6ad948fb9652a113ca55"}, + {file = "rpds_py-0.19.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:462b0c18fbb48fdbf980914a02ee38c423a25fcc4cf40f66bacc95a2d2d73bc8"}, + {file = "rpds_py-0.19.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3208f9aea18991ac7f2b39721e947bbd752a1abbe79ad90d9b6a84a74d44409b"}, + {file = "rpds_py-0.19.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3444fe52b82f122d8a99bf66777aed6b858d392b12f4c317da19f8234db4533"}, + {file = "rpds_py-0.19.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88cb4bac7185a9f0168d38c01d7a00addece9822a52870eee26b8d5b61409213"}, + {file = "rpds_py-0.19.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6b130bd4163c93798a6b9bb96be64a7c43e1cec81126ffa7ffaa106e1fc5cef5"}, + {file = "rpds_py-0.19.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:a707b158b4410aefb6b054715545bbb21aaa5d5d0080217290131c49c2124a6e"}, + {file = "rpds_py-0.19.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:dc9ac4659456bde7c567107556ab065801622396b435a3ff213daef27b495388"}, + {file = "rpds_py-0.19.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:81ea573aa46d3b6b3d890cd3c0ad82105985e6058a4baed03cf92518081eec8c"}, + {file = "rpds_py-0.19.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3f148c3f47f7f29a79c38cc5d020edcb5ca780020fab94dbc21f9af95c463581"}, + {file = "rpds_py-0.19.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:b0906357f90784a66e89ae3eadc2654f36c580a7d65cf63e6a616e4aec3a81be"}, + {file = "rpds_py-0.19.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f629ecc2db6a4736b5ba95a8347b0089240d69ad14ac364f557d52ad68cf94b0"}, + {file = "rpds_py-0.19.0-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c6feacd1d178c30e5bc37184526e56740342fd2aa6371a28367bad7908d454fc"}, + {file = "rpds_py-0.19.0-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae8b6068ee374fdfab63689be0963333aa83b0815ead5d8648389a8ded593378"}, + {file = "rpds_py-0.19.0-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78d57546bad81e0da13263e4c9ce30e96dcbe720dbff5ada08d2600a3502e526"}, + {file = "rpds_py-0.19.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8b6683a37338818646af718c9ca2a07f89787551057fae57c4ec0446dc6224b"}, + {file = "rpds_py-0.19.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e8481b946792415adc07410420d6fc65a352b45d347b78fec45d8f8f0d7496f0"}, + {file = "rpds_py-0.19.0-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:bec35eb20792ea64c3c57891bc3ca0bedb2884fbac2c8249d9b731447ecde4fa"}, + {file = "rpds_py-0.19.0-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:aa5476c3e3a402c37779e95f7b4048db2cb5b0ed0b9d006983965e93f40fe05a"}, + {file = "rpds_py-0.19.0-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:19d02c45f2507b489fd4df7b827940f1420480b3e2e471e952af4d44a1ea8e34"}, + {file = "rpds_py-0.19.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a3e2fd14c5d49ee1da322672375963f19f32b3d5953f0615b175ff7b9d38daed"}, + {file = "rpds_py-0.19.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:93a91c2640645303e874eada51f4f33351b84b351a689d470f8108d0e0694210"}, + {file = "rpds_py-0.19.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5b9fc03bf76a94065299d4a2ecd8dfbae4ae8e2e8098bbfa6ab6413ca267709"}, + {file = "rpds_py-0.19.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5a4b07cdf3f84310c08c1de2c12ddadbb7a77568bcb16e95489f9c81074322ed"}, + {file = "rpds_py-0.19.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba0ed0dc6763d8bd6e5de5cf0d746d28e706a10b615ea382ac0ab17bb7388633"}, + {file = "rpds_py-0.19.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:474bc83233abdcf2124ed3f66230a1c8435896046caa4b0b5ab6013c640803cc"}, + {file = "rpds_py-0.19.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:329c719d31362355a96b435f4653e3b4b061fcc9eba9f91dd40804ca637d914e"}, + {file = "rpds_py-0.19.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ef9101f3f7b59043a34f1dccbb385ca760467590951952d6701df0da9893ca0c"}, + {file = "rpds_py-0.19.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:0121803b0f424ee2109d6e1f27db45b166ebaa4b32ff47d6aa225642636cd834"}, + {file = "rpds_py-0.19.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:8344127403dea42f5970adccf6c5957a71a47f522171fafaf4c6ddb41b61703a"}, + {file = "rpds_py-0.19.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:443cec402ddd650bb2b885113e1dcedb22b1175c6be223b14246a714b61cd521"}, + {file = "rpds_py-0.19.0.tar.gz", hash = "sha256:4fdc9afadbeb393b4bbbad75481e0ea78e4469f2e1d713a90811700830b553a9"}, ] [[package]] @@ -3350,32 +3355,32 @@ test = ["asv", "matplotlib (>=3.5)", "numpydoc (>=1.5)", "pooch (>=1.6.0)", "pyt [[package]] name = "scikit-learn" -version = "1.5.0" +version = "1.5.1" description = "A set of python modules for machine learning and data mining" optional = false python-versions = ">=3.9" files = [ - {file = "scikit_learn-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:12e40ac48555e6b551f0a0a5743cc94cc5a765c9513fe708e01f0aa001da2801"}, - {file = "scikit_learn-1.5.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:f405c4dae288f5f6553b10c4ac9ea7754d5180ec11e296464adb5d6ac68b6ef5"}, - {file = "scikit_learn-1.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df8ccabbf583315f13160a4bb06037bde99ea7d8211a69787a6b7c5d4ebb6fc3"}, - {file = "scikit_learn-1.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c75ea812cd83b1385bbfa94ae971f0d80adb338a9523f6bbcb5e0b0381151d4"}, - {file = "scikit_learn-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:a90c5da84829a0b9b4bf00daf62754b2be741e66b5946911f5bdfaa869fcedd6"}, - {file = "scikit_learn-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2a65af2d8a6cce4e163a7951a4cfbfa7fceb2d5c013a4b593686c7f16445cf9d"}, - {file = "scikit_learn-1.5.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:4c0c56c3005f2ec1db3787aeaabefa96256580678cec783986836fc64f8ff622"}, - {file = "scikit_learn-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f77547165c00625551e5c250cefa3f03f2fc92c5e18668abd90bfc4be2e0bff"}, - {file = "scikit_learn-1.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:118a8d229a41158c9f90093e46b3737120a165181a1b58c03461447aa4657415"}, - {file = "scikit_learn-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:a03b09f9f7f09ffe8c5efffe2e9de1196c696d811be6798ad5eddf323c6f4d40"}, - {file = "scikit_learn-1.5.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:460806030c666addee1f074788b3978329a5bfdc9b7d63e7aad3f6d45c67a210"}, - {file = "scikit_learn-1.5.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:1b94d6440603752b27842eda97f6395f570941857456c606eb1d638efdb38184"}, - {file = "scikit_learn-1.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d82c2e573f0f2f2f0be897e7a31fcf4e73869247738ab8c3ce7245549af58ab8"}, - {file = "scikit_learn-1.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3a10e1d9e834e84d05e468ec501a356226338778769317ee0b84043c0d8fb06"}, - {file = "scikit_learn-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:855fc5fa8ed9e4f08291203af3d3e5fbdc4737bd617a371559aaa2088166046e"}, - {file = "scikit_learn-1.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:40fb7d4a9a2db07e6e0cae4dc7bdbb8fada17043bac24104d8165e10e4cff1a2"}, - {file = "scikit_learn-1.5.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:47132440050b1c5beb95f8ba0b2402bbd9057ce96ec0ba86f2f445dd4f34df67"}, - {file = "scikit_learn-1.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:174beb56e3e881c90424e21f576fa69c4ffcf5174632a79ab4461c4c960315ac"}, - {file = "scikit_learn-1.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261fe334ca48f09ed64b8fae13f9b46cc43ac5f580c4a605cbb0a517456c8f71"}, - {file = "scikit_learn-1.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:057b991ac64b3e75c9c04b5f9395eaf19a6179244c089afdebaad98264bff37c"}, - {file = "scikit_learn-1.5.0.tar.gz", hash = "sha256:789e3db01c750ed6d496fa2db7d50637857b451e57bcae863bff707c1247bef7"}, + {file = "scikit_learn-1.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:781586c414f8cc58e71da4f3d7af311e0505a683e112f2f62919e3019abd3745"}, + {file = "scikit_learn-1.5.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:f5b213bc29cc30a89a3130393b0e39c847a15d769d6e59539cd86b75d276b1a7"}, + {file = "scikit_learn-1.5.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ff4ba34c2abff5ec59c803ed1d97d61b036f659a17f55be102679e88f926fac"}, + {file = "scikit_learn-1.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:161808750c267b77b4a9603cf9c93579c7a74ba8486b1336034c2f1579546d21"}, + {file = "scikit_learn-1.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:10e49170691514a94bb2e03787aa921b82dbc507a4ea1f20fd95557862c98dc1"}, + {file = "scikit_learn-1.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:154297ee43c0b83af12464adeab378dee2d0a700ccd03979e2b821e7dd7cc1c2"}, + {file = "scikit_learn-1.5.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:b5e865e9bd59396220de49cb4a57b17016256637c61b4c5cc81aaf16bc123bbe"}, + {file = "scikit_learn-1.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:909144d50f367a513cee6090873ae582dba019cb3fca063b38054fa42704c3a4"}, + {file = "scikit_learn-1.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:689b6f74b2c880276e365fe84fe4f1befd6a774f016339c65655eaff12e10cbf"}, + {file = "scikit_learn-1.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:9a07f90846313a7639af6a019d849ff72baadfa4c74c778821ae0fad07b7275b"}, + {file = "scikit_learn-1.5.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5944ce1faada31c55fb2ba20a5346b88e36811aab504ccafb9f0339e9f780395"}, + {file = "scikit_learn-1.5.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:0828673c5b520e879f2af6a9e99eee0eefea69a2188be1ca68a6121b809055c1"}, + {file = "scikit_learn-1.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:508907e5f81390e16d754e8815f7497e52139162fd69c4fdbd2dfa5d6cc88915"}, + {file = "scikit_learn-1.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97625f217c5c0c5d0505fa2af28ae424bd37949bb2f16ace3ff5f2f81fb4498b"}, + {file = "scikit_learn-1.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:da3f404e9e284d2b0a157e1b56b6566a34eb2798205cba35a211df3296ab7a74"}, + {file = "scikit_learn-1.5.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:88e0672c7ac21eb149d409c74cc29f1d611d5158175846e7a9c2427bd12b3956"}, + {file = "scikit_learn-1.5.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:7b073a27797a283187a4ef4ee149959defc350b46cbf63a84d8514fe16b69855"}, + {file = "scikit_learn-1.5.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b59e3e62d2be870e5c74af4e793293753565c7383ae82943b83383fdcf5cc5c1"}, + {file = "scikit_learn-1.5.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bd8d3a19d4bd6dc5a7d4f358c8c3a60934dc058f363c34c0ac1e9e12a31421d"}, + {file = "scikit_learn-1.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:5f57428de0c900a98389c4a433d4a3cf89de979b3aa24d1c1d251802aa15e44d"}, + {file = "scikit_learn-1.5.1.tar.gz", hash = "sha256:0ea5d40c0e3951df445721927448755d3fe1d80833b0b7308ebff5d2a45e6414"}, ] [package.dependencies] @@ -3386,8 +3391,8 @@ threadpoolctl = ">=3.1.0" [package.extras] benchmark = ["matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "pandas (>=1.1.5)"] -build = ["cython (>=3.0.10)", "meson-python (>=0.15.0)", "numpy (>=1.19.5)", "scipy (>=1.6.0)"] -docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "polars (>=0.20.23)", "pooch (>=1.6.0)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)", "sphinx (>=6.0.0)", "sphinx-copybutton (>=0.5.2)", "sphinx-gallery (>=0.15.0)", "sphinx-prompt (>=1.3.0)", "sphinxext-opengraph (>=0.4.2)"] +build = ["cython (>=3.0.10)", "meson-python (>=0.16.0)", "numpy (>=1.19.5)", "scipy (>=1.6.0)"] +docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.3.4)", "memory_profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "polars (>=0.20.23)", "pooch (>=1.6.0)", "pydata-sphinx-theme (>=0.15.3)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)", "sphinx (>=7.3.7)", "sphinx-copybutton (>=0.5.2)", "sphinx-design (>=0.5.0)", "sphinx-gallery (>=0.16.0)", "sphinx-prompt (>=1.4.0)", "sphinx-remove-toctrees (>=1.0.0.post1)", "sphinxcontrib-sass (>=0.3.4)", "sphinxext-opengraph (>=0.9.1)"] examples = ["matplotlib (>=3.3.4)", "pandas (>=1.1.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.17.2)", "seaborn (>=0.9.0)"] install = ["joblib (>=1.2.0)", "numpy (>=1.19.5)", "scipy (>=1.6.0)", "threadpoolctl (>=3.1.0)"] maintenance = ["conda-lock (==2.5.6)"] @@ -3437,13 +3442,13 @@ test = ["array-api-strict", "asv", "gmpy2", "hypothesis (>=6.30)", "mpmath", "po [[package]] name = "sentry-sdk" -version = "2.7.0" +version = "2.11.0" description = "Python client for Sentry (https://sentry.io)" optional = false python-versions = ">=3.6" files = [ - {file = "sentry_sdk-2.7.0-py2.py3-none-any.whl", hash = "sha256:db9594c27a4d21c1ebad09908b1f0dc808ef65c2b89c1c8e7e455143262e37c1"}, - {file = "sentry_sdk-2.7.0.tar.gz", hash = "sha256:d846a211d4a0378b289ced3c434480945f110d0ede00450ba631fc2852e7a0d4"}, + {file = "sentry_sdk-2.11.0-py2.py3-none-any.whl", hash = "sha256:d964710e2dbe015d9dc4ff0ad16225d68c3b36936b742a6fe0504565b760a3b7"}, + {file = "sentry_sdk-2.11.0.tar.gz", hash = "sha256:4ca16e9f5c7c6bc2fb2d5c956219f4926b148e511fffdbbde711dc94f1e0468f"}, ] [package.dependencies] @@ -3483,7 +3488,7 @@ sanic = ["sanic (>=0.8)"] sqlalchemy = ["sqlalchemy (>=1.2)"] starlette = ["starlette (>=0.19.1)"] starlite = ["starlite (>=1.48)"] -tornado = ["tornado (>=5)"] +tornado = ["tornado (>=6)"] [[package]] name = "setproctitle" @@ -3587,18 +3592,19 @@ test = ["pytest"] [[package]] name = "setuptools" -version = "70.1.1" +version = "71.1.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-70.1.1-py3-none-any.whl", hash = "sha256:a58a8fde0541dab0419750bcc521fbdf8585f6e5cb41909df3a472ef7b81ca95"}, - {file = "setuptools-70.1.1.tar.gz", hash = "sha256:937a48c7cdb7a21eb53cd7f9b59e525503aa8abaf3584c730dc5f7a5bec3a650"}, + {file = "setuptools-71.1.0-py3-none-any.whl", hash = "sha256:33874fdc59b3188304b2e7c80d9029097ea31627180896fb549c578ceb8a0855"}, + {file = "setuptools-71.1.0.tar.gz", hash = "sha256:032d42ee9fb536e33087fb66cac5f840eb9391ed05637b3f2a76a7c8fb477936"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.10.0)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.text (>=3.7)", "more-itertools (>=8.8)", "ordered-set (>=3.1.1)", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.11.*)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (<0.4)", "pytest-ruff (>=0.2.1)", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "six" @@ -3635,27 +3641,27 @@ files = [ [[package]] name = "sphinx" -version = "7.3.7" +version = "7.4.7" description = "Python documentation generator" optional = false python-versions = ">=3.9" files = [ - {file = "sphinx-7.3.7-py3-none-any.whl", hash = "sha256:413f75440be4cacf328f580b4274ada4565fb2187d696a84970c23f77b64d8c3"}, - {file = "sphinx-7.3.7.tar.gz", hash = "sha256:a4a7db75ed37531c05002d56ed6948d4c42f473a36f46e1382b0bd76ca9627bc"}, + {file = "sphinx-7.4.7-py3-none-any.whl", hash = "sha256:c2419e2135d11f1951cd994d6eb18a1835bd8fdd8429f9ca375dc1f3281bd239"}, + {file = "sphinx-7.4.7.tar.gz", hash = "sha256:242f92a7ea7e6c5b406fdc2615413890ba9f699114a9c09192d7dfead2ee9cfe"}, ] [package.dependencies] alabaster = ">=0.7.14,<0.8.0" -babel = ">=2.9" -colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} -docutils = ">=0.18.1,<0.22" +babel = ">=2.13" +colorama = {version = ">=0.4.6", markers = "sys_platform == \"win32\""} +docutils = ">=0.20,<0.22" imagesize = ">=1.3" -importlib-metadata = {version = ">=4.8", markers = "python_version < \"3.10\""} -Jinja2 = ">=3.0" -packaging = ">=21.0" -Pygments = ">=2.14" -requests = ">=2.25.0" -snowballstemmer = ">=2.0" +importlib-metadata = {version = ">=6.0", markers = "python_version < \"3.10\""} +Jinja2 = ">=3.1" +packaging = ">=23.0" +Pygments = ">=2.17" +requests = ">=2.30.0" +snowballstemmer = ">=2.2" sphinxcontrib-applehelp = "*" sphinxcontrib-devhelp = "*" sphinxcontrib-htmlhelp = ">=2.0.0" @@ -3666,18 +3672,18 @@ tomli = {version = ">=2", markers = "python_version < \"3.11\""} [package.extras] docs = ["sphinxcontrib-websupport"] -lint = ["flake8 (>=3.5.0)", "importlib_metadata", "mypy (==1.9.0)", "pytest (>=6.0)", "ruff (==0.3.7)", "sphinx-lint", "tomli", "types-docutils", "types-requests"] -test = ["cython (>=3.0)", "defusedxml (>=0.7.1)", "pytest (>=6.0)", "setuptools (>=67.0)"] +lint = ["flake8 (>=6.0)", "importlib-metadata (>=6.0)", "mypy (==1.10.1)", "pytest (>=6.0)", "ruff (==0.5.2)", "sphinx-lint (>=0.9)", "tomli (>=2)", "types-docutils (==0.21.0.20240711)", "types-requests (>=2.30.0)"] +test = ["cython (>=3.0)", "defusedxml (>=0.7.1)", "pytest (>=8.0)", "setuptools (>=70.0)", "typing_extensions (>=4.9)"] [[package]] name = "sphinx-autodoc-typehints" -version = "2.2.2" +version = "2.2.3" description = "Type hints (PEP 484) support for the Sphinx autodoc extension" optional = false python-versions = ">=3.9" files = [ - {file = "sphinx_autodoc_typehints-2.2.2-py3-none-any.whl", hash = "sha256:b98337a8530c95b73ba0c65465847a8ab0a13403bdc81294d5ef396bbd1f783e"}, - {file = "sphinx_autodoc_typehints-2.2.2.tar.gz", hash = "sha256:128e600eeef63b722f3d8dac6403594592c8cade3ba66fd11dcb997465ee259d"}, + {file = "sphinx_autodoc_typehints-2.2.3-py3-none-any.whl", hash = "sha256:b7058e8c5831e5598afca1a78fda0695d3291388d954464a6e480c36198680c0"}, + {file = "sphinx_autodoc_typehints-2.2.3.tar.gz", hash = "sha256:fde3d888949bd0a91207cf1e54afda58121dbb4bf1f183d0cc78a0826654c974"}, ] [package.dependencies] @@ -3741,13 +3747,13 @@ test = ["pytest"] [[package]] name = "sphinxcontrib-htmlhelp" -version = "2.0.5" +version = "2.0.6" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_htmlhelp-2.0.5-py3-none-any.whl", hash = "sha256:393f04f112b4d2f53d93448d4bce35842f62b307ccdc549ec1585e950bc35e04"}, - {file = "sphinxcontrib_htmlhelp-2.0.5.tar.gz", hash = "sha256:0dc87637d5de53dd5eec3a6a01753b1ccf99494bd756aafecd74b4fa9e729015"}, + {file = "sphinxcontrib_htmlhelp-2.0.6-py3-none-any.whl", hash = "sha256:1b9af5a2671a61410a868fce050cab7ca393c218e6205cbc7f590136f207395c"}, + {file = "sphinxcontrib_htmlhelp-2.0.6.tar.gz", hash = "sha256:c6597da06185f0e3b4dc952777a04200611ef563882e0c244d27a15ee22afa73"}, ] [package.extras] @@ -3785,19 +3791,19 @@ test = ["flake8", "mypy", "pytest"] [[package]] name = "sphinxcontrib-qthelp" -version = "1.0.7" +version = "1.0.8" description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" optional = false python-versions = ">=3.9" files = [ - {file = "sphinxcontrib_qthelp-1.0.7-py3-none-any.whl", hash = "sha256:e2ae3b5c492d58fcbd73281fbd27e34b8393ec34a073c792642cd8e529288182"}, - {file = "sphinxcontrib_qthelp-1.0.7.tar.gz", hash = "sha256:053dedc38823a80a7209a80860b16b722e9e0209e32fea98c90e4e6624588ed6"}, + {file = "sphinxcontrib_qthelp-1.0.8-py3-none-any.whl", hash = "sha256:323d6acc4189af76dfe94edd2a27d458902319b60fcca2aeef3b2180c106a75f"}, + {file = "sphinxcontrib_qthelp-1.0.8.tar.gz", hash = "sha256:db3f8fa10789c7a8e76d173c23364bdf0ebcd9449969a9e6a3dd31b8b7469f03"}, ] [package.extras] lint = ["docutils-stubs", "flake8", "mypy"] standalone = ["Sphinx (>=5)"] -test = ["pytest"] +test = ["defusedxml (>=0.7.1)", "pytest"] [[package]] name = "sphinxcontrib-serializinghtml" @@ -3836,17 +3842,20 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] [[package]] name = "sympy" -version = "1.12.1" +version = "1.13.1" description = "Computer algebra system (CAS) in Python" optional = false python-versions = ">=3.8" files = [ - {file = "sympy-1.12.1-py3-none-any.whl", hash = "sha256:9b2cbc7f1a640289430e13d2a56f02f867a1da0190f2f99d8968c2f74da0e515"}, - {file = "sympy-1.12.1.tar.gz", hash = "sha256:2877b03f998cd8c08f07cd0de5b767119cd3ef40d09f41c30d722f6686b0fb88"}, + {file = "sympy-1.13.1-py3-none-any.whl", hash = "sha256:db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8"}, + {file = "sympy-1.13.1.tar.gz", hash = "sha256:9cebf7e04ff162015ce31c9c6c9144daa34a93bd082f54fd8f12deca4f47515f"}, ] [package.dependencies] -mpmath = ">=1.1.0,<1.4.0" +mpmath = ">=1.1.0,<1.4" + +[package.extras] +dev = ["hypothesis (>=6.70.0)", "pytest (>=7.1.0)"] [[package]] name = "tbb" @@ -3907,13 +3916,13 @@ files = [ [[package]] name = "tifffile" -version = "2024.6.18" +version = "2024.7.24" description = "Read and write TIFF files" optional = false python-versions = ">=3.9" files = [ - {file = "tifffile-2024.6.18-py3-none-any.whl", hash = "sha256:67299c0445fc47463bbc71f3cb4676da2ab0242b0c6c6542a0680801b4b97d8a"}, - {file = "tifffile-2024.6.18.tar.gz", hash = "sha256:57e0d2a034bcb6287ea3155d8716508dfac86443a257f6502b57ee7f8a33b3b6"}, + {file = "tifffile-2024.7.24-py3-none-any.whl", hash = "sha256:f5cce1a915c37bc44ae4a792e3b42c07a30a3fa88406f5c6060a3de076487ed1"}, + {file = "tifffile-2024.7.24.tar.gz", hash = "sha256:723456ebf2b4918878ae05a7b50fa366ff3b3a686293317eb7a0f294c3eea050"}, ] [package.dependencies] @@ -3921,6 +3930,10 @@ numpy = "*" [package.extras] all = ["defusedxml", "fsspec", "imagecodecs (>=2023.8.12)", "lxml", "matplotlib", "zarr"] +codecs = ["imagecodecs (>=2023.8.12)"] +plot = ["matplotlib"] +xml = ["defusedxml", "lxml"] +zarr = ["fsspec", "zarr"] [[package]] name = "tomli" @@ -4133,13 +4146,13 @@ tutorials = ["matplotlib", "pandas", "tabulate", "torch"] [[package]] name = "typeshed-client" -version = "2.5.1" +version = "2.7.0" description = "A library for accessing stubs in typeshed." optional = false python-versions = ">=3.8" files = [ - {file = "typeshed_client-2.5.1-py3-none-any.whl", hash = "sha256:8cc254766b38f949effd3c9d4e0934d706d787127d7aedcabc648e4f094f7292"}, - {file = "typeshed_client-2.5.1.tar.gz", hash = "sha256:6f1127f4853d216d5bfbb77260bb25e760fe00fcc67204a891be6c23471cd221"}, + {file = "typeshed_client-2.7.0-py3-none-any.whl", hash = "sha256:97084e5abc58a76ace2c4618ecaebd625f2d19bbd85aa1b3fb86216bf174bbea"}, + {file = "typeshed_client-2.7.0.tar.gz", hash = "sha256:e63df1e738588ad39f1226de042f4407ab6a99c456f0837063afd83b1415447c"}, ] [package.dependencies] @@ -4187,18 +4200,18 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "wandb" -version = "0.17.3" +version = "0.17.5" description = "A CLI and library for interacting with the Weights & Biases API." optional = false python-versions = ">=3.7" files = [ - {file = "wandb-0.17.3-py3-none-any.whl", hash = "sha256:df94581b299414c4929759b0d12578b00a84d3bb21bc01461edcb1a643b2719b"}, - {file = "wandb-0.17.3-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:f6fe865b9ed7db74d67660973abaa236bbe469019a37b50d44a1be372122aced"}, - {file = "wandb-0.17.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:36c4688c70bcd1d39e1575ab1664b22f67b40f685b087847f867b6e9302cd963"}, - {file = "wandb-0.17.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b69eb8148dca4f04d1e9c11f7d651e374f429b8ed729562e3184ce989f376f2"}, - {file = "wandb-0.17.3-py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdc18c87ed255235cddd4a89ad96624595871e24ccfe975211a375a16923759f"}, - {file = "wandb-0.17.3-py3-none-win32.whl", hash = "sha256:c0e228b06ed9c47a2bfb8ebb6f23b470ba95f58e35eb2dbd93b91d4f8e739923"}, - {file = "wandb-0.17.3-py3-none-win_amd64.whl", hash = "sha256:836abfd028e19ca37a908aa7a57a4cd32f74619289f3bd111e27083a6b66e6e8"}, + {file = "wandb-0.17.5-py3-none-any.whl", hash = "sha256:1c0f60446b51561b67280a060388ffad2a6078fcfdf5024b9998252d237b4639"}, + {file = "wandb-0.17.5-py3-none-macosx_10_14_x86_64.whl", hash = "sha256:653252c57df550edc70607da827bc68c670932d6775e2f6556909575e17c544b"}, + {file = "wandb-0.17.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:233b02d3643142cce8c0ae7986c233fe976b3f7ec0f7aded7478dad0d5a74d43"}, + {file = "wandb-0.17.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca55edb64f0256a4d4961c3d9dd281a5928037827a21315a8ca67e92ccc60d06"}, + {file = "wandb-0.17.5-py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10e4b954ce7ff8615ee64b2dd5a04e51e8c64568d47ec39f5995dbbc9df172db"}, + {file = "wandb-0.17.5-py3-none-win32.whl", hash = "sha256:04013a6974dd5ff8d69cff79efdbad625db9873e3049bffe85cf39d81f5207cb"}, + {file = "wandb-0.17.5-py3-none-win_amd64.whl", hash = "sha256:c90e80df09c47e3e0432b2e4e90a4eff34f15e891467ec2f3c284834a33cd6c4"}, ] [package.dependencies]