From 04af73c228dccff964b09784656885c812e5bab7 Mon Sep 17 00:00:00 2001 From: dabadav Date: Mon, 12 Jun 2023 18:33:24 +0200 Subject: [PATCH 01/67] Changed README --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 3bb230a..b4b7d1c 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,8 @@ +

+ +


+ + # pipeline_vsdi Preprocessing tools for voltage sensitive dye imaging data From e405a9277d17bd22fae3d6ff7260536970a55276 Mon Sep 17 00:00:00 2001 From: Dante <74184198+dabadav@users.noreply.github.com> Date: Mon, 12 Jun 2023 18:40:18 +0200 Subject: [PATCH 02/67] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b4b7d1c..f9e689a 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@

- +


From 013ff48f224ef639031985f3a91cd5a924c298e7 Mon Sep 17 00:00:00 2001 From: Dante <74184198+dabadav@users.noreply.github.com> Date: Mon, 12 Jun 2023 18:40:36 +0200 Subject: [PATCH 03/67] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f9e689a..d403104 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@

- +


From 18bfcec08cdb49b506f25a99bccd3b9b1ed4bd42 Mon Sep 17 00:00:00 2001 From: dabadav Date: Mon, 12 Jun 2023 18:41:45 +0200 Subject: [PATCH 04/67] Changed README --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index d403104..fb4e137 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,6 @@
- -# pipeline_vsdi Preprocessing tools for voltage sensitive dye imaging data ## Structure From be022ba918baf3d9e6559ab2d3c44a0a780136bc Mon Sep 17 00:00:00 2001 From: dabadav Date: Mon, 12 Jun 2023 18:44:26 +0200 Subject: [PATCH 05/67] Changed README --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index fb4e137..4e3b1cc 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@

+Pipeline VSDI


Preprocessing tools for voltage sensitive dye imaging data From ba02203dd26dec992585d3e67cbee19319207aa0 Mon Sep 17 00:00:00 2001 From: dabadav Date: Mon, 12 Jun 2023 18:45:31 +0200 Subject: [PATCH 06/67] Changed README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4e3b1cc..22733d1 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@

-Pipeline VSDI +
Pipeline VSDI


Preprocessing tools for voltage sensitive dye imaging data From ade74bb4f905a0cf39ebbf8327d8ac0af7ac7080 Mon Sep 17 00:00:00 2001 From: dabadav Date: Tue, 13 Jun 2023 15:43:53 +0200 Subject: [PATCH 07/67] Organized code, Docs, Poetry --- dim_reduction/VAE.py | 318 ++++++++ dim_reduction/__init__.py | 0 dim_reduction/clustering.py | 46 -- dim_reduction/linear_dim_red.py | 24 + dim_reduction/pca_ica.ipynb | 358 --------- dim_reduction/pipeline.py | 166 ----- dim_reduction/vsdi.py | 164 ---- dim_reduction/vsdi_preprocessing.py | 383 ---------- docs/Makefile | 20 + docs/_templates/layout.html | 10 + docs/conf.py | 35 + docs/dim_reduction.rst | 21 + docs/index.rst | 19 + docs/make.bat | 35 + docs/modules.rst | 10 + docs/preprocessing.rst | 37 + docs/visualization.rst | 21 + docs/vsdi.rst | 29 + preprocessing/__init__.py | 0 preprocessing/behavior.py | 202 +++++ preprocessing/pca_ica.ipynb | 358 --------- preprocessing/pipeline.py | 166 ----- preprocessing/utils.py | 699 ++++++++++++++++++ preprocessing/vsdi.py | 164 ---- preprocessing/vsdi_preprocessing.py | 1 - preprocessing/vsdi_visualization.py | 170 ----- pyproject.toml | 17 + visualization/__init__.py | 0 .../vsdi_visualization.py | 0 vsdi/__init__.py | 0 vsdi/clustering.py | 46 -- loaders.py => vsdi/loaders.py | 0 vsdi/pca_ica.ipynb | 356 --------- vsdi/pipeline.py | 166 ----- vsdi/vsdi.py | 332 +++++---- vsdi/vsdi_preprocessing.py | 383 ---------- vsdi/vsdi_visualization.py | 170 ----- 37 files changed, 1681 insertions(+), 3245 deletions(-) create mode 100644 dim_reduction/VAE.py create mode 100644 dim_reduction/__init__.py delete mode 100644 dim_reduction/clustering.py create mode 100644 dim_reduction/linear_dim_red.py delete mode 100644 dim_reduction/pca_ica.ipynb delete mode 100644 dim_reduction/pipeline.py delete mode 100644 dim_reduction/vsdi.py delete mode 100644 dim_reduction/vsdi_preprocessing.py create mode 100644 docs/Makefile create mode 100644 docs/_templates/layout.html create mode 100644 docs/conf.py create mode 100644 docs/dim_reduction.rst create mode 100644 docs/index.rst create mode 100755 docs/make.bat create mode 100644 docs/modules.rst create mode 100644 docs/preprocessing.rst create mode 100644 docs/visualization.rst create mode 100644 docs/vsdi.rst create mode 100644 preprocessing/__init__.py create mode 100644 preprocessing/behavior.py delete mode 100644 preprocessing/pca_ica.ipynb delete mode 100644 preprocessing/pipeline.py create mode 100644 preprocessing/utils.py delete mode 100644 preprocessing/vsdi.py delete mode 100644 preprocessing/vsdi_visualization.py create mode 100644 pyproject.toml create mode 100644 visualization/__init__.py rename {dim_reduction => visualization}/vsdi_visualization.py (100%) create mode 100644 vsdi/__init__.py delete mode 100644 vsdi/clustering.py rename loaders.py => vsdi/loaders.py (100%) delete mode 100644 vsdi/pca_ica.ipynb delete mode 100644 vsdi/pipeline.py delete mode 100644 vsdi/vsdi_preprocessing.py delete mode 100644 vsdi/vsdi_visualization.py diff --git a/dim_reduction/VAE.py b/dim_reduction/VAE.py new file mode 100644 index 0000000..3f44e04 --- /dev/null +++ b/dim_reduction/VAE.py @@ -0,0 +1,318 @@ +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.optim as optim +from torch.utils.data import DataLoader, TensorDataset +from tqdm import tqdm +from sklearn.linear_model import LinearRegression +from random import shuffle + +class Conv_VAE(nn.Module): + def __init__(self, latent_dim): + super(Conv_VAE, self).__init__() + self.latent_dim = latent_dim + + # Encoder + self.encoder = nn.Sequential( + nn.Conv2d(1, 16, kernel_size=3, stride=1, padding=1), + nn.ReLU(), + nn.Conv2d(16, 32, kernel_size=3, stride=1, padding=1), + nn.ReLU(), + nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1), + nn.ReLU() + ) + + # Linear layer for mean and variance + self.fc_mu = nn.Linear(64 * 84 * 48, self.latent_dim) + self.fc_logvar = nn.Linear(64 * 84 * 48, self.latent_dim) + + # Decoder + self.decoder = nn.Sequential( + nn.Linear(self.latent_dim, 64 * 84 * 48), + nn.ReLU(), + nn.Unflatten(1, (64, 84, 48)), + nn.ConvTranspose2d(64, 32, kernel_size=3, stride=1, padding=1), + nn.ReLU(), + nn.ConvTranspose2d(32, 16, kernel_size=3, stride=1, padding=1), + nn.ReLU(), + nn.ConvTranspose2d(16, 1, kernel_size=3, stride=1, padding=1), + nn.Sigmoid() + ) + + def reparametrize(self, mu, logvar): + std = torch.exp(0.5 * logvar) + eps = torch.randn_like(std) + return mu + eps * std + + def forward(self, x): + # Encoder + encoded = self.encoder(x) + encoded = torch.flatten(encoded, start_dim=1) + + # Reparameterization + mu = self.fc_mu(encoded) + logvar = self.fc_logvar(encoded) + z = self.reparametrize(mu, logvar) + + # Decoder + reconstructed = self.decoder(z) + + return reconstructed, mu, logvar + + def backward(self, optimizer, criterion, x, y_true): + optimizer.zero_grad() + y_pred, mu, logvar = self.forward(x) + kl_div = -0.5 * torch.sum(1 + logvar - mu.pow(2) - logvar.exp()) + mse = criterion(y_pred, y_true) + loss = mse + kl_div + loss.backward() + optimizer.step() + return loss.item() + + +class Conv_AE(nn.Module): + def __init__(self, latent_dim): + super(Conv_AE, self).__init__() + self.latent_dim = latent_dim + + # Encoder + self.encoder = nn.Sequential( + nn.Conv2d(1, 16, kernel_size=3, stride=1, padding=1), + nn.ReLU(), + nn.Conv2d(16, 32, kernel_size=3, stride=1, padding=1), + nn.ReLU(), + nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1), + nn.ReLU() + ) + + # Linear layer for mean and variance + self.fc = nn.Linear(64 * 84 * 48, self.latent_dim) + + # Decoder + self.decoder = nn.Sequential( + nn.Linear(self.latent_dim, 64 * 84 * 48), + nn.ReLU(), + nn.Unflatten(1, (64, 84, 48)), + nn.ConvTranspose2d(64, 32, kernel_size=3, stride=1, padding=1), + nn.ReLU(), + nn.ConvTranspose2d(32, 16, kernel_size=3, stride=1, padding=1), + nn.ReLU(), + nn.ConvTranspose2d(16, 1, kernel_size=3, stride=1, padding=1), + # nn.Tanh() + ) + + def forward(self, x): + # Encoder + encoded = self.encoder(x) + encoded = torch.flatten(encoded, start_dim=1) + + # Reparameterization + h = self.fc(encoded) + + # Decoder + reconstructed = self.decoder(h) + + return reconstructed, h + + def backward(self, optimizer, criterion, x, y_true): + optimizer.zero_grad() + y_pred, _ = self.forward(x) + mse = criterion(y_pred, y_true) + loss = mse + loss.backward() + optimizer.step() + return loss.item() + +def create_dataloader(dataset, batch_size=128, reshuffle_after_epoch=True): + ''' + Creates a DataLoader for Pytorch to train the autoencoder with the image data converted to a tensor. + + Args: + dataset (4D numpy array): image dataset with shape (n_samples, n_channels, n_pixels_height, n_pixels_width). + batch_size (int; default=32): the size of the batch updates for the autoencoder training. + + Returns: + DataLoader (Pytorch DataLoader): dataloader that is ready to be used for training an autoencoder. + ''' + if dataset.shape[-1] == 3: + dataset = np.transpose(dataset, (0,3,1,2)) + tensor_dataset = TensorDataset(torch.from_numpy(dataset).float(), torch.from_numpy(dataset).float()) + return DataLoader(tensor_dataset, batch_size=batch_size, shuffle=reshuffle_after_epoch) + + +def train_autoencoder(model, train_loader, dataset=[], num_epochs=1000, learning_rate=1e-3, L2_weight_decay=0): + ''' + TO DO. + ''' + optimizer = optim.Adam(model.parameters(), lr=learning_rate, weight_decay=L2_weight_decay) + criterion = nn.MSELoss() + + model = model.to('cuda') + + history = [] + embeddings = [] + if len(dataset) > 0: + embeddings = [ get_latent_vectors(dataset=dataset, model=model) ] + for epoch in range(num_epochs): + running_loss = 0. + with tqdm(total=len(train_loader)) as pbar: + for i, data in enumerate(train_loader, 0): + inputs, _ = data + inputs = inputs.to('cuda') + + loss = model.backward(optimizer=optimizer, criterion=criterion, x=inputs, y_true=inputs) + running_loss += loss + + pbar.update(1) + pbar.set_description(f"Epoch {epoch+1}/{num_epochs}, Loss: {running_loss/len(train_loader):.4f}") + + history.append(running_loss/len(train_loader)) + + if len(dataset) > 0: + embeddings.append( get_latent_vectors(dataset=dataset, model=model) ) + + embeddings = np.array(embeddings) + + return history, embeddings + + +def predict(image, model): + ''' + Returns the output of model(image), and reshapes it to be compatible with plotting funtions such as plt.imshow(). + + Args: + image (3D numpy array): sample image with shape (n_channels, n_pixels_height, n_pixels_width). + model (Pytorch Module): convolutional autoencoder that is prepared to process images such as 'image'. + + Returns: + output_img (3D numpy array): output image with shape (n_pixels_height, n_pixels_width, n_channels) + ''' + if image.shape[-1] <= 4: + image = np.transpose(image, (2,0,1)) + n_channels, n_pixels_height, n_pixels_width = image.shape + image = np.reshape(image, (1, n_channels, n_pixels_height, n_pixels_width)) + image = torch.from_numpy(image).float().to(next(model.parameters()).device) + output_img = model(image)[0].detach().cpu().numpy() + output_img = np.reshape(output_img, (n_channels, n_pixels_height, n_pixels_width)) + output_img = np.transpose(output_img, (1,2,0)) + return output_img + + +def get_latent_vectors(dataset, model, batch_size=128): + ''' + Returns the latent activation vectors of the autoencoder model after passing all the images in the dataset. + + Args: + dataset (numpy array): image dataset with shape + model (Pytorch Module): convolutional autoencoder that is prepared to process the images in dataset. + + Returns: + latent_vectors (2D numpy array): latent activation vectors, matrix with shape (n_samples, n_hidden), where n_hidden is the number of units in the hidden layer. + ''' + if dataset.shape[-1] <= 4: + dataset = np.transpose(dataset, (0,3,1,2)) + tensor_dataset = TensorDataset(torch.from_numpy(dataset).float(), torch.from_numpy(dataset).float()) + data_loader = DataLoader(tensor_dataset, batch_size=batch_size, shuffle=False) + model.eval() + latent_vectors = [] + with torch.no_grad(): + for batch in data_loader: + inputs, _ = batch + latent = model(inputs.to('cuda'))[1] + latent_vectors.append(latent.cpu().numpy()) + latent_vectors = np.concatenate(latent_vectors) + return latent_vectors + + +def find_max_activation_images(model, n_hidden, img_shape=[1, 84, 49]): + images = [] + for i in range(n_hidden): + # Initialize input image + x = torch.randn(1, img_shape[0], img_shape[1], img_shape[2], device='cuda', requires_grad=True) + + # Use optimizer to perform gradient ascent + optimizer = optim.Adam([x], lr=1e-3) + + for j in range(1000): + optimizer.zero_grad() + _, mu, _ = model(x) + loss = -mu[0, i] # maximize activation of ith unit + loss.backward() + optimizer.step() + + # Add image to list + images.append(x.detach().cpu().numpy()[0, 0]) + + return np.array(images) + +def shuffle_2D_matrix(m): + ''' + Shuffles a matrix across both axis (not only the first axis like numpy.permutation() or random.shuffle()). + + Args: + m (2D numpy array): 2D matrix with arbitrary values. + + Returns: + m_shuffled (2D numpy array): the original matrix 'm', with all the elements shuffled randomly. + ''' + N = m.size + ind_shuffled = np.arange(N) + shuffle(ind_shuffled) + ind_shuffled = ind_shuffled.reshape((m.shape[0], m.shape[1])) + ind_x = (ind_shuffled/m.shape[1]).astype(np.int_) + ind_y = (ind_shuffled%m.shape[1]).astype(np.int_) + m_shuffled = m[ind_x, ind_y] + return m_shuffled + +def linear_decoding_score(embeddings, features, n_baseline=10000): + ''' + Computes the score of linear regression of embeddings --> features. Features will normally be position (x,y) + or orientation (radians or in vectorial form). + + Args: + embeddings (2D numpy array): 2D matrix containing the independent variable, with shape (n_samples, n_latent). + features (2D numpy array): 2D matrix containing the dependent variable, with shape (n_samples, n_features). + n_baseline (int; default=10000): number of permutation tests (i.e., shuffling the embeddings matrix) to compute the baseline. + + Returns: + scores (float list): a list with two scores: (1) the evaluation of the linear regression, and (2) an average & std + of n_baseline random permutation tests. + ''' + linear_model = LinearRegression() + linear_model.fit(embeddings, features) + linear_score = linear_model.score(embeddings, features) + + baselines = [] + for i in range(n_baseline): + embeddings_shuffled = shuffle_2D_matrix(np.copy(embeddings)) + linear_model_baseline = LinearRegression() + linear_model_baseline.fit(embeddings_shuffled, features) + random_score = linear_model_baseline.score(embeddings_shuffled, features) + baselines.append(random_score) + + baseline_score = [np.mean(baselines), np.std(baselines)] + ratio = linear_score/(baseline_score[0]) + return linear_score, baseline_score, ratio + + +def linear_decoding_error(embeddings, features, norm=1): + ''' + Computes the expected error of a linear decoder that uses the embeddings to predicts features (e.g. position in (x,y)). + + Args: + embeddings (2D numpy array): 2D matrix containing the independent variable, with shape (n_samples, n_latent). + features (2D numpy array): 2D matrix containing the dependent variable, with shape (n_samples, n_features). + norm (float; default=1): value used to normalize the MSE and bring it to a more convenient scale. + + Returns: + mean_dist (float): average euclidean distance between the predictions of the decoder and the actual features, normalized by a scalar. + ''' + linear_model = LinearRegression() + linear_model.fit(embeddings, features) + pred = linear_model.predict(embeddings) + + dist = np.sqrt(np.sum((pred - features)**2, axis=1)) + mean_dist = np.mean(dist) / norm + + return mean_dist \ No newline at end of file diff --git a/dim_reduction/__init__.py b/dim_reduction/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/dim_reduction/clustering.py b/dim_reduction/clustering.py deleted file mode 100644 index e138467..0000000 --- a/dim_reduction/clustering.py +++ /dev/null @@ -1,46 +0,0 @@ -import numpy as np -from scipy.spatial.distance import pdist, squareform -from sklearn.cluster import KMeans -from sklearn.manifold import TSNE -import matplotlib.pyplot as plt - -def compute_distance_matrix(arr_list): - """ - Given a list of 2D arrays, compute the pairwise distance matrix using Pearson correlation. - """ - # Get the number of arrays in the list - n_arrays = len(arr_list) - # Create an empty distance matrix with shape (n_arrays, n_arrays) - dist_mat = np.zeros((n_arrays, n_arrays)) - # Compute the pairwise distance between all pairs of arrays using Pearson correlation - for i in range(n_arrays): - for j in range(i+1, n_arrays): - corr = np.corrcoef(arr_list[i], arr_list[j])[0, 1] - dist = 1 - np.abs(corr) - dist_mat[i, j] = dist - dist_mat[j, i] = dist - # Return the distance matrix - return dist_mat - -def cluster_and_plot(arr_list, kind='betas'): - """ - Given a list of 2D arrays, compute the pairwise distance matrix, cluster it using k-means, - and plot the t-SNE projection of the distance matrix, colored by the cluster labels. - """ - # Compute the distance matrix using Pearson correlation - dist_mat = compute_distance_matrix(arr_list) - # Set the number of clusters for k-means - n_clusters = 10 - # Apply k-means clustering to the distance matrix - kmeans = KMeans(n_clusters=n_clusters) - labels = kmeans.fit_predict(dist_mat) - # Compute the t-SNE projection of the distance matrix - tsne = TSNE(n_components=2, perplexity=30, random_state=42) - emb = tsne.fit_transform(dist_mat) - # Plot the t-SNE projection, coloring each point by its cluster label - fig, ax = plt.subplots(figsize=(8, 8)) - scatter = ax.scatter(emb[:,0], emb[:,1], c=labels, cmap='viridis') - legend = ax.legend(*scatter.legend_elements(), loc="lower left", title="Clusters") - ax.add_artist(legend) - ax.set_title(f"t-SNE projection of {kind} distance matrix") - plt.show() diff --git a/dim_reduction/linear_dim_red.py b/dim_reduction/linear_dim_red.py new file mode 100644 index 0000000..d1da105 --- /dev/null +++ b/dim_reduction/linear_dim_red.py @@ -0,0 +1,24 @@ +# Dimensionality reduction +from sklearn.decomposition import PCA, FastICA +from sklearn.pipeline import Pipeline + +def pca_ica(vsdi, mask): + X = vsdi.transpose(2, 0, 1) + X = X*mask + X = X.reshape(X.shape[0], X.shape[1]*X.shape[2]) + + # Create a pipeline with PCA and ICA + pipe = Pipeline([ + ('pca', PCA(n_components=10)), + ('ica', FastICA(n_components=10, max_iter=200, + random_state=1, whiten='unit-variance')) + ]) + + out = pipe.fit(X) + + fingerprints = out.named_steps["ica"].components_ @ out.named_steps["pca"].components_ + timecourses = fingerprints @ X.T + + explained_variance = out.named_steps["pca"].explained_variance_ratio_ + + return fingerprints, timecourses, explained_variance diff --git a/dim_reduction/pca_ica.ipynb b/dim_reduction/pca_ica.ipynb deleted file mode 100644 index 37b53b6..0000000 --- a/dim_reduction/pca_ica.ipynb +++ /dev/null @@ -1,358 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "import sys\n", - "import os\n", - "sys.path.append(os.path.abspath('../'))\n", - "from scipy.io import loadmat\n", - "import loaders\n", - "from vsdi_preprocessing import clean_outliers,pca_ica,glm\n", - "from pathlib import Path" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "datapath = Path('/Users/davide/Dropbox/Projects/ATC/ATC_Data_preprocessed')\n", - "atc = loadmat(datapath.joinpath('A04/Day1/ATC1.mat'))\n", - "vsdi = loadmat(datapath.joinpath('A04/Day1/vsdi_ATC1.mat'))['vsdi_data']\n", - "mask = loadmat(datapath.joinpath(f'A04/Day1/vsdi_mask.mat'))['mask']\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(94, 54, 29999)" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "vsdi.shape" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "from sklearn.decomposition import PCA, FastICA\n", - "from sklearn.preprocessing import StandardScaler\n", - "from sklearn.pipeline import Pipeline\n", - "\n", - "def pca_ica(vsdi,mask):\n", - " X = vsdi.transpose(2, 0, 1)\n", - " X = X*mask\n", - " X = X.reshape(X.shape[0], X.shape[1]*X.shape[2])\n", - "\n", - " # Create a pipeline with PCA and ICA\n", - " pipe = Pipeline([\n", - " ('scaler', StandardScaler()),\n", - " ('pca', PCA(n_components=10)),\n", - " ('ica', FastICA(n_components=10, max_iter=200,\n", - " random_state=1, whiten='unit-variance'))\n", - " ])\n", - "\n", - " out = pipe.fit(X)\n", - "\n", - " fingerprints = out.named_steps[\"ica\"].components_ @ out.named_steps[\"pca\"].components_\n", - " timecourses = fingerprints @ X.T\n", - "\n", - " return fingerprints,timecourses\n", - "\n", - "clean_vsdi = clean_outliers(vsdi,nsigma=5)\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "ename": "TypeError", - "evalue": "'numpy.ndarray' object is not callable", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[23], line 11\u001b[0m\n\u001b[1;32m 8\u001b[0m vsdi2 \u001b[39m=\u001b[39m loadmat(datapath\u001b[39m.\u001b[39mjoinpath(\u001b[39mf\u001b[39m\u001b[39m'\u001b[39m\u001b[39m{\u001b[39;00manimal\u001b[39m}\u001b[39;00m\u001b[39m/\u001b[39m\u001b[39m{\u001b[39;00mday\u001b[39m}\u001b[39;00m\u001b[39m/vsdi_ATC2.mat\u001b[39m\u001b[39m'\u001b[39m))[\u001b[39m'\u001b[39m\u001b[39mvsdi_data\u001b[39m\u001b[39m'\u001b[39m]\n\u001b[1;32m 9\u001b[0m mask \u001b[39m=\u001b[39m loadmat(datapath\u001b[39m.\u001b[39mjoinpath(\u001b[39mf\u001b[39m\u001b[39m'\u001b[39m\u001b[39m{\u001b[39;00manimal\u001b[39m}\u001b[39;00m\u001b[39m/\u001b[39m\u001b[39m{\u001b[39;00mday\u001b[39m}\u001b[39;00m\u001b[39m/vsdi_mask.mat\u001b[39m\u001b[39m'\u001b[39m))[\u001b[39m'\u001b[39m\u001b[39mmask\u001b[39m\u001b[39m'\u001b[39m]\n\u001b[0;32m---> 11\u001b[0m vsd1 \u001b[39m=\u001b[39m clean_vsdi(vsdi1,nsigma\u001b[39m=\u001b[39;49m\u001b[39m5\u001b[39;49m)\n\u001b[1;32m 12\u001b[0m vsdi2 \u001b[39m=\u001b[39m clean_vsdi(vsdi2,nsigma\u001b[39m=\u001b[39m\u001b[39m5\u001b[39m)\n\u001b[1;32m 14\u001b[0m vsdi \u001b[39m=\u001b[39m np\u001b[39m.\u001b[39mdstack([vsdi1,vsdi2])\n", - "\u001b[0;31mTypeError\u001b[0m: 'numpy.ndarray' object is not callable" - ] - } - ], - "source": [ - "animals = ['A04']\n", - "days = ['Day1','Day3','Day5','Day7']\n", - "\n", - "for animal in animals:\n", - " vsdi_total = []\n", - " for day in days:\n", - " vsdi1 = loadmat(datapath.joinpath(f'{animal}/{day}/vsdi_ATC1.mat'))['vsdi_data']\n", - " vsdi2 = loadmat(datapath.joinpath(f'{animal}/{day}/vsdi_ATC2.mat'))['vsdi_data']\n", - " mask = loadmat(datapath.joinpath(f'{animal}/{day}/vsdi_mask.mat'))['mask']\n", - "\n", - " vsd1 = clean_vsdi(vsdi1,nsigma=5)\n", - " vsdi2 = clean_vsdi(vsdi2,nsigma=5)\n", - "\n", - " vsdi = np.dstack([vsdi1,vsdi2])\n", - " print(vsdi.shape)\n", - " vsdi_total.append(vsdi1)\n", - "\n", - "vsdi_total = np.dstack(vsdi_total)\n", - "print('Done')\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pca_ica(vsdi_total,mask)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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XZl9fvWrX8Xxxx+Pzs5OdHZ2Yt26dfjpT3865f7S+PznP4+6ujpcdNFF+9Xvpz71KdTV1ZX9rV27dlrPVVQiO5AdiP2zA2D6bUF2IDs4GMwFOwBm3hZkB7VN3uwAmNv3hANmB1HOuPbaa6Pm5uboW9/6VvSrX/0qet/73hcVCoVo165dE/r8T37yk+jv//7vox/+8IcRgOi6664r2//5z38+6urqiq6//vrowQcfjN785jdHa9asifbu3ZvZ59lnnx1dc8010datW6MHHnggeuMb3xitWrUq6u/vj4/5wAc+EB122GHR5s2bo3vuuSc644wzojPPPDOzzx//+MfRjTfeGD3++OPRtm3bor/7u7+Lmpqaoq1bt06pP89dd90VrV69Ojr++OOjj3zkI1M+zyiKossuuyw69thjox07dsR/L7zwwn71KaojO5AdiP23gyiafluQHcgODjRzxQ6iaGZtQXZQ2+TRDqJobt8TDpQd5O5l9bTTTos2bNgQr4+OjkYrVqyINm3aNOm+/EAcGxuLli1bFl1++eXxtmKxGLW0tET/8R//MeF+u7u7IwDRli1b4j6ampqi73//+/Exjz76aAQguuOOOybc74IFC6JvfOMb+91fX19fdNRRR0U333xz9Ad/8AfxQJxqv5dddll0wgknpO6brt8uypEdyA7E9NpBFM2MLcgOEmQHM8NctoMomh5bkB3UPrVgB1E0t+4JB8oOchUGPDw8jHvvvRfr16+Pt9XX12P9+vW444479rv/p556Cjt37izrv6urC6effvqk+u/p6QEALFy4EABw7733YmRkpKzftWvXYtWqVRPqd3R0FNdeey327NmDdevW7Xd/GzZswDnnnFP2+f09zyeeeAIrVqzAEUccgfPPPx/PPPPMtPx2UYnsQHYgZt4OgOmxBdmB7GAmmat2AEyvLcgOaptasQNg7t0TDoQdNE7q6BnmxRdfxOjoKJYuXVq2fenSpXjsscf2u/+dO3fG/fn+uW88xsbGcNFFF+FVr3oVjjvuuLjf5uZmFAqFSfX78MMPY926dRgcHER7ezuuu+46HHPMMXjggQem1B8AXHvttbjvvvtw9913V+yb6nmefvrp+Pa3v42Xv/zl2LFjBz796U/j93//97F169Yp9ymykR3IDsTM2wGw/7YgO5AdzDRzzQ6A6bcF2UHtUwt2AMy9e8KBsoNcvazWAhs2bMDWrVvx85//fL/7evnLX44HHngAPT09+MEPfoALLrgAW7ZsmXJ/zz77LD7ykY/g5ptvRmtr636fH3nDG94QLx9//PE4/fTTcfjhh+N73/se2trapu17RO0gO5AdCNmB7EAA02sHwPTaguxAHEjm2j3hQNlBrsKAFy9ejIaGhopKUbt27cKyZcv2u3/2MdX+L7zwQtxwww342c9+hpUrV5b1Ozw8jGKxOKl+m5ubceSRR+Lkk0/Gpk2bcMIJJ+Cf/umfptzfvffei+7ubpx00klobGxEY2MjtmzZgquuugqNjY1YunTplPr1FAoFHH300XjyySenfK4iG9mB7EDMvB0A+2cLsoMSsoOZZa7ZATC9tiA7mB3k3Q4A3ROAmbODXL2sNjc34+STT8bmzZvjbWNjY9i8eTPWrVu33/2vWbMGy5YtK+u/t7cXv/zlL6v2H0URLrzwQlx33XW45ZZbsGbNmrL9J598Mpqamsr63bZtG5555plJnffY2BiGhoam3N9ZZ52Fhx9+GA888ED8d8opp+D888+Pl6fjPPv7+/HrX/8ay5cvn7bfLhJkB7IDMfN2AEzNFmQH5cgOZpa5bgfA/tmC7GB2kFc7AHRPCJkxO5hUOaYDwLXXXhu1tLRE3/72t6NHHnkkev/73x8VCoVo586dE/p8X19fdP/990f3339/BCC64oorovvvvz96+umnoygqlaUuFArRj370o+ihhx6K3vKWt4xblvqDH/xg1NXVFd16661l5ZkHBgbiYz7wgQ9Eq1atim655ZbonnvuidatWxetW7cus89LLrkk2rJlS/TUU09FDz30UHTJJZdEdXV10X//939Pqb8swkpfU+33r//6r6Nbb701euqpp6Jf/OIX0fr166PFixdH3d3d03quIkF2IDsQ+28HUTT9tiA7kB0caOaKHUTRgbEF2UFtkkc7iKK5fU84UHaQu5fVKIqiL3/5y9GqVaui5ubm6LTTTovuvPPOCX/2Zz/7WQSg4u+CCy6IoqhUmvoTn/hEtHTp0qilpSU666yzom3btlXtM60/ANE111wTH7N3797oQx/6ULRgwYJo3rx50Vvf+tZox44dmX2++93vjg4//PCoubk5OuSQQ6KzzjorHoRT6S8LPxCn0u/b3/72aPny5VFzc3N06KGHRm9/+9ujJ598ctrP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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import matplotlib.pyplot as plt\n", - "plt.figure(figsize=(10,5))\n", - "for i,f in enumerate(fingerprints):\n", - " ax = plt.subplot(2,5,i+1)\n", - " ax.matshow(f.reshape(vsdi.shape[:2]),cmap=plt.cm.gnuplot2)\n", - "plt.tight_layout()\n" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Match masks" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Mask clustering" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "from itertools import product\n", - "\n", - "animals = ['A04','A06','A07','A08']\n", - "days = ['Day1','Day3','Day5','Day7']\n", - "\n", - "masks = []\n", - "for animal,day in product(animals,days):\n", - " try:\n", - " mask = loadmat(datapath.joinpath(f'{animal}/{day}/vsdi_mask.mat'))['mask']\n", - " masks.append(mask)\n", - "\n", - " except FileNotFoundError:\n", - " print(f\"Not found mask for {animal},{day}\")\n", - " masks.append(np.nan)\n", - " continue\n", - " except OSError:\n", - " print(f\"OS error for {animal},{day}\")\n", - " masks.append(np.nan)\n", - " continue\n", - " \n" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "16" - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "len(masks)" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA0YAAAPeCAYAAAAoEQo2AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy88F64QAAAACXBIWXMAAA9hAAAPYQGoP6dpAABT0klEQVR4nO3da5CV1b0n4P8WsGlAONACyuU0g4iGqwhq4miaSIwkGsTCIJrEZKxJvBUTPWqiE1vBa6Fy9JjjNcRUNJUao2Iuoo4y4zknUzGQaGSCkqgIIWCCjKFEEwWBNR9S3WTTXLqhL+/u9TxV/YG113732pffhx/r3e8upZRSAAAAZOyAjl4AAABAR1OMAACA7ClGAABA9hQjAAAge4oRAACQPcUIAADInmIEAABkTzECAACypxgBAADZa/ViNHny5BgzZkxrH7bD/fCHP4x+/frFe++919FLaTNPP/109OrVKzZs2NDRS6ENyGblks3OTTYrl2x2XnJZufYnl3aMmmHbtm1x7bXXxuzZs6NXr16N4x9++GHMnTs3hg8fHlVVVTF8+PC44YYbYuvWrXs83o033hilUmm/Ard69eoolUq7/Psf/+N/7PZ+H374YYwaNSpKpVLcdtttZbdNnTo1RowYETfffPM+rwvak2xCMckmFI9c7l3XFt8jQz/96U/jd7/7XXz1q18tG//CF74QjzzySJx33nkxadKk+MUvfhH19fWxZs2auP/++3d5rLVr18ZNN90UPXv2bJW1nX322fGZz3ymbOxjH/vYbud/61vfijVr1uz29vPPPz8uv/zymDt3bhx00EGtskZoK7IJxSSbUDxy2QypldXV1aXRo0e39mE71LRp09IJJ5xQNrZ06dIUEam+vr5s/LLLLkulUiktW7Zsl8c666yz0kknnbTfr9OqVatSRKRbb7212fdZv3596tOnT7ruuut2e9/169enLl26pO985zv7vDaKSTZlk2KSTdmkeOQyz1y26FS6d999Ny655JIYNmxYVFVVxYABA+Lkk0+OF198scncV155JT7xiU9Ejx49YvDgwXHLLbeU3b5ly5a45pprYuLEidGnT5/o2bNnnHjiifHcc8+VzWvYYrvtttvi9ttvj9ra2qiuro66urpYvnx5k8f97W9/G2eeeWb069cvunfvHpMmTYqf/OQnTeatXLkyVq5cudfn/MEHH8TTTz8dn/zkJ8vGf/azn0VExKxZs8rGZ82aFSmlePjhh5sc6z/+4z/i0UcfjTvuuGOvj9sSf/nLX2LLli17nXfllVfGEUccEV/4whd2O2fAgAExbty4+PGPf9yaS6SNyeYOskmRyOYOsklRyOUOcrmTlrSoc845Jx144IHpn/7pn9KCBQvSvHnz0mc/+9n0/e9/v3FOXV1dGjRoUBo6dGj62te+lu6+++500kknpYhITz75ZOO8DRs2pEMPPTT90z/9U7rnnnvSLbfcko444ojUrVu39Otf/7pxXkOTHDt2bBo2bFiaN29emjt3burXr1/q379/+tOf/tQ4d/ny5alPnz5p1KhRad68eelf//Vf08c//vFUKpXSwoULy55LbW1tqq2t3etz/j//5/+kiEg/+clPysZvuummFBHpjTfeKBt/+eWXU0SkU045pWx869atady4cen8889vfJ1ao2H36tUrRUQqlUpp0qRJ6X/+z/+5y/lLlixJBxxwQPr5z3++13b+X//rf00HH3zwPq+N9iebO8gmRSKbO8gmRSGXO8hluRYVoz59+qSLL754j3Pq6upSRKQHH3ywcWzz5s3pkEMOSTNmzGgc27p1a9q8eXPZfTdu3JgGDhyYzjvvvMaxhiddXV2d1q5d2zi+ZMmSFBHp0ksvbRybMmVKGjt2bPrggw8ax7Zv356OP/74dPjhh5c9VnM/SAsWLEgRkX7zm9+UjT/22GMpItJDDz1UNn7vvfemiEhjxowpG//Xf/3X1KdPn/TWW2+llPb/g/T73/8+fepTn0r33HNP+slPfpLuuOOO9I//+I/pgAMOSE888UTZ3O3bt6djjz02nX322SmlvW9bNoRk/fr1+7w+2pds7iCbFIls7iCbFIVc7iCX5VpUjGpra9OkSZPSunXrdjunrq4u9erVK23fvr1sfNq0aWnChAm7vM+2bdvS22+/nTZs2JBOPfXUdNRRRzXe1vCkG16Ev3fcccelI444IqWU0ttvv51KpVK6/vrr04YNG8r+5s6dmyKi7IPYXPPmzdvlfd9///1UW1ubBg4cmB577LG0evXq9PDDD6eamprUtWvXdNhhhzXO/X//7/+lfv36pdtuu63sdWrtc1fffvvtNHDgwMbXpMEDDzyQqqur05o1a1JKe/8g3XPPPSki0ssvv9yq66PtyOYOskmRyOYOsklRyOUOclmuRd8xuuWWW2L58uUxdOjQOPbYY2POnDnxxhtvNJk3ZMiQKJVKZWN9+/aNjRs3lo1973vfi3HjxkX37t2jpqYm+vfvH4sWLYp33nmnyTEPP/zwJmMjR46M1atXR0TE66+/HimlqK+vj/79+5f9XXvttRER8dZbb7Xk6ZZJKZX9u3v37rFo0aKoqamJGTNmxLBhw+Lcc8+Na665Jvr161d2GcSrr746+vXrF7Nnz97nx2+Ofv36xX/5L/8lfve738XatWsjImLTpk1x1VVXxRVXXBFDhw5t1nEanuvO7yHFJZs7yCZFIps7yCZFIZc7yGW5Fl2ue+bMmXHiiSfG448/Hs8880zceuutMW/evFi4cGF8+tOfbpzXpUuXPS4wIuL73/9+fPnLX47p06fHFVdcEQMGDIguXbrEzTff3Kwvke1s+/btERFx+eWXxymnnLLLOSNGjGjxcWtqaiIiYuPGjTFkyJCy20aPHh3Lly+PV155JTZu3BijRo2K6urquPTSS6Ouri4iIl577bW4//7744477og333yz8b4ffPBBfPjhh7F69ero3bt39OvXr8Vr25WGD8uf//znGDJkSNx2222xZcuWOOussxpD1/Ah27hxY6xevToGDRoUBx54YOMxGgJ/8MEHt8qaaHuyKZsUk2zKJsUjl3K5W83f2Gpq/fr1afDgwek//+f/3Di2uy21L33pS2XnQJ5++ulp+PDhTbYojz/++LJ5zd16XL9+fYqIdNVVV+3PU2qi4ctqP/7xj5s1f9GiRSki0n333ZdSSum5555LEbHHv6997Wuttt7LLrssRUR68803U0p/e9339vh//+XAlHyJtDOQzaZkkyKQzaZkk44ml03lmstm7xht27Yt3nvvvejTp0/j2IABA2LQoEGxefPm5h6mUUMLTyk1bnEtWbIknn/++fjHf/zHJvN/9KMfxbp162Lw4MEREbF06dJYsmRJXHLJJY1rmTx5ctx3330xe/bsOPTQQ8vuv2HDhujfv3/jvxta/GGHHbbHdU6cODEOPPDA+NWvfhXTpk3b49z3338/6uvr49BDD42zzz47IiLGjBkTjz/+eJO5V199dbz77rvxL//yL3tdw67s/HwiItatWxcPPPBAjBs3rvH5/7f/9t9i+vTpZfPeeuutOP/88+PLX/5ynH766fGf/tN/Krv9hRde2OOPalEssimbFJNsyibFI5dyuSfNLkbvvvtuDBkyJM4888wYP3589OrVKxYvXhy//OUvY/78+S160IiI0047LRYuXBhnnHFGnHrqqbFq1aq49957Y9SoUfHee+81mT9ixIg44YQT4sILL4zNmzfHHXfcETU1NfH1r3+9cc5dd90VJ5xwQowdOza+8pWvxPDhw2P9+vXx/PPPx9q1a2PZsmWNc6dMmRIR0bgdtzvdu3ePT33qU7F48eK47rrrym6bOXNmDBo0KEaNGhWbNm2KBx54IN54441YtGhR46/sHnzwwU3eyIhovPb7zrfNmTMn5s6dG88991xMnjx5t+v6+te/HitXrowpU6bEoEGDYvXq1XHffffFX/7yl/iXf/mXxnlHH310HH300WX3bXjOo0eP3uWH7P/+3/8bF1988e5fFApFNmWTYpJN2aR45FIu96i5W0ubN29OV1xxRRo/fnw66KCDUs+ePdP48ePT3XffXTavuVuP27dvTzfddFOqra1NVVVVacKECemJJ55oMu/vrzgxf/78NHTo0FRVVZVOPPHEXf4a78qVK9O5556bDjnkkNStW7c0ePDgdNppp6VHH320bF5zL2+YUkoLFy5MpVKp8SoYDebNm5eOPPLI1L1799S3b980bdq0Jtt4u7O716nhl4ZXrFixx/v/4Ac/SB//+MdT//79U9euXdPBBx+czjjjjPTCCy/s9bH3dBWPe+65J/Xo0SNt2rSpWc+DjiebskkxyaZsUjxyKZd7sl/fMWoPe7sUX3vYunVrGjlyZLr66qvb/LGOOeaYdOaZZ7b54+zOUUcdlS655JIOe3wqh2y2L9mkuWSzfckmzSGX7Wtfc9miy3XnqkuXLnHdddfFXXfdtctt0dayadOmWLZsWZMtzvby9NNPx2uvvRZXXXVVhzw+tJRsQjHJJhSPXO5diy7XnbOzzjorzjrrrDZ9jN69e+/TF/9ay9SpU9s0KNAWZBOKSTaheORyz+wYAQAA2SultNNP4AIAAGTGjhEAAJA9xQgAAMieYgQAAGRPMQIAALKnGAEAANlTjAAAgOwpRgAAQPYUIwAAIHuKEQAAkD3FCAAAyJ5iBAAAZE8xAgAAsqcYAQAA2VOMAACA7ClGAABA9hQjAAAge4oRAACQPcUIAADInmIEAABkTzECAACypxgBAADZU4wA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AIDsKUYAAED2FCMAACB7ihEAAJA9xQgAAMieYgQAAGRPMQIAALKnGAEAANlTjAAAgOwpRgAAQPYUIwAAIHuKEQAAkD3FCAAAyJ5iBAAAZE8xAgAAsqcYAQAA2VOMAACA7ClGAABA9hQjAAAge4oRAACQPcUIAADInmIEAABkTzECAACy1+rFaPLkyTFmzJjWPmyH++EPfxj9+vWL9957r6OX0maefvrp6NWrV2zYsKGjl0IbkM3KJZudm2xWLtnsvOSycu1PLu0YNcO2bdvi2muvjdmzZ0evXr0axz/88MOYO3duDB8+PKqqqmL48OFxww03xNatW3d5nBdffDGmTZsW/fr1ix49esSYMWPizjvv3K+1rVy5Ms4555wYMGBAVFdXx+GHHx7f/OY3m8xbsWJFTJ06NXr16hX9+vWLL37xi00+MFOnTo0RI0bEzTffvF9rgvYim1BMsgnFI5d713Wfn0FGfvrTn8bvfve7+OpXv1o2/oUvfCEeeeSROO+882LSpEnxi1/8Iurr62PNmjVx//33l8195pln4rOf/WxMmDAh6uvro1evXrFy5cpYu3btPq/rpZdeismTJ8fgwYPjsssui5qamlizZk384Q9/KJu3du3a+PjHPx59+vSJm266Kd5777247bbb4je/+U0sXbo0DjzwwMa5559/flx++eUxd+7cOOigg/Z5bdAeZBOKSTaheOSyGVIrq6urS6NHj27tw3aoadOmpRNOOKFsbOnSpSkiUn19fdn4ZZddlkqlUlq2bFnj2DvvvJMGDhyYzjjjjLRt27ZWWdO2bdvSmDFj0nHHHZf++te/7nHuhRdemKqrq9Pvf//7xrFnn302RUS67777yuauX78+denSJX3nO99plXVSHLIpmxSTbMomxSOXeeayRcVo06ZN6Wtf+1qqra1NBx54YOrfv3/65Cc/mV544YXGOQ0fpJdffjlNnjw5VVdXp0GDBqV58+aVHWvz5s2pvr4+HX300al3796pR48e6YQTTkj/+3//77J5q1atShGRbr311vTP//zP6R//8R9T9+7d08c//vH0m9/8pskaV6xYkWbMmJH69u2bqqqq0sSJE9OPf/zjJvNef/319Prrr+/1Ob///vvpwAMPTHPmzCkbnz9/foqI9PLLL5eN//KXv0wRkf77f//vjWP33HNPioj0yiuvpJRSeu+99/b7A/XUU0+liEhPPvlkSimlv/zlL2nr1q27nDtgwID0uc99rsn4yJEj05QpU5qMT5gwIU2bNm2/1kf7ks0dZJMikc0dZJOikMsd5LJci75jdMEFF8Q999wTM2bMiLvvvjsuv/zyqK6ujhUrVpTN27hxY0ydOjXGjx8f8+fPjyOPPDK+8Y1vxFNPPdU4Z9OmTbFgwYKYPHlyzJs3L+bMmRMbNmyIU045JV566aUmj/3ggw/GnXfeGRdffHFcddVVsXz58jjppJNi/fr1jXNefvnl+OhHPxorVqyIK6+8MubPnx89e/aM6dOnx+OPP152vClTpsSUKVP2+pxfeOGF2LJlSxx99NFl45s3b46IiOrq6rLxHj16NN6vweLFi6N3796xbt26OOKII6JXr17Ru3fvuPDCC+ODDz7Y6xp2ZfHixRERUVVVFZMmTYqePXtGjx49YtasWfHnP/+5cd66devirbfeikmTJjU5xrHHHhu//vWvm4xPnDgxfv7zn+/TuugYsrmDbFIksrmDbFIUcrmDXO6kJS2qT58+6eKLL97jnLq6uhQR6cEHH2wc27x5czrkkEPSjBkzGse2bt2aNm/eXHbfjRs3poEDB6bzzjuvcayhYVdXV6e1a9c2ji9ZsiRFRLr00ksbx6ZMmZLGjh2bPvjgg8ax7du3p+OPPz4dfvjhZY9VW1ubamtr9/qcFyxYkCKiSZt/7LHHUkSkhx56qGz83nvvTRGRxowZ0zg2bty41KNHj9SjR480e/bs9Nhjj6XZs2eniEizZs3a6xp2Zdq0aSkiUk1NTfr85z+fHn300VRfX5+6du2ajj/++LR9+/aU0o7G//fvR4MrrrgiRUTZ65VSSjfddFOKiLR+/fp9WhvtTzZ3kE2KRDZ3kE2KQi53kMtyLSpGtbW1adKkSWndunW7nVNXV5d69erV+EQaTJs2LU2YMGGX99m2bVt6++2304YNG9Kpp56ajjrqqMbbGj5IZ599dpP7HXfccemII45IKaX09ttvp1KplK6//vq0YcOGsr+5c+emiCj7IDbXvHnzdnnf999/P9XW1qaBAwemxx57LK1evTo9/PDDqaamJnXt2jUddthhjXOHDx+eIiJdcMEFZcc4//zzU0SkV199tcXrOumkk1JEpKlTp5aN33zzzSki0rPPPptSSuk//uM/UkSkhx9+uMkx6uvrU0SkjRs3lo03bJXuvK1KccnmDrJJkcjmDrJJUcjlDnJZrkWn0t1yyy2xfPnyGDp0aBx77LExZ86ceOONN5rMGzJkSJRKpbKxvn37xsaNG8vGvve978W4ceOie/fuUVNTE/37949FixbFO++80+SYhx9+eJOxkSNHxurVqyMi4vXXX4+UUtTX10f//v3L/q699tqIiHjrrbda8nTLpJTK/t29e/dYtGhR1NTUxIwZM2LYsGFx7rnnxjXXXBP9+vUruwxiw/bk2WefXXaMc845JyIinn/++RavZ2/HbNg6bJjXsFX69xq2PXfePm14rju/hxSXbO4gmxSJbO4gmxSFXO4gl+VadLnumTNnxoknnhiPP/54PPPMM3HrrbfGvHnzYuHChfHpT3+6cV6XLl12ef+/fzO+//3vx5e//OWYPn16XHHFFTFgwIDo0qVL3HzzzbFy5cqWLCsiIrZv3x4REZdffnmccsopu5wzYsSIFh+3pqYmIv52numQIUPKbhs9enQsX748Xnnlldi4cWOMGjUqqqur49JLL426urrGeYMGDYqXX345Bg4cWHb/AQMGNB67pQYNGhQRsddjHnrooRER8cc//rHJMf74xz9Gv379oqqqqmy84b4HH3xwi9dFx5BN2aSYZFM2KR65lMvdafHvGB166KFx0UUXxUUXXRRvvfVWHH300XHjjTeWfZCa49FHH43hw4fHwoULy5pcQxve2WuvvdZk7NVXX41hw4ZFRMTw4cMjIqJbt27xyU9+skVr2ZMjjzwyIiJWrVoVY8eObXJ7qVSK0aNHN/77ySefjO3bt5etYeLEifHss882flmtwZtvvhkREf3792/xuiZOnBjf/va3Y926dWXjOx9z8ODB0b9///jVr37V5BhLly6No446qsn4qlWr4uCDD96nddFxZLOcbFIUsllONikCuSwnl3/T7FPptm3b1mRLcMCAATFo0KBdbmvtTUML//vWvWTJkt1uw/3oRz8qe9GWLl0aS5YsafwADxgwICZPnhz33XffLtvkzr+Ku3LlymY1+YkTJ8aBBx64yzdiZ++//37U19fHoYceWrYlOHPmzIiI+M53vlM2f8GCBdG1a9eYPHnyXo+9s9NPPz2qqqriu9/9buP/LjQcMyLi5JNPbhybMWNGPPHEE2U/lPW//tf/ildffTU+97nPNTn2Cy+8EB/72MdavCY6hmzKJsUkm7JJ8cilXO5Rc7+MtHHjxtSzZ8/0pS99Kf3zP/9zuv/++9PMmTNTRKT58+c3ztvdD2J96UtfKrtqxgMPPJAiIk2bNi3dd9996corr0z/8A//kEaPHl02r+HLamPHjk3Dhg1L8+bNS9ddd13q169fqqmpSW+++Wbj3Jdffjn17ds31dTUpCuvvDLdf//96frrr0+f+cxn0rhx48rW09yreKSU0mmnnZY+9rGPNRn/3Oc+l772ta+l++67L916663pIx/5SKqqqkqLFy9uMve8885LEZFmzpyZ7rrrrvS5z30uRUS66qqryuZde+21KSLSc889t9d1XXfddSki0sknn5zuuuuu9NWvfjWVSqUmX+xbs2ZNqqmpSYcddli6884700033ZT69u3b5IonKe34QawFCxY045WhCGRTNikm2ZRNikcu5XJPml2MNm/enK644oo0fvz4dNBBB6WePXum8ePHp7vvvrtsXnM/SNu3b0833XRTqq2tTVVVVWnChAnpiSeeaDLv738Qa/78+Wno0KGpqqoqnXjiiWW/xttg5cqV6dxzz02HHHJI6tatWxo8eHA67bTT0qOPPlo2ryUfpIULF6ZSqZTWrFlTNj5v3rx05JFHpu7du6e+ffumadOmpV//+te7PMaWLVvSnDlzUm1tberWrVsaMWJEuv3225vMa/il4RUrVux1Xdu3b0/f+ta30siRI1O3bt3S0KFD09VXX522bNnSZO7y5cvTpz71qdSjR4/0D//wD+nzn/98+tOf/tRk3j333JN69OiRNm3atNfHpxhkUzYpJtmUTYpHLuVyT1p0ue6O8PcfpI6ydevWNHLkyHT11Ve3+WMdc8wx6cwzz2zzx9mdo446Kl1yySUd9vhUDtlsX7JJc8lm+5JNmkMu29e+5rJFl+vOVZcuXeK6666Lu+66K9577702e5xNmzbFsmXL4rrrrmuzx9iTp59+Ol577bW46qqrOuTxoaVkE4pJNqF45HLvWnxVulydddZZcdZZZ7XpY/Tu3XufvvjXWqZOndqmQYG2IJtQTLIJxSOXe2bHCAAAyF4ppZ1+AhcAACAzdowAAIDsKUYAAED2FCMAACB7ihEAAJA9xQgAAMieYgQAAGRPMQIAALKnGAEAANlTjAAAgOwpRgAAQPYUIwAAIHuKEQAAkD3FCAAAyJ5iBAAAZE8xAgAAsqcYAQAA2VOMAACA7ClGAABA9hQjAAAge4oRAACQPcUIAADInmIEAABkTzECAACypxgBAADZU4wAAIDsKUYAAED2FCMAACB7ihEAAJA9xQgAAMieYgQAAGRPMQIAALKnGAEAANlTjAAAgOwpRgAAQPYUIwAAIHuKEQAAkD3FCAAAyJ5iBAAAZE8xAgAAsqcYAQAA2VOMAACA7HXt6AW0llKp1GrHSim12rEgZ3IJxSSbUEyy2bHsGAEAANnrNDtGrWl3bV3zho4jl1BMsgnFJJstZ8cIAADIXilVeG1szXMxm6vCXzJoc3IJxSSbUEyyWQx2jAAAgOwpRvugVCp1SLMHdk8uoZhkE4pJNptSjAAAgOxV7HeMitRwK/QlhFYnl1BMsgnFJJvFYscIAADInmLUCpyjCcUjl1BMsgnFJJuKEQAAQOV9x6gSmmyFvaSw3+QSikk2oZhks5jsGAEAANlTjNqAczSheOQSikk2oZhyzKZiBAAAZK9ivmNUyY21Ql5iaDG5hGKSTSgm2Sw2O0YAAED2FCMAACB7ihEAAJA9xagdVPL5pNBZySUUk2xCMeWQTcUIAADIXuGvStfZ2mnBX25oFrmEYpJNKCbZrAx2jAAAgOwpRu0sx18RhqKTSygm2YRi6qzZVIwAAIDsKUYdpLM2bahkcgnFJJtQTJ0tm4oRAACQva4dvYDd6UztEzoLuYRikk0oJtmsLHaMAACA7ClGHayznZsJnYFcQjHJJhRTZ8mmYlQQneUDBZ2JXEIxySYUU6VnUzECAACypxgBAADZU4wAAIDsKUYFU+nnZkJnJJdQTLIJxVSp2VSMAACA7JVSSqmjF/H3KrFdtqWCvT1kSi7LySVFIZvlZJOikM1ylZJNO0YAAED2FCMAACB7ihEAAJA9xajgKvWqHtCZySUUk2xCMVVKNhUjAAAge4oRAACQPcUIAADIXmF+x6gSzjssgoK8XWRCLptHLmlvstk8skl7k83mKWo27RgBAADZU4wqTKVc1QNyIpdQTLIJxVTUbCpGAABA9hQjAAAge4oRAACQPcWoQhX13EzImVxCMckmFFPRsqkYAQAA2VOMAACA7ClGAABA9hQjAAAge4oRAACQPcUIAADInmIEAABkr5RSSh26gAJdu7ySdfDbSCcjl61DLmltstk6ZJPWJputo6OzaccIAADInmIEAABkTzECAACypxgBAADZU4wAAIDsKUYAAED2FCMAACB7ihEAAJA9xaiTKJVKflwMCkYuoZhkE4qpo7OpGAEAANlTjAAAgOwpRgAAQPYUIwAAIHuKEQAAkD3FCAAAyJ5iBAAAZK+UUkod8sB+P6BNddDbSoWTy7Yll+wr2Wxbssm+ks221d7ZtGMEAABkTzECAACypxgBAADZU4wAAIDsKUYAAED2FCMAACB7ihEAAJA9xaiTcl19KB65hGKSTSim9s6mYgQAAGRPMQIAALKnGAEAANlTjAAAgOwpRgAAQPYUIwAAIHuKEQAAkD3FCAAAyJ5i1ImVSiU/WgcFI5dQTLIJxdSe2VSMAACA7ClGAABA9hQjAAAge4oRAACQPcUIAADInmIEAABkTzECAACypxgBAADZU4wAAIDsKUYAAED2FCMAACB7ihEAAJA9xQgAAMieYgQAAGRPMQIAALKnGAEAANlTjAAAgOwpRgAAQPYUIwAAIHuKEQAAkD3FCAAAyF7Xjl4AbSel1NFLAHYil1BMsgnF1J7ZtGMEAABkr0OKUalU6oiHBfZALqGYZBOKSTY7HztGAABA9hQjAAAge4oRAACQPcUIAADInmIEAABkTzECAACypxh1Un6oDopHLqGYZBOKqb2zqRgBAADZK6UO+m8SP4rVNvyvF/tDLtuGXLK/ZLNtyCb7SzbbRkdl044RAACQPcUIAADInmIEAABkr2tHL4DW4TxpKB65hGKSTSimjs6mHSMAACB7HXZVusYFuJrHfunoZk3nJJf7Ry5pK7K5f2STtiKb+6co2bRjBAAAZK/Dd4waaNotU5C3jU5OLltGLmkvstkyskl7kc2WKVo27RgBAADZK8yO0c407nIFfZvIjFyWk0uKQjbLySZFIZvlip5NO0YAAED2Crtj1CD3pl3wt4dMyaVcUkyyKZsUk2xWRjbtGAEAANkr/I7Rzjp7466wtwMiQi6hqGQTikk2i8mOEQAAkL2K2zHaWWdp3BX+NkAZuYRikk0oJtksBjtGAABA9ip+x2h3it68O+nLDnskl1BMsgnFJJvty44RAACQvU67Y9SaWqOte5mhdcklFJNsQjHJ5t7ZMQIAALJnx6gNNTRzLzEUh1xCMckmFFNO2bRjBAAAZM+OEQAAkD07RgAAQPYUIwAAIHuKEQAAkD3FCAAAyJ5iBAAAZE8xAgAAsqcYAQAA2VOMAACA7ClGAABA9hQjAAAge4oRAACQPcUIAADInmIEAABkTzECAACypxgBAADZU4wAAIDsKUYAAED2FCMAACB7ihEAAJA9xQgAAMieYgQAAGRPMQIAALKnGAEAANlTjAAAgOwpRgAAQPYUIwAAIHuKEQAAkD3FCAAAyJ5iBAAAZE8xAgAAsqcYAQAA2VOMAACA7ClGAABA9hQjAAAge4oRAACQvVYvRpMnT44xY8a09mE73A9/+MPo169fvPfeex29lDbzyiuvRNeuXWP58uUdvRTagGxWLtnsvOSycsll5yablWt/smnHqBm2bdsW1157bcyePTt69erVOP7hhx/G3LlzY/jw4VFVVRXDhw+PG264IbZu3brL47z44osxbdq06NevX/To0SPGjBkTd955536tbeXKlXHOOefEgAEDorq6Og4//PD45je/WTZn6dKlcdFFF8XEiROjW7duUSqVdnmsUaNGxamnnhrXXHPNfq0J2otsQvHIJRSTbO5d131afWZ++tOfxu9+97v46le/Wjb+hS98IR555JE477zzYtKkSfGLX/wi6uvrY82aNXH//feXzX3mmWfis5/9bEyYMCHq6+ujV69esXLlyli7du0+r+ull16KyZMnx+DBg+Oyyy6LmpqaWLNmTfzhD38om/fkk0/GggULYty4cTF8+PB49dVXd3vMCy64ID7zmc/EypUr47DDDtvntUF7kE0oHrmEYpLNZkitrK6uLo0ePbq1D9uhpk2blk444YSysaVLl6aISPX19WXjl112WSqVSmnZsmWNY++8804aOHBgOuOMM9K2bdtaZU3btm1LY8aMSccdd1z661//use5f/rTnxrnXHzxxWlPb/uWLVtS3759mzwvKp9syibFI5dySTHJZp7ZbNGpdO+++25ccsklMWzYsKiqqooBAwbEySefHC+++GKTua+88kp84hOfiB49esTgwYPjlltuKbt9y5Ytcc0118TEiROjT58+0bNnzzjxxBPjueeeK5u3evXqKJVKcdttt8Xtt98etbW1UV1dHXV1dbs8d/C3v/1tnHnmmdGvX7/o3r17TJo0KX7yk580mbdy5cpYuXLlXp/zBx98EE8//XR88pOfLBv/2c9+FhERs2bNKhufNWtWpJTi4Ycfbhz7wQ9+EOvXr48bb7wxDjjggPjLX/4S27dv3+tj78kzzzwTy5cvj2uvvTaqq6vjr3/9a2zbtm2XcwcOHBjV1dXNOm63bt1i8uTJ8eMf/3i/1kf7ks0dZJOikMsd5JIikc0dZLNci4rRBRdcEPfcc0/MmDEj7r777rj88sujuro6VqxYUTZv48aNMXXq1Bg/fnzMnz8/jjzyyPjGN74RTz31VOOcTZs2xYIFC2Ly5Mkxb968mDNnTmzYsCFOOeWUeOmll5o89oMPPhh33nlnXHzxxXHVVVfF8uXL46STTor169c3znn55Zfjox/9aKxYsSKuvPLKmD9/fvTs2TOmT58ejz/+eNnxpkyZElOmTNnrc37hhRdiy5YtcfTRR5eNb968OSKiyRvUo0ePxvs1WLx4cfTu3TvWrVsXRxxxRPTq1St69+4dF154YXzwwQd7XcOuLF68OCIiqqqqYtKkSdGzZ8/o0aNHzJo1K/785z/v0zEbTJw4MZYvXx6bNm3ar+PQfmRzB9mkKORyB7mkSGRzB9ncSUu2l/r06ZMuvvjiPc6pq6tLEZEefPDBxrHNmzenQw45JM2YMaNxbOvWrWnz5s1l9924cWMaOHBgOu+88xrHVq1alSIiVVdXp7Vr1zaOL1myJEVEuvTSSxvHpkyZksaOHZs++OCDxrHt27en448/Ph1++OFlj1VbW5tqa2v3+pwXLFiQIiL95je/KRt/7LHHUkSkhx56qGz83nvvTRGRxowZ0zg2bty41KNHj9SjR480e/bs9Nhjj6XZs2eniEizZs3a6xp2Zdq0aSkiUk1NTfr85z+fHn300VRfX5+6du2ajj/++LR9+/Zd3m9vW48ppfSDH/wgRURasmTJPq2N9iebO8gmRSGXO8glRSKbO8hmuRYVo9ra2jRp0qS0bt263c6pq6tLvXr1avJEpk2bliZMmLDL+2zbti29/fbbacOGDenUU09NRx11VONtDR+ks88+u8n9jjvuuHTEEUeklFJ6++23U6lUStdff33asGFD2d/cuXNTRJR9EJtr3rx5u7zv+++/n2pra9PAgQPTY489llavXp0efvjhVFNTk7p27ZoOO+ywxrnDhw9PEZEuuOCCsmOcf/75KSLSq6++2uJ1nXTSSSki0tSpU8vGb7755hQR6dlnn93l/ZrzQXrqqadSRKRFixa1eF10DNncQTYpCrncQS4pEtncQTbLtehUultuuSWWL18eQ4cOjWOPPTbmzJkTb7zxRpN5Q4YMaXIJvb59+8bGjRvLxr73ve/FuHHjonv37lFTUxP9+/ePRYsWxTvvvNPkmIcffniTsZEjR8bq1asjIuL111+PlFLU19dH//79y/6uvfbaiIh46623WvJ0y6SUyv7dvXv3WLRoUdTU1MSMGTNi2LBhce6558Y111wT/fr1K7sMYsP25Nlnn112jHPOOSciIp5//vkWr2dvx/z5z3/e4mM2aHiuu7sMIsUjmzvIJkUhlzvIJUUimzvIZrkWXa575syZceKJJ8bjjz8ezzzzTNx6660xb968WLhwYXz6059unNelS5c9LjAi4vvf/358+ctfjunTp8cVV1wRAwYMiC5dusTNN9/crC+R7azhy1+XX355nHLKKbucM2LEiBYft6amJiL+dp7pkCFDym4bPXp0LF++PF555ZXYuHFjjBo1Kqqrq+PSSy+Nurq6xnmDBg2Kl19+OQYOHFh2/wEDBjQeu6UGDRoUEdGqx2zQcN+DDz54n49B+5JN2aR45FIuKSbZlM3dafHvGB166KFx0UUXxUUXXRRvvfVWHH300XHjjTeWfZCa49FHH43hw4fHwoULy5pcQxve2WuvvdZk7NVXX41hw4ZFRMTw4cMj4m9Xodj5ihv748gjj4yIiFWrVsXYsWOb3F4qlWL06NGN/37yySdj+/btZWuYOHFiPPvss41fVmvw5ptvRkRE//79W7yuiRMnxre//e1Yt25d2fj+HLPBqlWr4oADDoiRI0fu8zFof7JZTjYpArksJ5cUhWyWk82/afapdNu2bWuyJThgwIAYNGhQ4xUtWqKhhf99616yZMlut+F+9KMflb1oS5cujSVLljR+gAcMGBCTJ0+O++67L/74xz82uf+GDRvK/t3cyxtOnDgxDjzwwPjVr36117nvv/9+1NfXx6GHHlq2JThz5syIiPjOd75TNn/BggXRtWvXmDx58l6PvbPTTz89qqqq4rvf/W7ZpRIXLFgQEREnn3xyi4/Z4IUXXojRo0dHnz599vkYtB/ZlE2KRy7lkmKSTdnck2bvGL377rsxZMiQOPPMM2P8+PHRq1evWLx4cfzyl7+M+fPnt3ixp512WixcuDDOOOOMOPXUU2PVqlVx7733xqhRo+K9995rMn/EiBFxwgknxIUXXhibN2+OO+64I2pq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slmuRcXoggsuiHvuuSdmzJgRd999d1x++eVRXV0dK1asKJu3cePGmDp1aowfPz7mz58fRx55ZHzjG9+Ip556qnHOpk2bYsGCBTF58uSYN29ezJkzJzZs2BCnnHJKvPTSS00e+8EHH4w777wzLr744rjqqqti+fLlcdJJJ8X69esb57z88svx0Y9+NFasWBFXXnllzJ8/P3r27BnTp0+Pxx9/vOx4U6ZMiSlTpuz1Ob/wwguxZcuWOProo8vGN2/eHBHR5A3q0aNH4/0aLF68OHr37h3r1q2LI444Inr16hW9e/eOCy+8MD744IO9rmFXFi9eHBERVVVVMWnSpOjZs2f06NEjZs2aFX/+85/36ZgNJk6cGMuXL49Nmzbt13FoP7K5g2xSFHK5g1xSJLK5g2zupCXbS3369EkXX3zxHufU1dWliEgPPvhg49jmzZvTIYcckmbMmNE4tnXr1rR58+ay+27cuDENHDgwnXfeeY1jq1atShGRqqur09q1axvHlyxZkiIiXXrppY1jU6ZMSWPHjk0ffPBB49j27dvT8ccfnw4//PCyx6qtrU21tbV7fc4LFixIEZF+85vflI0/9thjKSLSQw89VDZ+7733pohIY8aMaRwbN25c6tGjR+rRo0eaPXt2euyxx9Ls2bNTRKRZs2btdQ27Mm3atBQRqaamJn3+859Pjz76aKqvr09du3ZNxx9/fNq+ffsu77e3rceUUvrBD36QIiItWbJkn9ZG+5PNHWSTopDLHeSSIpHNHWSzXIuKUW1tbZo0aVJat27dbufU1dWlXr16NXki06ZNSxMmTNjlfbZt25befvvttGHDhnTqqaemo446qvG2hg/S2Wef3eR+xx13XDriiCNSSim9/fbbqVQqpeuvvz5t2LCh7G/u3LkpIso+iM01b968Xd73/fffT7W1tWngwIHpscceS6tXr04PP/xwqqmpSV27dk2HHXZY49zhw4eniEgXXHBB2THOP//8FBHp1VdfbfG6TjrppBQRaerUqWXjN998c4qI9Oyzz+7yfs35ID311FMpItKiRYtavC46hmzuIJsUhVzuIJcUiWzuIJvlWnQq3S233BLLly+PoUOHxrHHHhtz5syJN954o8m8IUOGNLmEXt++fWPjxo1lY9/73vdi3Lhx0b1796ipqYn+/fvHokWL4p133mlyzMMPP7zJ2MiRI2P16tUREfH6669HSinq6+ujf//+ZX/XXnttRES89dZbLXm6ZVJKZf/u3r17LFq0KGpqamLGjBkxbNiwOPfcc+Oaa66Jfv36lV0GsWF78uyzzy47xjnnnBMREc8//3yL17O3Y/785z9v8TEbNDzX3V0GkeKRzR1kk6KQyx3kkiKRzR1ks1yLLtc9c+bMOPHEE+Pxxx+PZ555Jm699daYN29eLFy4MD796U83zuvSpcseFxgR8f3vfz++/OUvx/Tp0+OKK66IAQMGRJcuXeLmm29u1pfIdtbw5a/LL788TjnllF3OGTFiRIuPW1NTExF/O890yJAhZbeNHj06li9fHq+88kps3LgxRo0aFdXV1XHppZdGXV1d47xBgwbFyy+/HAMHDiy7/4ABAxqP3VKDBg2KiGjVYzZouO/BBx+8z8egfcmmbFI8cimXFJNsyubutPh3jA499NC46KKL4qKLLoq33norjj766LjxxhvLPkjN8eijj8bw4cNj4cKFZU2uoQ3v7LXXXmsy9uqrr8awYcMiImL48OER8berUOx8xY39ceSRR0ZExKpVq2Ls2LFNbi+VSjF69OjGfz/55JOxffv2sjVMnDgxnn322cYvqzV48803IyKif//+LV7XxIkT49vf/nasW7eubHx/jtlg1apVccABB8TIkSP3+Ri0P9ksJ5sUgVyWk0uKQjbLyebfNPtUum3btjXZEhwwYEAMGjSo8YoWLdHQwv++dS9ZsmS323A/+tGPyl60pUuXxpIlSxo/wAMGDIjJkyfHfffdF3/84x+b3H/Dhg1l/27u5Q0nTpwYBx54YPzqV7/a69z3338/6uvr49BDDy3bEpw5c2ZERHznO98pm79gwYLo2rVrTJ48ea/H3tnpp58eVVVV8d3vfrfsUokLFiyIiIiTTz65xcds8MILL8To0aOjT58++3wM2o9syibFI5dySTHJpmzuSbN3jN59990YMmRInHnmmTF+/Pjo1atXLF68OH75y1/G/PnzW7zY0047LRYuXBhnnHFGnHrqqbFq1aq49957Y9SoUfHee+81mT9ixIg44YQT4sILL4zNmzfHHXfcETU1NfH1r3+9cc5dd90VJ5xwQowdOza+8pWvxPDhw2P9+vXx/PPPx9q1a2PZsmWNcxsubdhwTufudO/ePT71qU/F4sWL47rrriu7bebMmTFo0KAY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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import matplotlib.pyplot as plt\n", - "plt.figure(figsize=(10,10))\n", - "for i,m in enumerate(masks):\n", - " ax = plt.subplot(4,4,i+1)\n", - " ax.matshow(mask,cmap=plt.cm.Greys)\n", - " plt.axis('off')\n", - " plt.title(f'shape: {m.shape}')\n", - "\n", - "plt.tight_layout()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 89, - "metadata": {}, - "outputs": [], - "source": [ - "from functools import reduce\n", - "def max_common_intersection(mask_list):\n", - " min_x = np.min([m.shape[0] for m in mask_list])\n", - " min_y = np.min([m.shape[1] for m in mask_list])\n", - "\n", - " cropped_masks = []\n", - " for m in masks:\n", - " if m.shape[0]> min_x and m.shape[1]>min_y:\n", - " cropped_masks.append(m[(m.shape[0]-min_x)//2:-(m.shape[0]-min_x)//2,\n", - " (m.shape[1]-min_y)//2:-(m.shape[1]-min_y)//2])\n", - "\n", - " elif m.shape[0] == min_x and m.shape[1]>min_y:\n", - " cropped_masks.append(m[:,(m.shape[1]-min_y)//2:-(m.shape[1]-min_y)//2])\n", - "\n", - " elif m.shape[0]> min_x and m.shape[1]== min_y:\n", - " cropped_masks.append(m[(m.shape[0]-min_x)//2:-(m.shape[0]-min_x)//2,:])\n", - "\n", - " else:\n", - " cropped_masks.append(m)\n", - " \n", - " # performs elementwise logical and\n", - " intersection = reduce(lambda x, y: np.logical_and(x, y), cropped_masks)\n", - "\n", - "\n", - " return intersection" - ] - }, - { - "cell_type": "code", - "execution_count": 90, - "metadata": {}, - "outputs": [], - "source": [ - "cm = max_common_intersection(masks)" - ] - }, - { - "cell_type": "code", - "execution_count": 91, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 91, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plt.matshow(cm)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "base", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.8" - }, - "orig_nbformat": 4, - "vscode": { - "interpreter": { - "hash": "a004f9109620e037dd6eb32a5065768d5476b766f6a5e98b9519dfa4bc5bb4ce" - } - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/dim_reduction/pipeline.py b/dim_reduction/pipeline.py deleted file mode 100644 index a1ad191..0000000 --- a/dim_reduction/pipeline.py +++ /dev/null @@ -1,166 +0,0 @@ -import loaders -import args - -import glob -import numpy as np -import pandas as pd -from scipy import io -from sklearn.pipeline import Pipeline -from sklearn.decomposition import PCA -from sklearn.preprocessing import StandardScaler -import matplotlib.pyplot as plt - -import vsdi_preprocessing -import vsdi_visualization -import loaders - -#################################### - -##################################### -############### MAIN ################ -##################################### - -# Define paths -path = '/home/danteam/Documents/BScThesis' -data = f'{path}/data' -reports = f'{path}/reports' -figures = f'{reports}/figures' - -# Get arguments from command line -parameters = args.getArgs() -subject = parameters.subject -day = parameters.day -session = parameters.session - -def save_vsdi(): - vsdi1 = io.loadmat(glob.glob(f'{data}/ATC_Data_preprocessed/A0{subject}/Day1/vsdi_ATC{session}.mat')[0])['vsdi_data'] - vsdi3 = io.loadmat(glob.glob(f'{data}/ATC_Data_preprocessed/A0{subject}/Day3/vsdi_ATC{session}.mat')[0])['vsdi_data'] - vsdi5 = io.loadmat(glob.glob(f'{data}/ATC_Data_preprocessed/A0{subject}/Day5/vsdi_ATC{session}.mat')[0])['vsdi_data'] - vsdi7 = io.loadmat(glob.glob(f'{data}/ATC_Data_preprocessed/A0{subject}/Day7/vsdi_ATC{session}.mat')[0])['vsdi_data'] - - vsdi1 = vsdi1[:,:,0:29999] - vsdi3 = vsdi3[:,:,0:29999] - vsdi5 = vsdi5[:,:,0:29999] - vsdi7 = vsdi7[:,:,0:29999] - - vsdi = np.concatenate((vsdi1, vsdi3, vsdi5, vsdi7), axis = 2) - - del(vsdi1) - del(vsdi3) - del(vsdi5) - del(vsdi7) - - # Outliers correction - vsdi_clean = vsdi_preprocessing.clean_outliers(vsdi, nsigma=5) - - # Hemodynamics correction - vsdi_clean = vsdi_preprocessing.clean_hemodynamic_pca(vsdi_clean, bimodal_th = 0.6, verbose = True) - - del(vsdi) - - ## Mask to select just subject cortex - r = np.loadtxt(f'{data}/Patterns/mask_A0{subject}.csv', delimiter=',', dtype='bool') - - X = vsdi_clean.transpose(2, 0, 1) - X = X[:,r] - - del(vsdi_clean) - - pipe = Pipeline([ - ('scaler', StandardScaler()), - ('pca', PCA(n_components=10)) - ]) - - out = pipe.fit(X) - - f = out.named_steps['pca'].components_ - factor_scores = pipe.named_steps['pca'].transform(X) - - np.savetxt(f'{data}/Patterns/SubjectA0{subject}_timecourse_part1.csv', factor_scores, delimiter=",") - np.savetxt(f'{data}/Patterns/SubjectA0{subject}_fingerprint_part1.csv', f, delimiter=",") - - return 0 - -def save_behav(): - atc1 = io.loadmat(f'{data}/ATC_Data_preprocessed/A0{subject}/Day1/ATC{session}.mat') - atc3 = io.loadmat(f'{data}/ATC_Data_preprocessed/A0{subject}/Day3/ATC{session}.mat') - atc5 = io.loadmat(f'{data}/ATC_Data_preprocessed/A0{subject}/Day5/ATC{session}.mat') - atc7 = io.loadmat(f'{data}/ATC_Data_preprocessed/A0{subject}/Day7/ATC{session}.mat') - b_data1 = loaders.extract_behavioural_data(atc1) - b_data3 = loaders.extract_behavioural_data(atc3) - b_data5 = loaders.extract_behavioural_data(atc5) - b_data7 = loaders.extract_behavioural_data(atc7) - - del(atc1) - del(atc3) - del(atc5) - del(atc7) - - d1 = vsdi_preprocessing.design_matrix(b_data1) - d3 = vsdi_preprocessing.design_matrix(b_data3) - d5 = vsdi_preprocessing.design_matrix(b_data5) - d7 = vsdi_preprocessing.design_matrix(b_data7) - - d1 = d1[0:29999,:] - d3 = d3[0:29999,:] - d5 = d5[0:29999,:] - d7 = d7[0:29999,:] - - np.savetxt(f'{data}/Patterns/SubjectA0{subject}_d1_part{session}.csv', d1, delimiter=",") - np.savetxt(f'{data}/Patterns/SubjectA0{subject}_d3_part{session}.csv', d3, delimiter=",") - np.savetxt(f'{data}/Patterns/SubjectA0{subject}_d5_part{session}.csv', d5, delimiter=",") - np.savetxt(f'{data}/Patterns/SubjectA0{subject}_d7_part{session}.csv', d7, delimiter=",") - - return 0 - -def mask_norm(masks, threshold=0.5): - mask_mean = np.mean(masks, axis=0) - mask_mean[mask_mean > threshold] = 1 - mask_mean[mask_mean <= threshold] = 0 - - return mask_mean - -def save_mask(): - r1 = io.loadmat(f'{data}/ATC_Data_preprocessed/A0{subject}/Day1/vsdi_mask.mat')['mask'].astype('bool') - np.savetxt(f'{data}/Patterns/raw_mask_{subject}_day1.csv', r1, delimiter=",") - r3 = io.loadmat(f'{data}/ATC_Data_preprocessed/A0{subject}/Day3/vsdi_mask.mat')['mask'].astype('bool') - np.savetxt(f'{data}/Patterns/raw_mask_{subject}_day3.csv', r3, delimiter=",") - r5 = io.loadmat(f'{data}/ATC_Data_preprocessed/A0{subject}/Day5/vsdi_mask.mat')['mask'].astype('bool') - np.savetxt(f'{data}/Patterns/raw_mask_{subject}_day5.csv', r5, delimiter=",") - r7 = io.loadmat(f'{data}/ATC_Data_preprocessed/A0{subject}/Day7/vsdi_mask.mat')['mask'].astype('bool') - np.savetxt(f'{data}/Patterns/raw_mask_{subject}_day7.csv', r7, delimiter=",") - - del(r1) - del(r3) - del(r5) - del(r7) - - r1 = np.loadtxt(f'{data}/Patterns/raw_mask_{subject}_day1.csv', delimiter=",") - r3 = np.loadtxt(f'{data}/Patterns/raw_mask_{subject}_day3.csv', delimiter=",") - r5 = np.loadtxt(f'{data}/Patterns/raw_mask_{subject}_day5.csv', delimiter=",") - r7 = np.loadtxt(f'{data}/Patterns/raw_mask_{subject}_day7.csv', delimiter=",") - - print(r1.shape, r3.shape, r5.shape, r7.shape) - - masks = np.stack([r1, r3, r5, r7]) - mask_mean = mask_norm(masks) - - np.savetxt(f'/home/danteam/Documents/BScThesis/data/Patterns/mask_A0{subject}.csv', mask_mean.astype(int), fmt='%i', delimiter=",") - - return 0 - - -def main(): - # print(f'Saving Mask A0{subject} part {session}') - # save_mask() - print(f'Saving VSDI subject A0{subject} part {session}') - save_vsdi() - print(f'Saving Design matrices A0{subject} part {session}') - save_behav() - - return 0 - - - -if __name__ == '__main__': - main() \ No newline at end of file diff --git a/dim_reduction/vsdi.py b/dim_reduction/vsdi.py deleted file mode 100644 index abda7e0..0000000 --- a/dim_reduction/vsdi.py +++ /dev/null @@ -1,164 +0,0 @@ -########################################################## -######################## PACKAGES ######################## -########################################################## -import matplotlib.pyplot as plt -import numpy as np -from scipy import stats -from scipy.stats import norm -from sklearn.decomposition import PCA -import seaborn as sns -sns.set_theme(context='notebook', - style='white', - font_scale=1.5, - rc = {'axes.spines.top':False,'axes.spines.right':False, - 'image.cmap':plt.cm.jet}) - -########################################################## -####################### VSDI CLASS ####################### -########################################################## - -class VSDI: - def __init__(self, vsdi, raw_mask): - """ - Constructor for VSDI class - """ - self.vsdi = self.correct_outliers(vsdi) - self.raw_mask = raw_mask - self.X = self.vsdi.transpose(2,0,1) # reshape in time x image format - self.T,self.h,self.w = self.X.shape # saves time, height and width for future use - self.X = self.X[:,self.raw_mask] # select only cortex pixels, returns a flattened image - - def time_course(self, start_time=0, end_time=600, framerate=50): - """ - Plot time course of a single PC - """ - plt.figure(figsize=(10, 5)) - t = np.linspace(start_time, end_time, int((end_time - start_time) * framerate - 1)) - plt.plot(t, self.vsdi) - plt.xlabel('Time (s)') - plt.ylabel('PC activation (a.u.)') - plt.show() - - def create_frame(self, t): - """ - Create a frame of the VSDI data - """ - plt.figure(figsize=(10, 10)) - plt.imshow(self.vsdi[:, :, t], cmap=plt.cm.inferno) - - def pca(self, n_components=50): - """ - Perform PCA on the VSDI data - """ - pca = PCA(n_components=n_components) - pca.fit(self.X) - - return pca - - def pca_projection(self, pca, num_pc): - """ - Plot the projection of the data onto the first 10 PCs - """ - PCs = pca.components_[:num_pc].T - Y = self.X @ PCs # compute the PC timecourse, by projecting the original data on each component - return Y - - def cumulative_explained_variance(self, pca): - """ - Plot cumulative explained variance - """ - evr = pca.explained_variance_ratio_ - c_evr = np.cumsum(evr) - plt.figure(figsize=(6, 6)) - plt.axhline(0.9, linestyle='--', label='90% explained variance') - plt.plot(range(1, len(c_evr) + 1), c_evr) - plt.legend() - plt.xlabel('# of components') - plt.ylabel('EVR') - - def fingerprint(self, pca, num_pc = 10): - """ - Plot topographic organzation of the weights of these ten components - """ - PCs = pca.components_[:num_pc] - plt.figure(figsize=(10, 5)) - for i, pc in enumerate(PCs): - plt.subplot(2, 5, i + 1) - plt.title(f'PC {i + 1}') - reshaped_pc = np.full((self.h, self.w), np.nan) - reshaped_pc[np.where(self.raw_mask)] = pc - plt.imshow(reshaped_pc, aspect='auto', cmap=plt.cm.jet) - plt.axis('off') - - def first_last_subsets(self, arr): - """ - Get first and last frame of each subset - """ - subsets = [] - start = 0 - end = 0 - while end < len(arr): - while end + 1 < len(arr) and arr[end + 1] - arr[start] == end - start + 1: - end += 1 - subsets.append((arr[start], arr[end])) - start = end = end + 1 - return np.array(subsets) - - def correct_outliers(self, vsdi, nsigma=4): - """ - Correct outliers in VSDI data - """ - # Array with average value of all frames in vsdi - mean_vsdi = np.mean(vsdi, axis=(0,1)) - std_vsdi = vsdi.std() - - # Get index of outliers from vsdi presenting average activity higher than 4 sigma - outliers = np.argwhere((mean_vsdi > nsigma*std_vsdi) | (mean_vsdi < -nsigma*std_vsdi)).ravel() - - # Get first and last frame of each subset - outliers_subsets = self.first_last_subsets(arr = outliers) - - # Set outlier frames to the mean between the previous and next frame - for i in range(len(outliers_subsets)): - start = outliers_subsets[i][0] - end = outliers_subsets[i][1] - if start == 0: - vsdi[:,:,start:end+1] = np.tile(vsdi[:,:,end+1][:, :, np.newaxis], (1, 1, end - start + 1)) - elif end == len(mean_vsdi)-1: - vsdi[:,:,start:end+1] = np.tile(vsdi[:,:,start-1][:, :, np.newaxis], (1, 1, end - start + 1)) - else: - average = np.divide(np.add(vsdi[:,:,start-1][:, :, np.newaxis], vsdi[:,:,end+1][:, :, np.newaxis]), 2) - vsdi[:,:,start:end+1] = average - return vsdi - - def bimodality_test(self, distribution): - """ - Test for bimodality using moving average to smooth the histogram - and get the x-axis location of the highest point in the histogram - """ - # Create a histogram - n, bins, patches = plt.hist(distribution, bins=1000) - # Define the window size for the moving average - window_size = 5 - # Create the moving average kernel - kernel = np.ones(window_size) / window_size - # Convolve the histogram data with the moving average kernel - smoothed = np.convolve(n, kernel, mode='same') - bins_adjusted = bins[:-1] - - # Find the x-axis location of the highest point in the histogram - x_max = bins_adjusted[np.argmax(smoothed)] - - return x_max - - def bimodal_components(self, Y, threshold=1): - """ - Get bimodal components - """ - bimodal_components = [] - for i in range(Y.shape[1]): - x_max = self.bimodality_test(Y[:,i]) - if abs(x_max) > threshold: - bimodal_components.append([i, x_max]) - - return bimodal_components \ No newline at end of file diff --git a/dim_reduction/vsdi_preprocessing.py b/dim_reduction/vsdi_preprocessing.py deleted file mode 100644 index 10a6ddc..0000000 --- a/dim_reduction/vsdi_preprocessing.py +++ /dev/null @@ -1,383 +0,0 @@ -########################################################## -######################## PACKAGES ######################## -########################################################## -import numpy as np -from sklearn.decomposition import PCA, FastICA -from sklearn.preprocessing import StandardScaler -from sklearn.pipeline import Pipeline -import scipy.stats as stats -import statsmodels.api as sm - - -########################################################## - -def peak_distance(component, smooth_window_size, hist_nbins): - # Create a histogram - n, bins = np.histogram(component, bins=hist_nbins) - # Define the window size for the moving average - window_size = smooth_window_size - # Create the moving average kernel - kernel = np.ones(window_size) / window_size - # Convolve the histogram data with the moving average kernel - smoothed = np.convolve(n, kernel, mode='same') - bins_adjusted = bins[:-1] - # Find the x-axis location of the highest point in the histogram - x_max = bins_adjusted[np.argmax(smoothed)] - - return x_max - - -def check_bimodal(components, th=1.0, smooth_window_size=5, hist_nbins=1000): - """ - Test for bimodality using moving average to smooth the histogram - and get the x-axis location of the highest point in the histogram - - Parameters - ---------- - components : numpy ndarray (components, time) - Timecourse of a single component - threshold : float - Threshold for bimodal distribution identification (distance from peak to zero) - - Returns - ------- - bimodal_components : list - List of components that are bimodal (1 if bimodal, 0 if not) - """ - # Initialize bimodal_components list - bimodal_components = np.zeros(components.shape[0]) - for i in range(components.shape[0]): - # Get peak distance - x_max = peak_distance(components[i], smooth_window_size, hist_nbins) - # Check if peak distance is above threshold - if abs(x_max) > th: - bimodal_components[i] = 1 - - return bimodal_components - - -def clean_hemodynamic_pca(vsdi, n_components=50, bimodal_th=1, - smooth_window=5, hist_nbins=1000, verbose=False): - """ - Clean hemodynamic noise from vsdi data - - Parameters - ---------- - vsdi : numpy array - vsdi data in format (time, pixels_y, pixels_X) - n_components : int - Number of components to keep after PCA - bimodal_th : float - Threshold for bimodal distribution identification - smooth_window : int - Window size for smoothing the histogram of timecourse distribution - hist_nbins : int - Number of bins for histogram of timecourse distribution - - Returns - ------- - clean_vsdi : numpy array in the same format as vsdi input - vsdi data with hemodynamic noise removed - """ - # reshape vsdi data to (time, pixels) - vsdi = vsdi.transpose(2, 0, 1) - # store original shape - vsdi_shape = vsdi.shape - # flatten 2d pixels to array - vsdi = vsdi.reshape(vsdi.shape[0], vsdi.shape[1]*vsdi.shape[2]) - - # put out-of-mask values to zero - - # run PCA - pca = PCA(n_components=n_components) - # fit PCA to vsdi data and project it to the new space - timecourses = pca.fit_transform(vsdi) - - # get bimodal components indexes - bad_components = check_bimodal(timecourses.T, th=bimodal_th, - smooth_window_size=smooth_window, - hist_nbins=hist_nbins) - - if verbose: - with open('log.txt', 'a') as f: - # Print explained variance ratio - f.write( - f'{sum(pca.explained_variance_ratio_[np.where(bad_components)]):.4f} ') - # Print number of components - f.write(f'{sum(bad_components):.0f}\n') - - # get clean timecourses and components - good_timecourses = timecourses[:, np.logical_not(bad_components)] - good_components = pca.components_[np.logical_not(bad_components)] - - # reconstruct vsdi data - clean_vsdi = good_timecourses @ good_components - clean_vsdi = clean_vsdi.reshape( - vsdi_shape[0], vsdi_shape[1], vsdi_shape[2]) - clean_vsdi = clean_vsdi.transpose(1, 2, 0) - - return clean_vsdi - - -def clean_hemodynamics(vsdi, n_components=50, bimodal_th=0.8, ica_max_iter=200, - smooth_window=5, hist_nbins=1000, verbose=False): - """ - Clean hemodynamic noise from vsdi data - - Parameters - ---------- - vsdi : numpy array - vsdi data in format (time, pixels_y, pixels_X) - n_components : int - Number of components to keep after PCA - bimodal_th : float - Threshold for bimodal distribution identification - smooth_window : int - Window size for smoothing the histogram of timecourse distribution - hist_nbins : int - Number of bins for histogram of timecourse distribution - - Returns - ------- - clean_vsdi : numpy array in the same format as vsdi input - vsdi data with hemodynamic noise removed - """ - # reshape vsdi data to (time, pixels) - X = vsdi.transpose(2, 0, 1) - # store original shape - vsdi_shape = vsdi.shape - # flatten 2d pixels to array - X = X.reshape(vsdi.shape[0], vsdi.shape[1]*vsdi.shape[2]) - - # Create a pipeline with PCA and ICA - pipe = Pipeline([ - ('pca', PCA(n_components=n_components)), - ('ica', FastICA(n_components=n_components, max_iter=ica_max_iter, - random_state=88, whiten='unit-variance')) - ]) - - # Fit the pipeline to vsdi data - timecourses = pipe.fit_transform(X) - - # get bimodal components indexes - bad_components = check_bimodal(timecourses.T, th=bimodal_th, - smooth_window_size=smooth_window, - hist_nbins=hist_nbins) - - if verbose: - with open('log.txt', 'a') as f: - # Print number of components - f.write(f'{sum(bad_components):.0f}\n') - - # get clean timecourses and components - good_timecourses = timecourses[:, np.logical_not(bad_components)] - good_components = pipe.named_steps['ica'].components_[ - np.logical_not(bad_components)] - - # reconstruct vsdi data - clean_vsdi = good_components @ pipe.named_steps['pca'].components_ - clean_vsdi = good_timecourses @ clean_vsdi - clean_vsdi = clean_vsdi.reshape( - vsdi_shape[0], vsdi_shape[1], vsdi_shape[2]) - - return clean_vsdi - - -def find_outliers_old(vsdi, mean_vsdi, std_vsdi, nsigma=4): - # Get index of outliers from vsdi presenting average activity higher than 4 sigma - outliers = np.argwhere((mean_vsdi > nsigma*std_vsdi) - | (mean_vsdi < -nsigma*std_vsdi)).ravel() - - subsets = [] - start = 0 - end = 0 - - # Iterate over array - while end < len(outliers): - # Get first and last frame of each subset - while end + 1 < len(outliers) and outliers[end + 1] - outliers[start] == end - start + 1: - end += 1 - # Save first and last frame of each outlier subset - subsets.append((outliers[start], outliers[end])) - start = end = end + 1 - - return np.array(subsets) - - -def find_outliers(vsdi, nsigma=6): - mean_vsdi = np.mean(vsdi, axis=(0, 1)) - # How many standard deviations away a value is from the mean - zscore = stats.zscore(mean_vsdi, axis=0, ddof=0, nan_policy='propagate') - # Get index of outliers from vsdi presenting average activity higher than 4 sigma - outliers = np.argwhere((zscore > nsigma) | (zscore < -nsigma)).ravel() - - subsets = [] - start = 0 - end = 0 - - # Iterate over array - while end < len(outliers): - # Get first and last frame of each subset - while end + 1 < len(outliers) and outliers[end + 1] - outliers[start] == end - start + 1: - end += 1 - # Save first and last frame of each outlier subset - subsets.append((outliers[start], outliers[end])) - start = end = end + 1 - - return np.array(subsets) - - -def clean_outliers(vsdi, nsigma=6): - """ - Correct outliers in VSDI data - - Parameters - ---------- - vsdi : numpy ndarray - vsdi data in format (h, w, time) - nsigma : float - Number of standard deviations to consider an outlier - - Returns - ------- - vsdi : numpy ndarray - vsdi data with outliers corrected - """ - vsdi = vsdi.copy() - # Get first and last frame of each subset - outliers_subsets = find_outliers(vsdi, nsigma) - - # Set outlier frames to the mean between the previous and next frame - for i in range(len(outliers_subsets)): - start = outliers_subsets[i][0] - end = outliers_subsets[i][1] - if start == 0: - vsdi[:, :, start:end+1] = np.tile(vsdi[:, :, end+1] - [:, :, np.newaxis], (1, 1, end - start + 1)) - elif end == vsdi.shape[2]-1: - vsdi[:, :, start:end+1] = np.tile(vsdi[:, :, start-1] - [:, :, np.newaxis], (1, 1, end - start + 1)) - else: - average = np.divide(np.add( - vsdi[:, :, (start-1)][:, :, np.newaxis], vsdi[:, :, (end+1)][:, :, np.newaxis]), 2) - vsdi[:, :, start:end+1] = average - return vsdi - - -def design_matrix(b_data): - # Design matrix - # Returns a matrix of size (time, 6) with the following columns: - # 0: CS+ (2s) - # 1: CS+ trace (1s) - # 2: CS- (2s) - # 3: CS- trace (1s) - # 4: Reward (1s) - # 5: Lick - - fps = 50 - - Lick = b_data['Lick'] - CSp = b_data['CSp'] - CSn = b_data['CSn'] - frames = b_data['frames'] - - length = len(frames) - X = np.zeros((length, 6)) - - # Iterate over lick events - for i in range(len(Lick)): - frame = np.argmin(np.abs(frames - Lick[i])) - X[frame:frame+4, 5] = 1 - - # Iterate over CSp events - for i in range(len(CSp)): - frame = np.argmin(np.abs(frames - CSp[i])) - X[frame:frame + (fps * 2), 0] = 1 - frame += (fps * 2) + 1 - X[frame:frame + (fps * 1), 1] = 1 - frame += (fps * 1) + 1 - X[frame:frame + (fps * 1), 4] = 1 - - # Iterate over CSn events - for i in range(len(CSn)): - frame = np.argmin(np.abs(frames - CSn[i])) - X[frame:frame + (fps * 2), 2] = 1 - frame += (fps * 2) + 1 - X[frame:frame + (fps * 1), 3] = 1 - - return X - - -def pca(vsdi, raw_mask=None, n_comp=10, normalize=True): - # reshape vsdi data to (time, pixels) - X = vsdi.transpose(2, 0, 1) - # store original shape - # vsdi_shape = vsdi.shape - if raw_mask is not None: - # put out-of-mask values to zero - X = X[:, raw_mask] - else: - # flatten 2d pixels to array - X = X.reshape(vsdi.shape[0], vsdi.shape[1]*vsdi.shape[2]) - - # Create a pipeline with PCA - pipe = Pipeline([ - ('scaler', StandardScaler()), - ('pca', PCA(n_components=10)) - ]) - - # Fit the pipeline to vsdi data - out = pipe.fit(X) - fingerprints = out.named_steps['pca'].components_ - timecourses = fingerprints @ X.T - - return fingerprints, timecourses - - -def pca_ica(vsdi, raw_mask, n_comp=50, ica_max_iter=200): - # reshape vsdi data to (time, pixels) - X = vsdi.transpose(2, 0, 1) - # store original shape - # vsdi_shape = vsdi.shape - if raw_mask is not None: - # put out-of-mask values to zero - X = X[:, raw_mask] - else: - # flatten 2d pixels to array - X = X.reshape(vsdi.shape[0], vsdi.shape[1]*vsdi.shape[2]) - - # Create a pipeline with PCA and ICA - pipe = Pipeline([ - ('scaler', StandardScaler()), - ('pca', PCA(n_components=n_comp)), - ('ica', FastICA(n_components=n_comp, max_iter=ica_max_iter, - random_state=1, whiten='unit-variance')) - ]) - - out = pipe.fit(X) - fingerprints = out.named_steps["ica"].components_ @ out.named_steps["pca"].components_ - timecourses = fingerprints @ X.T - - return fingerprints, timecourses - - -def glm(Y, X): - # Fit Gaussian GLMs - X = sm.add_constant(X) - model = sm.GLM(Y, X, family=sm.families.Gaussian()) - results = model.fit() - - return results - - -def merge_masks(masks, threshold=0.5): - """ - Merge masks by voting majority / logical OR - - Input: masks (n_masks, h, w) - Output: mask_mean (h, w) - """ - mask_mean = np.mean(masks, axis=0) - mask_mean[mask_mean > threshold] = 1 - mask_mean[mask_mean <= threshold] = 0 - return mask_mean diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..d4bb2cb --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/_templates/layout.html b/docs/_templates/layout.html new file mode 100644 index 0000000..33c6788 --- /dev/null +++ b/docs/_templates/layout.html @@ -0,0 +1,10 @@ +{% extends "!layout.html" %} + +{% block extrahead %} +{{ super() }} + +{% endblock %} \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 0000000..2fbebad --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,35 @@ +# Configuration file for the Sphinx documentation builder. +# +# For the full list of built-in configuration values, see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Project information ----------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information + +import os +import sys +sys.path.insert(0, os.path.abspath("..")) + +project = 'VSDI Pipeline' +copyright = '2023, NeuroNetMem' +author = 'NeuroNetMem' +release = '1.0.0' + +# -- General configuration --------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration + +extensions = ["sphinx.ext.todo", + "sphinx.ext.viewcode", + "sphinx.ext.autodoc"] + +templates_path = ['_templates'] +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + + + +# -- Options for HTML output ------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output + +html_theme = 'sphinx_rtd_theme' +html_show_sourcelink = False +html_static_path = ['_static'] \ No newline at end of file diff --git a/docs/dim_reduction.rst b/docs/dim_reduction.rst new file mode 100644 index 0000000..6555989 --- /dev/null +++ b/docs/dim_reduction.rst @@ -0,0 +1,21 @@ +dim\_reduction package +====================== + +Submodules +---------- + +dim\_reduction.VAE module +------------------------- + +.. automodule:: dim_reduction.VAE + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: dim_reduction + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 0000000..4bc48b9 --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,19 @@ +.. VSDI Pipeline documentation master file, created by + sphinx-quickstart on Mon Jun 12 21:54:34 2023. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +VSDI Pipeline +========================================= + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + modules + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` diff --git a/docs/make.bat b/docs/make.bat new file mode 100755 index 0000000..32bb245 --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=. +set BUILDDIR=_build + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.https://www.sphinx-doc.org/ + exit /b 1 +) + +if "%1" == "" goto help + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/docs/modules.rst b/docs/modules.rst new file mode 100644 index 0000000..1346b77 --- /dev/null +++ b/docs/modules.rst @@ -0,0 +1,10 @@ +pipeline_vsdi +============= + +.. toctree:: + :maxdepth: 4 + + dim_reduction + preprocessing + visualization + vsdi diff --git a/docs/preprocessing.rst b/docs/preprocessing.rst new file mode 100644 index 0000000..9b547f6 --- /dev/null +++ b/docs/preprocessing.rst @@ -0,0 +1,37 @@ +preprocessing package +===================== + +Submodules +---------- + +preprocessing.clustering module +------------------------------- + +.. automodule:: preprocessing.clustering + :members: + :undoc-members: + :show-inheritance: + +preprocessing.utils module +-------------------------- + +.. automodule:: preprocessing.utils + :members: + :undoc-members: + :show-inheritance: + +preprocessing.vsdi\_preprocessing module +---------------------------------------- + +.. automodule:: preprocessing.vsdi_preprocessing + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: preprocessing + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/visualization.rst b/docs/visualization.rst new file mode 100644 index 0000000..4d6af51 --- /dev/null +++ b/docs/visualization.rst @@ -0,0 +1,21 @@ +visualization package +===================== + +Submodules +---------- + +visualization.vsdi\_visualization module +---------------------------------------- + +.. automodule:: visualization.vsdi_visualization + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: visualization + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/vsdi.rst b/docs/vsdi.rst new file mode 100644 index 0000000..9b9fb28 --- /dev/null +++ b/docs/vsdi.rst @@ -0,0 +1,29 @@ +vsdi package +============ + +Submodules +---------- + +vsdi.loaders module +------------------- + +.. automodule:: vsdi.loaders + :members: + :undoc-members: + :show-inheritance: + +vsdi.vsdi module +---------------- + +.. automodule:: vsdi.vsdi + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: vsdi + :members: + :undoc-members: + :show-inheritance: diff --git a/preprocessing/__init__.py b/preprocessing/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/preprocessing/behavior.py b/preprocessing/behavior.py new file mode 100644 index 0000000..90fcf70 --- /dev/null +++ b/preprocessing/behavior.py @@ -0,0 +1,202 @@ +# Data management +import numpy as np + +def make_design_matrix(b_data, event_sequences, fps=50): + """ + Generates a design matrix based on the provided event sequences. + + The design matrix contains rows corresponding to frames and columns corresponding to events. Each column index in the output matrix represents an event in the event sequences. The number of columns in the design matrix equals the maximum column index specified in the event sequences plus one. + + Parameters + ---------- + event_sequences : dict + A dictionary where keys are event names and values are lists of tuples. Each tuple contains the name of an event, the duration of the event in seconds, and the column index in the output matrix. + + Returns + ------- + matrix : ndarray + Design matrix where each row corresponds to a frame and each column corresponds to an event. + + Examples + -------- + >>> event_sequences = { + ... 'Lick': [('Lick', 1, 5)], + ... 'CSp': [('CS+', 2, 0), ('CS+ Trace', 1, 1), ('Reward', 1, 4)], + ... 'CSn': [('CS-', 2, 2), ('CS- Trace', 1, 3)], + ... } + >>> design_matrix(event_sequences) + # Output: + # matrix with columns: + # 0: CS+ (2s) + # 1: CS+ trace (1s) + # 2: CS- (2s) + # 3: CS- trace (1s) + # 4: Reward (1s) + # 5: Lick + """ + frames = b_data['frames'] + length = len(frames) + n_columns = max(col for seq in event_sequences.values() for _, _, col in seq) + 1 + X = np.zeros((length, n_columns)) + + for event, sequence in event_sequences.items(): + event_data = b_data[event] + + for i in range(len(event_data)): + + frame = np.argmin(np.abs(frames - event_data[i])) + + for event_name, duration, column in sequence: + duration_unit = fps * duration if fps * duration != 0 else 1 # extreme case for licks + X[frame:(frame + int(duration_unit)), column] = 1 + frame += fps * duration + + return X + +def subsets(Set): + """ + Finds the starting indices of subsets of consecutive numbers within the provided set. + + This function identifies series of consecutive numbers (subsets) within the input set. + It returns a numpy array of the starting indices of each identified subset. + + Parameters + ---------- + Set : list or array-like + List or array-like object containing the series of numbers to be partitioned into subsets. + + Returns + ------- + subsets : ndarray + A numpy array containing the starting indices of each identified subset of consecutive numbers. + + Examples + -------- + >>> subsets([1, 2, 3, 5, 6, 8, 9, 10]) + # Output: array([1, 5, 8]) + + Notes + ----- + The subsets are defined as series of consecutive numbers. For example, in the array + [1, 2, 3, 5, 6, 8, 9, 10], the subsets of consecutive numbers are [1, 2, 3], [5, 6] + and [8, 9, 10], so the function returns the starting points [1, 5, 8]. + """ + subsets = [] + start = 0 + end = 0 + + # Iterate over array + while end < len(Set): + + # Get first and last frame of each subset + while end + 1 < len(Set) and Set[end + 1] - Set[start] == end - start + 1: + end += 1 + + # Save first and last frame of each outlier subset + subsets.append(Set[start]) + start = end = end + 1 + + return np.array(subsets) + +def get_trials(feature): + """ + Finds the starting indices of trials within the provided design matrix vector. + + This function identifies the start of each trial within the input design matrix vector, + where trials are defined as sequences where the feature equals 1. + + Parameters + ---------- + feature : list or array-like + List or array-like object representing a design matrix vector. The start of each + trial is defined as the index where the feature value equals 1. + + Returns + ------- + feature_trials : ndarray + A numpy array containing the starting indices of each identified trial. + + Examples + -------- + >>> get_trials([0, 0, 1, 1, 1, 0, 0, 1, 1, 0]) + # Output: array([2, 7]) + + Notes + ----- + The trials are defined as sequences where the feature equals 1. For example, in the array + [0, 0, 1, 1, 1, 0, 0, 1, 1, 0], the trials are [1, 1, 1] and [1, 1], so the function + returns the starting points [2, 7]. + """ + # Find the indices where feature is 1 + feature_trials = subsets(np.where(feature == 1)[0]) + + return feature_trials + +def compute_lick_rate(data, trial_onsets, fps): + + lick_rates = [] + + for i in range(len(trial_onsets)): + + trial_start = trial_onsets[i] + # Baseline -1 s before CS presentation + baseline_licks = np.sum(data[(trial_start-fps):trial_start]) + # Number of licks in trace period + trace_licks = np.sum(data[trial_start+(2*fps):trial_start+(3*fps)]) + # Corrected lick rate + lick_rate = trace_licks - baseline_licks + + lick_rates.append(lick_rate) + + return lick_rates + +def compute_and_add_lick_rate(df, fps): + """ + Lick Rate (Hz) per frame using X dataframe version + """ + # Group by 'Animal', 'Day', 'Session' and apply rolling window calculation + df['Lick Rate (Hz)'] = df.groupby(['Animal', 'Day', 'Session'])['Lick'].transform(lambda x: x.rolling(fps, min_periods=1).sum()) + return df + +def store_indices(animals, days, sessions, outpath): + """ + Store cumulative index (based on X matrix length) for each session, day, and animal, + as well as trial indices for CS+ and CS- trials in a nested dictionary structure. + + :param animals: List of animal names + :param days: List of days + :param sessions: List of sessions + :param outpath: Path to the output directory + :return: A nested dictionary containing the cumulative indices and trial indices + """ + # Initialize an empty dictionary + X = {animal: {day: {} for day in days} for animal in animals} + + # Iterate over all animals, days, and sessions + for animal in animals: + for day in days: + # Initialize the cumulative count + cumulative_count = 0 + + for session in sessions: + # Load design matrix + X_matrix = np.loadtxt(outpath.joinpath(f"X_{animal}_{day}_{session}.csv"), delimiter=",") + + # Here we are assuming 'CS+' info is in column 0 and 'CS-' info is in column 2 + trial_types = ['CS+', 'CS-'] + for trial_type, column in zip(trial_types, [0, 2]): + feature = X_matrix[:, column] + trial_indices = get_trials(feature) + + # Store the trial indices in the nested dictionary + if session not in X[animal][day]: + X[animal][day][session] = {} + X[animal][day][session][trial_type] = trial_indices + + # Update the cumulative count + cumulative_count += len(X_matrix) + + # Store the cumulative count in the nested dictionary + X[animal][day][session]['Cumulative Index'] = cumulative_count + + return X diff --git a/preprocessing/pca_ica.ipynb b/preprocessing/pca_ica.ipynb deleted file mode 100644 index 37b53b6..0000000 --- a/preprocessing/pca_ica.ipynb +++ /dev/null @@ -1,358 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "import sys\n", - "import os\n", - "sys.path.append(os.path.abspath('../'))\n", - "from scipy.io import loadmat\n", - "import loaders\n", - "from vsdi_preprocessing import clean_outliers,pca_ica,glm\n", - "from pathlib import Path" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "datapath = Path('/Users/davide/Dropbox/Projects/ATC/ATC_Data_preprocessed')\n", - "atc = loadmat(datapath.joinpath('A04/Day1/ATC1.mat'))\n", - "vsdi = loadmat(datapath.joinpath('A04/Day1/vsdi_ATC1.mat'))['vsdi_data']\n", - "mask = loadmat(datapath.joinpath(f'A04/Day1/vsdi_mask.mat'))['mask']\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(94, 54, 29999)" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "vsdi.shape" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "from sklearn.decomposition import PCA, FastICA\n", - "from sklearn.preprocessing import StandardScaler\n", - "from sklearn.pipeline import Pipeline\n", - "\n", - "def pca_ica(vsdi,mask):\n", - " X = vsdi.transpose(2, 0, 1)\n", - " X = X*mask\n", - " X = X.reshape(X.shape[0], X.shape[1]*X.shape[2])\n", - "\n", - " # Create a pipeline with PCA and ICA\n", - " pipe = Pipeline([\n", - " ('scaler', StandardScaler()),\n", - " ('pca', PCA(n_components=10)),\n", - " ('ica', FastICA(n_components=10, max_iter=200,\n", - " random_state=1, whiten='unit-variance'))\n", - " ])\n", - "\n", - " out = pipe.fit(X)\n", - "\n", - " fingerprints = out.named_steps[\"ica\"].components_ @ out.named_steps[\"pca\"].components_\n", - " timecourses = fingerprints @ X.T\n", - "\n", - " return fingerprints,timecourses\n", - "\n", - "clean_vsdi = clean_outliers(vsdi,nsigma=5)\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "ename": "TypeError", - "evalue": "'numpy.ndarray' object is not callable", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[23], line 11\u001b[0m\n\u001b[1;32m 8\u001b[0m vsdi2 \u001b[39m=\u001b[39m loadmat(datapath\u001b[39m.\u001b[39mjoinpath(\u001b[39mf\u001b[39m\u001b[39m'\u001b[39m\u001b[39m{\u001b[39;00manimal\u001b[39m}\u001b[39;00m\u001b[39m/\u001b[39m\u001b[39m{\u001b[39;00mday\u001b[39m}\u001b[39;00m\u001b[39m/vsdi_ATC2.mat\u001b[39m\u001b[39m'\u001b[39m))[\u001b[39m'\u001b[39m\u001b[39mvsdi_data\u001b[39m\u001b[39m'\u001b[39m]\n\u001b[1;32m 9\u001b[0m mask \u001b[39m=\u001b[39m loadmat(datapath\u001b[39m.\u001b[39mjoinpath(\u001b[39mf\u001b[39m\u001b[39m'\u001b[39m\u001b[39m{\u001b[39;00manimal\u001b[39m}\u001b[39;00m\u001b[39m/\u001b[39m\u001b[39m{\u001b[39;00mday\u001b[39m}\u001b[39;00m\u001b[39m/vsdi_mask.mat\u001b[39m\u001b[39m'\u001b[39m))[\u001b[39m'\u001b[39m\u001b[39mmask\u001b[39m\u001b[39m'\u001b[39m]\n\u001b[0;32m---> 11\u001b[0m vsd1 \u001b[39m=\u001b[39m clean_vsdi(vsdi1,nsigma\u001b[39m=\u001b[39;49m\u001b[39m5\u001b[39;49m)\n\u001b[1;32m 12\u001b[0m vsdi2 \u001b[39m=\u001b[39m clean_vsdi(vsdi2,nsigma\u001b[39m=\u001b[39m\u001b[39m5\u001b[39m)\n\u001b[1;32m 14\u001b[0m vsdi \u001b[39m=\u001b[39m np\u001b[39m.\u001b[39mdstack([vsdi1,vsdi2])\n", - "\u001b[0;31mTypeError\u001b[0m: 'numpy.ndarray' object is not callable" - ] - } - ], - "source": [ - "animals = ['A04']\n", - "days = ['Day1','Day3','Day5','Day7']\n", - "\n", - "for animal in animals:\n", - " vsdi_total = []\n", - " for day in days:\n", - " vsdi1 = loadmat(datapath.joinpath(f'{animal}/{day}/vsdi_ATC1.mat'))['vsdi_data']\n", - " vsdi2 = loadmat(datapath.joinpath(f'{animal}/{day}/vsdi_ATC2.mat'))['vsdi_data']\n", - " mask = loadmat(datapath.joinpath(f'{animal}/{day}/vsdi_mask.mat'))['mask']\n", - "\n", - " vsd1 = clean_vsdi(vsdi1,nsigma=5)\n", - " vsdi2 = clean_vsdi(vsdi2,nsigma=5)\n", - "\n", - " vsdi = np.dstack([vsdi1,vsdi2])\n", - " print(vsdi.shape)\n", - " vsdi_total.append(vsdi1)\n", - "\n", - "vsdi_total = np.dstack(vsdi_total)\n", - "print('Done')\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pca_ica(vsdi_total,mask)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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XZl9fvWrX8Xxxx+Pzs5OdHZ2Yt26dfjpT3865f7S+PznP4+6ujpcdNFF+9Xvpz71KdTV1ZX9rV27dlrPVVQiO5AdiP2zA2D6bUF2IDs4GMwFOwBm3hZkB7VN3uwAmNv3hANmB1HOuPbaa6Pm5uboW9/6VvSrX/0qet/73hcVCoVo165dE/r8T37yk+jv//7vox/+8IcRgOi6664r2//5z38+6urqiq6//vrowQcfjN785jdHa9asifbu3ZvZ59lnnx1dc8010datW6MHHnggeuMb3xitWrUq6u/vj4/5wAc+EB122GHR5s2bo3vuuSc644wzojPPPDOzzx//+MfRjTfeGD3++OPRtm3bor/7u7+Lmpqaoq1bt06pP89dd90VrV69Ojr++OOjj3zkI1M+zyiKossuuyw69thjox07dsR/L7zwwn71KaojO5AdiP23gyiafluQHcgODjRzxQ6iaGZtQXZQ2+TRDqJobt8TDpQd5O5l9bTTTos2bNgQr4+OjkYrVqyINm3aNOm+/EAcGxuLli1bFl1++eXxtmKxGLW0tET/8R//MeF+u7u7IwDRli1b4j6ampqi73//+/Exjz76aAQguuOOOybc74IFC6JvfOMb+91fX19fdNRRR0U333xz9Ad/8AfxQJxqv5dddll0wgknpO6brt8uypEdyA7E9NpBFM2MLcgOEmQHM8NctoMomh5bkB3UPrVgB1E0t+4JB8oOchUGPDw8jHvvvRfr16+Pt9XX12P9+vW444479rv/p556Cjt37izrv6urC6effvqk+u/p6QEALFy4EABw7733YmRkpKzftWvXYtWqVRPqd3R0FNdeey327NmDdevW7Xd/GzZswDnnnFP2+f09zyeeeAIrVqzAEUccgfPPPx/PPPPMtPx2UYnsQHYgZt4OgOmxBdmB7GAmmat2AEyvLcgOaptasQNg7t0TDoQdNE7q6BnmxRdfxOjoKJYuXVq2fenSpXjsscf2u/+dO3fG/fn+uW88xsbGcNFFF+FVr3oVjjvuuLjf5uZmFAqFSfX78MMPY926dRgcHER7ezuuu+46HHPMMXjggQem1B8AXHvttbjvvvtw9913V+yb6nmefvrp+Pa3v42Xv/zl2LFjBz796U/j93//97F169Yp9ymykR3IDsTM2wGw/7YgO5AdzDRzzQ6A6bcF2UHtUwt2AMy9e8KBsoNcvazWAhs2bMDWrVvx85//fL/7evnLX44HHngAPT09+MEPfoALLrgAW7ZsmXJ/zz77LD7ykY/g5ptvRmtr636fH3nDG94QLx9//PE4/fTTcfjhh+N73/se2trapu17RO0gO5AdCNmB7EAA02sHwPTaguxAHEjm2j3hQNlBrsKAFy9ejIaGhopKUbt27cKyZcv2u3/2MdX+L7zwQtxwww342c9+hpUrV5b1Ozw8jGKxOKl+m5ubceSRR+Lkk0/Gpk2bcMIJJ+Cf/umfptzfvffei+7ubpx00klobGxEY2MjtmzZgquuugqNjY1YunTplPr1FAoFHH300XjyySenfK4iG9mB7EDMvB0A+2cLsoMSsoOZZa7ZATC9tiA7mB3k3Q4A3ROAmbODXL2sNjc34+STT8bmzZvjbWNjY9i8eTPWrVu33/2vWbMGy5YtK+u/t7cXv/zlL6v2H0URLrzwQlx33XW45ZZbsGbNmrL9J598Mpqamsr63bZtG5555plJnffY2BiGhoam3N9ZZ52Fhx9+GA888ED8d8opp+D888+Pl6fjPPv7+/HrX/8ay5cvn7bfLhJkB7IDMfN2AEzNFmQH5cgOZpa5bgfA/tmC7GB2kFc7AHRPCJkxO5hUOaYDwLXXXhu1tLRE3/72t6NHHnkkev/73x8VCoVo586dE/p8X19fdP/990f3339/BCC64oorovvvvz96+umnoygqlaUuFArRj370o+ihhx6K3vKWt4xblvqDH/xg1NXVFd16661l5ZkHBgbiYz7wgQ9Eq1atim655ZbonnvuidatWxetW7cus89LLrkk2rJlS/TUU09FDz30UHTJJZdEdXV10X//939Pqb8swkpfU+33r//6r6Nbb701euqpp6Jf/OIX0fr166PFixdH3d3d03quIkF2IDsQ+28HUTT9tiA7kB0caOaKHUTRgbEF2UFtkkc7iKK5fU84UHaQu5fVKIqiL3/5y9GqVaui5ubm6LTTTovuvPPOCX/2Zz/7WQSg4u+CCy6IoqhUmvoTn/hEtHTp0qilpSU666yzom3btlXtM60/ANE111wTH7N3797oQx/6ULRgwYJo3rx50Vvf+tZox44dmX2++93vjg4//PCoubk5OuSQQ6KzzjorHoRT6S8LPxCn0u/b3/72aPny5VFzc3N06KGHRm9/+9ujJ598ctrP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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import matplotlib.pyplot as plt\n", - "plt.figure(figsize=(10,5))\n", - "for i,f in enumerate(fingerprints):\n", - " ax = plt.subplot(2,5,i+1)\n", - " ax.matshow(f.reshape(vsdi.shape[:2]),cmap=plt.cm.gnuplot2)\n", - "plt.tight_layout()\n" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Match masks" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Mask clustering" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "from itertools import product\n", - "\n", - "animals = ['A04','A06','A07','A08']\n", - "days = ['Day1','Day3','Day5','Day7']\n", - "\n", - "masks = []\n", - "for animal,day in product(animals,days):\n", - " try:\n", - " mask = loadmat(datapath.joinpath(f'{animal}/{day}/vsdi_mask.mat'))['mask']\n", - " masks.append(mask)\n", - "\n", - " except FileNotFoundError:\n", - " print(f\"Not found mask for {animal},{day}\")\n", - " masks.append(np.nan)\n", - " continue\n", - " except OSError:\n", - " print(f\"OS error for {animal},{day}\")\n", - " masks.append(np.nan)\n", - " continue\n", - " \n" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "16" - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "len(masks)" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA0YAAAPeCAYAAAAoEQo2AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy88F64QAAAACXBIWXMAAA9hAAAPYQGoP6dpAABT0klEQVR4nO3da5CV1b0n4P8WsGlAONACyuU0g4iGqwhq4miaSIwkGsTCIJrEZKxJvBUTPWqiE1vBa6Fy9JjjNcRUNJUao2Iuoo4y4zknUzGQaGSCkqgIIWCCjKFEEwWBNR9S3WTTXLqhL+/u9TxV/YG113732pffhx/r3e8upZRSAAAAZOyAjl4AAABAR1OMAACA7ClGAABA9hQjAAAge4oRAACQPcUIAADInmIEAABkTzECAACypxgBAADZa/ViNHny5BgzZkxrH7bD/fCHP4x+/frFe++919FLaTNPP/109OrVKzZs2NDRS6ENyGblks3OTTYrl2x2XnJZufYnl3aMmmHbtm1x7bXXxuzZs6NXr16N4x9++GHMnTs3hg8fHlVVVTF8+PC44YYbYuvWrXs83o033hilUmm/Ard69eoolUq7/Psf/+N/7PZ+H374YYwaNSpKpVLcdtttZbdNnTo1RowYETfffPM+rwvak2xCMckmFI9c7l3XFt8jQz/96U/jd7/7XXz1q18tG//CF74QjzzySJx33nkxadKk+MUvfhH19fWxZs2auP/++3d5rLVr18ZNN90UPXv2bJW1nX322fGZz3ymbOxjH/vYbud/61vfijVr1uz29vPPPz8uv/zymDt3bhx00EGtskZoK7IJxSSbUDxy2QypldXV1aXRo0e39mE71LRp09IJJ5xQNrZ06dIUEam+vr5s/LLLLkulUiktW7Zsl8c666yz0kknnbTfr9OqVatSRKRbb7212fdZv3596tOnT7ruuut2e9/169enLl26pO985zv7vDaKSTZlk2KSTdmkeOQyz1y26FS6d999Ny655JIYNmxYVFVVxYABA+Lkk0+OF198scncV155JT7xiU9Ejx49YvDgwXHLLbeU3b5ly5a45pprYuLEidGnT5/o2bNnnHjiifHcc8+VzWvYYrvtttvi9ttvj9ra2qiuro66urpYvnx5k8f97W9/G2eeeWb069cvunfvHpMmTYqf/OQnTeatXLkyVq5cudfn/MEHH8TTTz8dn/zkJ8vGf/azn0VExKxZs8rGZ82aFSmlePjhh5sc6z/+4z/i0UcfjTvuuGOvj9sSf/nLX2LLli17nXfllVfGEUccEV/4whd2O2fAgAExbty4+PGPf9yaS6SNyeYOskmRyOYOsklRyOUOcrmTlrSoc845Jx144IHpn/7pn9KCBQvSvHnz0mc/+9n0/e9/v3FOXV1dGjRoUBo6dGj62te+lu6+++500kknpYhITz75ZOO8DRs2pEMPPTT90z/9U7rnnnvSLbfcko444ojUrVu39Otf/7pxXkOTHDt2bBo2bFiaN29emjt3burXr1/q379/+tOf/tQ4d/ny5alPnz5p1KhRad68eelf//Vf08c//vFUKpXSwoULy55LbW1tqq2t3etz/j//5/+kiEg/+clPysZvuummFBHpjTfeKBt/+eWXU0SkU045pWx869atady4cen8889vfJ1ao2H36tUrRUQqlUpp0qRJ6X/+z/+5y/lLlixJBxxwQPr5z3++13b+X//rf00HH3zwPq+N9iebO8gmRSKbO8gmRSGXO8hluRYVoz59+qSLL754j3Pq6upSRKQHH3ywcWzz5s3pkEMOSTNmzGgc27p1a9q8eXPZfTdu3JgGDhyYzjvvvMaxhiddXV2d1q5d2zi+ZMmSFBHp0ksvbRybMmVKGjt2bPrggw8ax7Zv356OP/74dPjhh5c9VnM/SAsWLEgRkX7zm9+UjT/22GMpItJDDz1UNn7vvfemiEhjxowpG//Xf/3X1KdPn/TWW2+llPb/g/T73/8+fepTn0r33HNP+slPfpLuuOOO9I//+I/pgAMOSE888UTZ3O3bt6djjz02nX322SmlvW9bNoRk/fr1+7w+2pds7iCbFIls7iCbFIVc7iCX5VpUjGpra9OkSZPSunXrdjunrq4u9erVK23fvr1sfNq0aWnChAm7vM+2bdvS22+/nTZs2JBOPfXUdNRRRzXe1vCkG16Ev3fcccelI444IqWU0ttvv51KpVK6/vrr04YNG8r+5s6dmyKi7IPYXPPmzdvlfd9///1UW1ubBg4cmB577LG0evXq9PDDD6eamprUtWvXdNhhhzXO/X//7/+lfv36pdtuu63sdWrtc1fffvvtNHDgwMbXpMEDDzyQqqur05o1a1JKe/8g3XPPPSki0ssvv9yq66PtyOYOskmRyOYOsklRyOUOclmuRd8xuuWWW2L58uUxdOjQOPbYY2POnDnxxhtvNJk3ZMiQKJVKZWN9+/aNjRs3lo1973vfi3HjxkX37t2jpqYm+vfvH4sWLYp33nmnyTEPP/zwJmMjR46M1atXR0TE66+/HimlqK+vj/79+5f9XXvttRER8dZbb7Xk6ZZJKZX9u3v37rFo0aKoqamJGTNmxLBhw+Lcc8+Na665Jvr161d2GcSrr746+vXrF7Nnz97nx2+Ofv36xX/5L/8lfve738XatWsjImLTpk1x1VVXxRVXXBFDhw5t1nEanuvO7yHFJZs7yCZFIps7yCZFIZc7yGW5Fl2ue+bMmXHiiSfG448/Hs8880zceuutMW/evFi4cGF8+tOfbpzXpUuXPS4wIuL73/9+fPnLX47p06fHFVdcEQMGDIguXbrEzTff3Kwvke1s+/btERFx+eWXxymnnLLLOSNGjGjxcWtqaiIiYuPGjTFkyJCy20aPHh3Lly+PV155JTZu3BijRo2K6urquPTSS6Ouri4iIl577bW4//7744477og333yz8b4ffPBBfPjhh7F69ero3bt39OvXr8Vr25WGD8uf//znGDJkSNx2222xZcuWOOussxpD1/Ah27hxY6xevToGDRoUBx54YOMxGgJ/8MEHt8qaaHuyKZsUk2zKJsUjl3K5W83f2Gpq/fr1afDgwek//+f/3Di2uy21L33pS2XnQJ5++ulp+PDhTbYojz/++LJ5zd16XL9+fYqIdNVVV+3PU2qi4ctqP/7xj5s1f9GiRSki0n333ZdSSum5555LEbHHv6997Wuttt7LLrssRUR68803U0p/e9339vh//+XAlHyJtDOQzaZkkyKQzaZkk44ml03lmstm7xht27Yt3nvvvejTp0/j2IABA2LQoEGxefPm5h6mUUMLTyk1bnEtWbIknn/++fjHf/zHJvN/9KMfxbp162Lw4MEREbF06dJYsmRJXHLJJY1rmTx5ctx3330xe/bsOPTQQ8vuv2HDhujfv3/jvxta/GGHHbbHdU6cODEOPPDA+NWvfhXTpk3b49z3338/6uvr49BDD42zzz47IiLGjBkTjz/+eJO5V199dbz77rvxL//yL3tdw67s/HwiItatWxcPPPBAjBs3rvH5/7f/9t9i+vTpZfPeeuutOP/88+PLX/5ynH766fGf/tN/Krv9hRde2OOPalEssimbFJNsyibFI5dyuSfNLkbvvvtuDBkyJM4888wYP3589OrVKxYvXhy//OUvY/78+S160IiI0047LRYuXBhnnHFGnHrqqbFq1aq49957Y9SoUfHee+81mT9ixIg44YQT4sILL4zNmzfHHXfcETU1NfH1r3+9cc5dd90VJ5xwQowdOza+8pWvxPDhw2P9+vXx/PPPx9q1a2PZsmWNc6dMmRIR0bgdtzvdu3ePT33qU7F48eK47rrrym6bOXNmDBo0KEaNGhWbNm2KBx54IN54441YtGhR46/sHnzwwU3eyIhovPb7zrfNmTMn5s6dG88991xMnjx5t+v6+te/HitXrowpU6bEoEGDYvXq1XHffffFX/7yl/iXf/mXxnlHH310HH300WX3bXjOo0eP3uWH7P/+3/8bF1988e5fFApFNmWTYpJN2aR45FIu96i5W0ubN29OV1xxRRo/fnw66KCDUs+ePdP48ePT3XffXTavuVuP27dvTzfddFOqra1NVVVVacKECemJJ55oMu/vrzgxf/78NHTo0FRVVZVOPPHEXf4a78qVK9O5556bDjnkkNStW7c0ePDgdNppp6VHH320bF5zL2+YUkoLFy5MpVKp8SoYDebNm5eOPPLI1L1799S3b980bdq0Jtt4u7O716nhl4ZXrFixx/v/4Ac/SB//+MdT//79U9euXdPBBx+czjjjjPTCCy/s9bH3dBWPe+65J/Xo0SNt2rSpWc+DjiebskkxyaZsUjxyKZd7sl/fMWoPe7sUX3vYunVrGjlyZLr66qvb/LGOOeaYdOaZZ7b54+zOUUcdlS655JIOe3wqh2y2L9mkuWSzfckmzSGX7Wtfc9miy3XnqkuXLnHdddfFXXfdtctt0dayadOmWLZsWZMtzvby9NNPx2uvvRZXXXVVhzw+tJRsQjHJJhSPXO5diy7XnbOzzjorzjrrrDZ9jN69e+/TF/9ay9SpU9s0KNAWZBOKSTaheORyz+wYAQAA2SultNNP4AIAAGTGjhEAAJA9xQgAAMieYgQAAGRPMQIAALKnGAEAANlTjAAAgOwpRgAAQPYUIwAAIHuKEQAAkD3FCAAAyJ5iBAAAZE8xAgAAsqcYAQAA2VOMAACA7ClGAABA9hQjAAAge4oRAACQPcUIAADInmIEAABkTzECAACypxgBAADZU4wA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AIDsKUYAAED2FCMAACB7ihEAAJA9xQgAAMieYgQAAGRPMQIAALKnGAEAANlTjAAAgOwpRgAAQPYUIwAAIHuKEQAAkD3FCAAAyJ5iBAAAZE8xAgAAsqcYAQAA2VOMAACA7ClGAABA9hQjAAAge4oRAACQPcUIAADInmIEAABkTzECAACy1+rFaPLkyTFmzJjWPmyH++EPfxj9+vWL9957r6OX0maefvrp6NWrV2zYsKGjl0IbkM3KJZudm2xWLtnsvOSycu1PLu0YNcO2bdvi2muvjdmzZ0evXr0axz/88MOYO3duDB8+PKqqqmL48OFxww03xNatW3d5nBdffDGmTZsW/fr1ix49esSYMWPizjvv3K+1rVy5Ms4555wYMGBAVFdXx+GHHx7f/OY3m8xbsWJFTJ06NXr16hX9+vWLL37xi00+MFOnTo0RI0bEzTffvF9rgvYim1BMsgnFI5d713Wfn0FGfvrTn8bvfve7+OpXv1o2/oUvfCEeeeSROO+882LSpEnxi1/8Iurr62PNmjVx//33l8195pln4rOf/WxMmDAh6uvro1evXrFy5cpYu3btPq/rpZdeismTJ8fgwYPjsssui5qamlizZk384Q9/KJu3du3a+PjHPx59+vSJm266Kd5777247bbb4je/+U0sXbo0DjzwwMa5559/flx++eUxd+7cOOigg/Z5bdAeZBOKSTaheOSyGVIrq6urS6NHj27tw3aoadOmpRNOOKFsbOnSpSkiUn19fdn4ZZddlkqlUlq2bFnj2DvvvJMGDhyYzjjjjLRt27ZWWdO2bdvSmDFj0nHHHZf++te/7nHuhRdemKqrq9Pvf//7xrFnn302RUS67777yuauX78+denSJX3nO99plXVSHLIpmxSTbMomxSOXeeayRcVo06ZN6Wtf+1qqra1NBx54YOrfv3/65Cc/mV544YXGOQ0fpJdffjlNnjw5VVdXp0GDBqV58+aVHWvz5s2pvr4+HX300al3796pR48e6YQTTkj/+3//77J5q1atShGRbr311vTP//zP6R//8R9T9+7d08c//vH0m9/8pskaV6xYkWbMmJH69u2bqqqq0sSJE9OPf/zjJvNef/319Prrr+/1Ob///vvpwAMPTHPmzCkbnz9/foqI9PLLL5eN//KXv0wRkf77f//vjWP33HNPioj0yiuvpJRSeu+99/b7A/XUU0+liEhPPvlkSimlv/zlL2nr1q27nDtgwID0uc99rsn4yJEj05QpU5qMT5gwIU2bNm2/1kf7ks0dZJMikc0dZJOikMsd5LJci75jdMEFF8Q999wTM2bMiLvvvjsuv/zyqK6ujhUrVpTN27hxY0ydOjXGjx8f8+fPjyOPPDK+8Y1vxFNPPdU4Z9OmTbFgwYKYPHlyzJs3L+bMmRMbNmyIU045JV566aUmj/3ggw/GnXfeGRdffHFcddVVsXz58jjppJNi/fr1jXNefvnl+OhHPxorVqyIK6+8MubPnx89e/aM6dOnx+OPP152vClTpsSUKVP2+pxfeOGF2LJlSxx99NFl45s3b46IiOrq6rLxHj16NN6vweLFi6N3796xbt26OOKII6JXr17Ru3fvuPDCC+ODDz7Y6xp2ZfHixRERUVVVFZMmTYqePXtGjx49YtasWfHnP/+5cd66devirbfeikmTJjU5xrHHHhu//vWvm4xPnDgxfv7zn+/TuugYsrmDbFIksrmDbFIUcrmDXO6kJS2qT58+6eKLL97jnLq6uhQR6cEHH2wc27x5czrkkEPSjBkzGse2bt2aNm/eXHbfjRs3poEDB6bzzjuvcayhYVdXV6e1a9c2ji9ZsiRFRLr00ksbx6ZMmZLGjh2bPvjgg8ax7du3p+OPPz4dfvjhZY9VW1ubamtr9/qcFyxYkCKiSZt/7LHHUkSkhx56qGz83nvvTRGRxowZ0zg2bty41KNHj9SjR480e/bs9Nhjj6XZs2eniEizZs3a6xp2Zdq0aSkiUk1NTfr85z+fHn300VRfX5+6du2ajj/++LR9+/aU0o7G//fvR4MrrrgiRUTZ65VSSjfddFOKiLR+/fp9WhvtTzZ3kE2KRDZ3kE2KQi53kMtyLSpGtbW1adKkSWndunW7nVNXV5d69erV+EQaTJs2LU2YMGGX99m2bVt6++2304YNG9Kpp56ajjrqqMbbGj5IZ599dpP7HXfccemII45IKaX09ttvp1KplK6//vq0YcOGsr+5c+emiCj7IDbXvHnzdnnf999/P9XW1qaBAwemxx57LK1evTo9/PDDqaamJnXt2jUddthhjXOHDx+eIiJdcMEFZcc4//zzU0SkV199tcXrOumkk1JEpKlTp5aN33zzzSki0rPPPptSSuk//uM/UkSkhx9+uMkx6uvrU0SkjRs3lo03bJXuvK1KccnmDrJJkcjmDrJJUcjlDnJZrkWn0t1yyy2xfPnyGDp0aBx77LExZ86ceOONN5rMGzJkSJRKpbKxvn37xsaNG8vGvve978W4ceOie/fuUVNTE/37949FixbFO++80+SYhx9+eJOxkSNHxurVqyMi4vXXX4+UUtTX10f//v3L/q699tqIiHjrrbda8nTLpJTK/t29e/dYtGhR1NTUxIwZM2LYsGFx7rnnxjXXXBP9+vUruwxiw/bk2WefXXaMc845JyIinn/++RavZ2/HbNg6bJjXsFX69xq2PXfePm14rju/hxSXbO4gmxSJbO4gmxSFXO4gl+VadLnumTNnxoknnhiPP/54PPPMM3HrrbfGvHnzYuHChfHpT3+6cV6XLl12ef+/fzO+//3vx5e//OWYPn16XHHFFTFgwIDo0qVL3HzzzbFy5cqWLCsiIrZv3x4REZdffnmccsopu5wzYsSIFh+3pqYmIv52numQIUPKbhs9enQsX748Xnnlldi4cWOMGjUqqqur49JLL426urrGeYMGDYqXX345Bg4cWHb/AQMGNB67pQYNGhQRsddjHnrooRER8cc//rHJMf74xz9Gv379oqqqqmy84b4HH3xwi9dFx5BN2aSYZFM2KR65lMvdafHvGB166KFx0UUXxUUXXRRvvfVWHH300XHjjTeWfZCa49FHH43hw4fHwoULy5pcQxve2WuvvdZk7NVXX41hw4ZFRMTw4cMjIqJbt27xyU9+skVr2ZMjjzwyIiJWrVoVY8eObXJ7qVSK0aNHN/77ySefjO3bt5etYeLEifHss882flmtwZtvvhkREf3792/xuiZOnBjf/va3Y926dWXjOx9z8ODB0b9///jVr37V5BhLly6No446qsn4qlWr4uCDD96nddFxZLOcbFIUsllONikCuSwnl3/T7FPptm3b1mRLcMCAATFo0KBdbmvtTUML//vWvWTJkt1uw/3oRz8qe9GWLl0aS5YsafwADxgwICZPnhz33XffLtvkzr+Ku3LlymY1+YkTJ8aBBx64yzdiZ++//37U19fHoYceWrYlOHPmzIiI+M53vlM2f8GCBdG1a9eYPHnyXo+9s9NPPz2qqqriu9/9buP/LjQcMyLi5JNPbhybMWNGPPHEE2U/lPW//tf/ildffTU+97nPNTn2Cy+8EB/72MdavCY6hmzKJsUkm7JJ8cilXO5Rc7+MtHHjxtSzZ8/0pS99Kf3zP/9zuv/++9PMmTNTRKT58+c3ztvdD2J96UtfKrtqxgMPPJAiIk2bNi3dd9996corr0z/8A//kEaPHl02r+HLamPHjk3Dhg1L8+bNS9ddd13q169fqqmpSW+++Wbj3Jdffjn17ds31dTUpCuvvDLdf//96frrr0+f+cxn0rhx48rW09yreKSU0mmnnZY+9rGPNRn/3Oc+l772ta+l++67L916663pIx/5SKqqqkqLFy9uMve8885LEZFmzpyZ7rrrrvS5z30uRUS66qqryuZde+21KSLSc889t9d1XXfddSki0sknn5zuuuuu9NWvfjWVSqUmX+xbs2ZNqqmpSYcddli6884700033ZT69u3b5IonKe34QawFCxY045WhCGRTNikm2ZRNikcu5XJPml2MNm/enK644oo0fvz4dNBBB6WePXum8ePHp7vvvrtsXnM/SNu3b0833XRTqq2tTVVVVWnChAnpiSeeaDLv738Qa/78+Wno0KGpqqoqnXjiiWW/xttg5cqV6dxzz02HHHJI6tatWxo8eHA67bTT0qOPPlo2ryUfpIULF6ZSqZTWrFlTNj5v3rx05JFHpu7du6e+ffumadOmpV//+te7PMaWLVvSnDlzUm1tberWrVsaMWJEuv3225vMa/il4RUrVux1Xdu3b0/f+ta30siRI1O3bt3S0KFD09VXX522bNnSZO7y5cvTpz71qdSjR4/0D//wD+nzn/98+tOf/tRk3j333JN69OiRNm3atNfHpxhkUzYpJtmUTYpHLuVyT1p0ue6O8PcfpI6ydevWNHLkyHT11Ve3+WMdc8wx6cwzz2zzx9mdo446Kl1yySUd9vhUDtlsX7JJc8lm+5JNmkMu29e+5rJFl+vOVZcuXeK6666Lu+66K9577702e5xNmzbFsmXL4rrrrmuzx9iTp59+Ol577bW46qqrOuTxoaVkE4pJNqF45HLvWnxVulydddZZcdZZZ7XpY/Tu3XufvvjXWqZOndqmQYG2IJtQTLIJxSOXe2bHCAAAyF4ppZ1+AhcAACAzdowAAIDsKUYAAED2FCMAACB7ihEAAJA9xQgAAMieYgQAAGRPMQIAALKnGAEAANlTjAAAgOwpRgAAQPYUIwAAIHuKEQAAkD3FCAAAyJ5i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BAAAZE8xAgAAsqcYAQAA2VOMAACA7ClGAABA9hQjAAAge4oRAACQPcUIAADInmIEAABkTzECAACypxgBAADZU4wAAIDsKUYAAED2FCMAACB7ihEAAJA9xQgAAMieYgQAAGRPMQIAALKnGAEAANlTjAAAgOwpRgAAQPYUIwAAIHuKEQAAkD3FCAAAyJ5iBAAAZE8xAgAAsqcYAQAA2VOMAACA7ClGAABA9hQjAAAge4oRAACQvVYvRpMnT44xY8a09mE73A9/+MPo169fvPfeex29lDbzyiuvRNeuXWP58uUdvRTagGxWLtnsvOSycsll5yablWt/smnHqBm2bdsW1157bcyePTt69erVOP7hhx/G3LlzY/jw4VFVVRXDhw+PG264IbZu3brL47z44osxbdq06NevX/To0SPGjBkTd955536tbeXKlXHOOefEgAEDorq6Og4//PD45je/WTZn6dKlcdFFF8XEiROjW7duUSqVdnmsUaNGxamnnhrXXHPNfq0J2otsQvHIJRSTbO5d131afWZ++tOfxu9+97v46le/Wjb+hS98IR555JE477zzYtKkSfGLX/wi6uvrY82aNXH//feXzX3mmWfis5/9bEyYMCHq6+ujV69esXLlyli7du0+r+ull16KyZMnx+DBg+Oyyy6LmpqaWLNmTfzhD38om/fkk0/GggULYty4cTF8+PB49dVXd3vMCy64ID7zmc/EypUr47DDDtvntUF7kE0oHrmEYpLNZkitrK6uLo0ePbq1D9uhpk2blk444YSysaVLl6aISPX19WXjl112WSqVSmnZsmWNY++8804aOHBgOuOMM9K2bdtaZU3btm1LY8aMSccdd1z661//use5f/rTnxrnXHzxxWlPb/uWLVtS3759mzwvKp9syibFI5dySTHJZp7ZbNGpdO+++25ccsklMWzYsKiqqooBAwbEySefHC+++GKTua+88kp84hOfiB49esTgwYPjlltuKbt9y5Ytcc0118TEiROjT58+0bNnzzjxxBPjueeeK5u3evXqKJVKcdttt8Xtt98etbW1UV1dHXV1dbs8d/C3v/1tnHnmmdGvX7/o3r17TJo0KX7yk580mbdy5cpYuXLlXp/zBx98EE8//XR88pOfLBv/2c9+FhERs2bNKhufNWtWpJTi4Ycfbhz7wQ9+EOvXr48bb7wxDjjggPjLX/4S27dv3+tj78kzzzwTy5cvj2uvvTaqq6vjr3/9a2zbtm2XcwcOHBjV1dXNOm63bt1i8uTJ8eMf/3i/1kf7ks0dZJOikMsd5JIikc0dZLNci4rRBRdcEPfcc0/MmDEj7r777rj88sujuro6VqxYUTZv48aNMXXq1Bg/fnzMnz8/jjzyyPjGN74RTz31VOOcTZs2xYIFC2Ly5Mkxb968mDNnTmzYsCFOOeWUeOmll5o89oMPPhh33nlnXHzxxXHVVVfF8uXL46STTor169c3znn55Zfjox/9aKxYsSKuvPLKmD9/fvTs2TOmT58ejz/+eNnxpkyZElOmTNnrc37hhRdiy5YtcfTRR5eNb968OSKiyRvUo0ePxvs1WLx4cfTu3TvWrVsXRxxxRPTq1St69+4dF154YXzwwQd7XcOuLF68OCIiqqqqYtKkSdGzZ8/o0aNHzJo1K/785z/v0zEbTJw4MZYvXx6bNm3ar+PQfmRzB9mkKORyB7mkSGRzB9ncSUu2l/r06ZMuvvjiPc6pq6tLEZEefPDBxrHNmzenQw45JM2YMaNxbOvWrWnz5s1l9924cWMaOHBgOu+88xrHVq1alSIiVVdXp7Vr1zaOL1myJEVEuvTSSxvHpkyZksaOHZs++OCDxrHt27en448/Ph1++OFlj1VbW5tqa2v3+pwXLFiQIiL95je/KRt/7LHHUkSkhx56qGz83nvvTRGRxowZ0zg2bty41KNHj9SjR480e/bs9Nhjj6XZs2eniEizZs3a6xp2Zdq0aSkiUk1NTfr85z+fHn300VRfX5+6du2ajj/++LR9+/Zd3m9vW48ppfSDH/wgRURasmTJPq2N9iebO8gmRSGXO8glRSKbO8hmuRYVo9ra2jRp0qS0bt263c6pq6tLvXr1avJEpk2bliZMmLDL+2zbti29/fbbacOGDenUU09NRx11VONtDR+ks88+u8n9jjvuuHTEEUeklFJ6++23U6lUStdff33asGFD2d/cuXNTRJR9EJtr3rx5u7zv+++/n2pra9PAgQPTY489llavXp0efvjhVFNTk7p27ZoOO+ywxrnDhw9PEZEuuOCCsmOcf/75KSLSq6++2uJ1nXTSSSki0tSpU8vGb7755hQR6dlnn93l/ZrzQXrqqadSRKRFixa1eF10DNncQTYpCrncQS4pEtncQTbLtehUultuuSWWL18eQ4cOjWOPPTbmzJkTb7zxRpN5Q4YMaXIJvb59+8bGjRvLxr73ve/FuHHjonv37lFTUxP9+/ePRYsWxTvvvNPkmIcffniTsZEjR8bq1asjIuL111+PlFLU19dH//79y/6uvfbaiIh46623WvJ0y6SUyv7dvXv3WLRoUdTU1MSMGTNi2LBhce6558Y111wT/fr1K7sMYsP25Nlnn112jHPOOSciIp5//vkWr2dvx/z5z3/e4mM2aHiuu7sMIsUjmzvIJkUhlzvIJUUimzvIZrkWXa575syZceKJJ8bjjz8ezzzzTNx6660xb968WLhwYXz6059unNelS5c9LjAi4vvf/358+ctfjunTp8cVV1wRAwYMiC5dusTNN9/crC+R7azhy1+XX355nHLKKbucM2LEiBYft6amJiL+dp7pkCFDym4bPXp0LF++PF555ZXYuHFjjBo1Kqqrq+PSSy+Nurq6xnmDBg2Kl19+OQYOHFh2/wEDBjQeu6UGDRoUEdGqx2zQcN+DDz54n49B+5JN2aR45FIuKSbZlM3dafHvGB166KFx0UUXxUUXXRRvvfVWHH300XHjjTeWfZCa49FHH43hw4fHwoULy5pcQxve2WuvvdZk7NVXX41hw4ZFRMTw4cMj4m9Xodj5ihv748gjj4yIiFWrVsXYsWOb3F4qlWL06NGN/37yySdj+/btZWuYOHFiPPvss41fVmvw5ptvRkRE//79W7yuiRMnxre//e1Yt25d2fj+HLPBqlWr4oADDoiRI0fu8zFof7JZTjYpArksJ5cUhWyWk82/afapdNu2bWuyJThgwIAYNGhQ4xUtWqKhhf99616yZMlut+F+9KMflb1oS5cujSVLljR+gAcMGBCTJ0+O++67L/74xz82uf+GDRvK/t3cyxtOnDgxDjzwwPjVr36117nvv/9+1NfXx6GHHlq2JThz5syIiPjOd75TNn/BggXRtWvXmDx58l6PvbPTTz89qqqq4rvf/W7ZpRIXLFgQEREnn3xyi4/Z4IUXXojRo0dHnz599vkYtB/ZlE2KRy7lkmKSTdnck2bvGL377rsxZMiQOPPMM2P8+PHRq1evWLx4cfzyl7+M+fPnt3ixp512WixcuDDOOOOMOPXUU2PVqlVx7733xqhRo+K9995rMn/EiBFxwgknxIUXXhibN2+OO+64I2pq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slmuRcXoggsuiHvuuSdmzJgRd999d1x++eVRXV0dK1asKJu3cePGmDp1aowfPz7mz58fRx55ZHzjG9+Ip556qnHOpk2bYsGCBTF58uSYN29ezJkzJzZs2BCnnHJKvPTSS00e+8EHH4w777wzLr744rjqqqti+fLlcdJJJ8X69esb57z88svx0Y9+NFasWBFXXnllzJ8/P3r27BnTp0+Pxx9/vOx4U6ZMiSlTpuz1Ob/wwguxZcuWOProo8vGN2/eHBHR5A3q0aNH4/0aLF68OHr37h3r1q2LI444Inr16hW9e/eOCy+8MD744IO9rmFXFi9eHBERVVVVMWnSpOjZs2f06NEjZs2aFX/+85/36ZgNJk6cGMuXL49Nmzbt13FoP7K5g2xSFHK5g1xSJLK5g2zupCXbS3369EkXX3zxHufU1dWliEgPPvhg49jmzZvTIYcckmbMmNE4tnXr1rR58+ay+27cuDENHDgwnXfeeY1jq1atShGRqqur09q1axvHlyxZkiIiXXrppY1jU6ZMSWPHjk0ffPBB49j27dvT8ccfnw4//PCyx6qtrU21tbV7fc4LFixIEZF+85vflI0/9thjKSLSQw89VDZ+7733pohIY8aMaRwbN25c6tGjR+rRo0eaPXt2euyxx9Ls2bNTRKRZs2btdQ27Mm3atBQRqaamJn3+859Pjz76aKqvr09du3ZNxx9/fNq+ffsu77e3rceUUvrBD36QIiItWbJkn9ZG+5PNHWSTopDLHeSSIpHNHWSzXIuKUW1tbZo0aVJat27dbufU1dWlXr16NXki06ZNSxMmTNjlfbZt25befvvttGHDhnTqqaemo446qvG2hg/S2Wef3eR+xx13XDriiCNSSim9/fbbqVQqpeuvvz5t2LCh7G/u3LkpIso+iM01b968Xd73/fffT7W1tWngwIHpscceS6tXr04PP/xwqqmpSV27dk2HHXZY49zhw4eniEgXXHBB2THOP//8FBHp1VdfbfG6TjrppBQRaerUqWXjN998c4qI9Oyzz+7yfs35ID311FMpItKiRYtavC46hmzuIJsUhVzuIJcUiWzuIJvlWnQq3S233BLLly+PoUOHxrHHHhtz5syJN954o8m8IUOGNLmEXt++fWPjxo1lY9/73vdi3Lhx0b1796ipqYn+/fvHokWL4p133mlyzMMPP7zJ2MiRI2P16tUREfH6669HSinq6+ujf//+ZX/XXnttRES89dZbLXm6ZVJKZf/u3r17LFq0KGpqamLGjBkxbNiwOPfcc+Oaa66Jfv36lV0GsWF78uyzzy47xjnnnBMREc8//3yL17O3Y/785z9v8TEbNDzX3V0GkeKRzR1kk6KQyx3kkiKRzR1ks1yLLtc9c+bMOPHEE+Pxxx+PZ555Jm699daYN29eLFy4MD796U83zuvSpcseFxgR8f3vfz++/OUvx/Tp0+OKK66IAQMGRJcuXeLmm29u1pfIdtbw5a/LL788TjnllF3OGTFiRIuPW1NTExF/O890yJAhZbeNHj06li9fHq+88kps3LgxRo0aFdXV1XHppZdGXV1d47xBgwbFyy+/HAMHDiy7/4ABAxqP3VKDBg2KiGjVYzZouO/BBx+8z8egfcmmbFI8cimXFJNsyubutPh3jA499NC46KKL4qKLLoq33norjj766LjxxhvLPkjN8eijj8bw4cNj4cKFZU2uoQ3v7LXXXmsy9uqrr8awYcMiImL48OER8berUOx8xY39ceSRR0ZExKpVq2Ls2LFNbi+VSjF69OjGfz/55JOxffv2sjVMnDgxnn322cYvqzV48803IyKif//+LV7XxIkT49vf/nasW7eubHx/jtlg1apVccABB8TIkSP3+Ri0P9ksJ5sUgVyWk0uKQjbLyebfNPtUum3btjXZEhwwYEAMGjSo8YoWLdHQwv++dS9ZsmS323A/+tGPyl60pUuXxpIlSxo/wAMGDIjJkyfHfffdF3/84x+b3H/Dhg1l/27u5Q0nTpwYBx54YPzqV7/a69z3338/6uvr49BDDy3bEpw5c2ZERHznO98pm79gwYLo2rVrTJ48ea/H3tnpp58eVVVV8d3vfrfsUokLFiyIiIiTTz65xcds8MILL8To0aOjT58++3wM2o9syibFI5dySTHJpmzuSbN3jN59990YMmRInHnmmTF+/Pjo1atXLF68OH75y1/G/PnzW7zY0047LRYuXBhnnHFGnHrqqbFq1aq49957Y9SoUfHee+81mT9ixIg44YQT4sILL4zNmzfHHXfcETU1NfH1r3+9cc5dd90VJ5xwQowdOza+8pWvxPDhw2P9+vXx/PPPx9q1a2PZsmWNcxsubdhwTufudO/ePT71qU/F4sWL47rrriu7bebMmTFo0KAY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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import matplotlib.pyplot as plt\n", - "plt.figure(figsize=(10,10))\n", - "for i,m in enumerate(masks):\n", - " ax = plt.subplot(4,4,i+1)\n", - " ax.matshow(mask,cmap=plt.cm.Greys)\n", - " plt.axis('off')\n", - " plt.title(f'shape: {m.shape}')\n", - "\n", - "plt.tight_layout()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 89, - "metadata": {}, - "outputs": [], - "source": [ - "from functools import reduce\n", - "def max_common_intersection(mask_list):\n", - " min_x = np.min([m.shape[0] for m in mask_list])\n", - " min_y = np.min([m.shape[1] for m in mask_list])\n", - "\n", - " cropped_masks = []\n", - " for m in masks:\n", - " if m.shape[0]> min_x and m.shape[1]>min_y:\n", - " cropped_masks.append(m[(m.shape[0]-min_x)//2:-(m.shape[0]-min_x)//2,\n", - " (m.shape[1]-min_y)//2:-(m.shape[1]-min_y)//2])\n", - "\n", - " elif m.shape[0] == min_x and m.shape[1]>min_y:\n", - " cropped_masks.append(m[:,(m.shape[1]-min_y)//2:-(m.shape[1]-min_y)//2])\n", - "\n", - " elif m.shape[0]> min_x and m.shape[1]== min_y:\n", - " cropped_masks.append(m[(m.shape[0]-min_x)//2:-(m.shape[0]-min_x)//2,:])\n", - "\n", - " else:\n", - " cropped_masks.append(m)\n", - " \n", - " # performs elementwise logical and\n", - " intersection = reduce(lambda x, y: np.logical_and(x, y), cropped_masks)\n", - "\n", - "\n", - " return intersection" - ] - }, - { - "cell_type": "code", - "execution_count": 90, - "metadata": {}, - "outputs": [], - "source": [ - "cm = max_common_intersection(masks)" - ] - }, - { - "cell_type": "code", - "execution_count": 91, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 91, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plt.matshow(cm)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "base", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.8" - }, - "orig_nbformat": 4, - "vscode": { - "interpreter": { - "hash": "a004f9109620e037dd6eb32a5065768d5476b766f6a5e98b9519dfa4bc5bb4ce" - } - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/preprocessing/pipeline.py b/preprocessing/pipeline.py deleted file mode 100644 index a1ad191..0000000 --- a/preprocessing/pipeline.py +++ /dev/null @@ -1,166 +0,0 @@ -import loaders -import args - -import glob -import numpy as np -import pandas as pd -from scipy import io -from sklearn.pipeline import Pipeline -from sklearn.decomposition import PCA -from sklearn.preprocessing import StandardScaler -import matplotlib.pyplot as plt - -import vsdi_preprocessing -import vsdi_visualization -import loaders - -#################################### - -##################################### -############### MAIN ################ -##################################### - -# Define paths -path = '/home/danteam/Documents/BScThesis' -data = f'{path}/data' -reports = f'{path}/reports' -figures = f'{reports}/figures' - -# Get arguments from command line -parameters = args.getArgs() -subject = parameters.subject -day = parameters.day -session = parameters.session - -def save_vsdi(): - vsdi1 = io.loadmat(glob.glob(f'{data}/ATC_Data_preprocessed/A0{subject}/Day1/vsdi_ATC{session}.mat')[0])['vsdi_data'] - vsdi3 = io.loadmat(glob.glob(f'{data}/ATC_Data_preprocessed/A0{subject}/Day3/vsdi_ATC{session}.mat')[0])['vsdi_data'] - vsdi5 = io.loadmat(glob.glob(f'{data}/ATC_Data_preprocessed/A0{subject}/Day5/vsdi_ATC{session}.mat')[0])['vsdi_data'] - vsdi7 = io.loadmat(glob.glob(f'{data}/ATC_Data_preprocessed/A0{subject}/Day7/vsdi_ATC{session}.mat')[0])['vsdi_data'] - - vsdi1 = vsdi1[:,:,0:29999] - vsdi3 = vsdi3[:,:,0:29999] - vsdi5 = vsdi5[:,:,0:29999] - vsdi7 = vsdi7[:,:,0:29999] - - vsdi = np.concatenate((vsdi1, vsdi3, vsdi5, vsdi7), axis = 2) - - del(vsdi1) - del(vsdi3) - del(vsdi5) - del(vsdi7) - - # Outliers correction - vsdi_clean = vsdi_preprocessing.clean_outliers(vsdi, nsigma=5) - - # Hemodynamics correction - vsdi_clean = vsdi_preprocessing.clean_hemodynamic_pca(vsdi_clean, bimodal_th = 0.6, verbose = True) - - del(vsdi) - - ## Mask to select just subject cortex - r = np.loadtxt(f'{data}/Patterns/mask_A0{subject}.csv', delimiter=',', dtype='bool') - - X = vsdi_clean.transpose(2, 0, 1) - X = X[:,r] - - del(vsdi_clean) - - pipe = Pipeline([ - ('scaler', StandardScaler()), - ('pca', PCA(n_components=10)) - ]) - - out = pipe.fit(X) - - f = out.named_steps['pca'].components_ - factor_scores = pipe.named_steps['pca'].transform(X) - - np.savetxt(f'{data}/Patterns/SubjectA0{subject}_timecourse_part1.csv', factor_scores, delimiter=",") - np.savetxt(f'{data}/Patterns/SubjectA0{subject}_fingerprint_part1.csv', f, delimiter=",") - - return 0 - -def save_behav(): - atc1 = io.loadmat(f'{data}/ATC_Data_preprocessed/A0{subject}/Day1/ATC{session}.mat') - atc3 = io.loadmat(f'{data}/ATC_Data_preprocessed/A0{subject}/Day3/ATC{session}.mat') - atc5 = io.loadmat(f'{data}/ATC_Data_preprocessed/A0{subject}/Day5/ATC{session}.mat') - atc7 = io.loadmat(f'{data}/ATC_Data_preprocessed/A0{subject}/Day7/ATC{session}.mat') - b_data1 = loaders.extract_behavioural_data(atc1) - b_data3 = loaders.extract_behavioural_data(atc3) - b_data5 = loaders.extract_behavioural_data(atc5) - b_data7 = loaders.extract_behavioural_data(atc7) - - del(atc1) - del(atc3) - del(atc5) - del(atc7) - - d1 = vsdi_preprocessing.design_matrix(b_data1) - d3 = vsdi_preprocessing.design_matrix(b_data3) - d5 = vsdi_preprocessing.design_matrix(b_data5) - d7 = vsdi_preprocessing.design_matrix(b_data7) - - d1 = d1[0:29999,:] - d3 = d3[0:29999,:] - d5 = d5[0:29999,:] - d7 = d7[0:29999,:] - - np.savetxt(f'{data}/Patterns/SubjectA0{subject}_d1_part{session}.csv', d1, delimiter=",") - np.savetxt(f'{data}/Patterns/SubjectA0{subject}_d3_part{session}.csv', d3, delimiter=",") - np.savetxt(f'{data}/Patterns/SubjectA0{subject}_d5_part{session}.csv', d5, delimiter=",") - np.savetxt(f'{data}/Patterns/SubjectA0{subject}_d7_part{session}.csv', d7, delimiter=",") - - return 0 - -def mask_norm(masks, threshold=0.5): - mask_mean = np.mean(masks, axis=0) - mask_mean[mask_mean > threshold] = 1 - mask_mean[mask_mean <= threshold] = 0 - - return mask_mean - -def save_mask(): - r1 = io.loadmat(f'{data}/ATC_Data_preprocessed/A0{subject}/Day1/vsdi_mask.mat')['mask'].astype('bool') - np.savetxt(f'{data}/Patterns/raw_mask_{subject}_day1.csv', r1, delimiter=",") - r3 = io.loadmat(f'{data}/ATC_Data_preprocessed/A0{subject}/Day3/vsdi_mask.mat')['mask'].astype('bool') - np.savetxt(f'{data}/Patterns/raw_mask_{subject}_day3.csv', r3, delimiter=",") - r5 = io.loadmat(f'{data}/ATC_Data_preprocessed/A0{subject}/Day5/vsdi_mask.mat')['mask'].astype('bool') - np.savetxt(f'{data}/Patterns/raw_mask_{subject}_day5.csv', r5, delimiter=",") - r7 = io.loadmat(f'{data}/ATC_Data_preprocessed/A0{subject}/Day7/vsdi_mask.mat')['mask'].astype('bool') - np.savetxt(f'{data}/Patterns/raw_mask_{subject}_day7.csv', r7, delimiter=",") - - del(r1) - del(r3) - del(r5) - del(r7) - - r1 = np.loadtxt(f'{data}/Patterns/raw_mask_{subject}_day1.csv', delimiter=",") - r3 = np.loadtxt(f'{data}/Patterns/raw_mask_{subject}_day3.csv', delimiter=",") - r5 = np.loadtxt(f'{data}/Patterns/raw_mask_{subject}_day5.csv', delimiter=",") - r7 = np.loadtxt(f'{data}/Patterns/raw_mask_{subject}_day7.csv', delimiter=",") - - print(r1.shape, r3.shape, r5.shape, r7.shape) - - masks = np.stack([r1, r3, r5, r7]) - mask_mean = mask_norm(masks) - - np.savetxt(f'/home/danteam/Documents/BScThesis/data/Patterns/mask_A0{subject}.csv', mask_mean.astype(int), fmt='%i', delimiter=",") - - return 0 - - -def main(): - # print(f'Saving Mask A0{subject} part {session}') - # save_mask() - print(f'Saving VSDI subject A0{subject} part {session}') - save_vsdi() - print(f'Saving Design matrices A0{subject} part {session}') - save_behav() - - return 0 - - - -if __name__ == '__main__': - main() \ No newline at end of file diff --git a/preprocessing/utils.py b/preprocessing/utils.py new file mode 100644 index 0000000..42a6fe0 --- /dev/null +++ b/preprocessing/utils.py @@ -0,0 +1,699 @@ +# Import data +from pathlib import Path +from scipy.io import loadmat + +# Logging +import logging +from datetime import datetime +import time +from tqdm import tqdm + +# Data management +import numpy as np +import pandas as pd +from scipy.stats import sem +from scipy.ndimage import gaussian_filter1d +import statsmodels.api as sm +from sklearn.preprocessing import StandardScaler +import scipy.stats as stats +import pickle + +# Dimensionality reduction +from sklearn.decomposition import PCA, FastICA +from sklearn.pipeline import Pipeline + +# VSDI components resizing +import cv2 +from functools import reduce + +# Visualization +import seaborn as sns +import matplotlib.pyplot as plt +from matplotlib.patches import Patch +import matplotlib.ticker as mticker +from statannotations.Annotator import Annotator + +# Decoder +from sklearn.model_selection import StratifiedKFold +from sklearn import svm +from sklearn.metrics import f1_score +from sklearn.utils import shuffle +import warnings +from sklearn.exceptions import ConvergenceWarning + + +############ +## BEHAV ### +############ + +def make_design_matrix(b_data, event_sequences, fps=50): + """ + Generates a design matrix based on the provided event sequences. + + The design matrix contains rows corresponding to frames and columns corresponding to events. Each column index in the output matrix represents an event in the event sequences. The number of columns in the design matrix equals the maximum column index specified in the event sequences plus one. + + Parameters + ---------- + event_sequences : dict + A dictionary where keys are event names and values are lists of tuples. Each tuple contains the name of an event, the duration of the event in seconds, and the column index in the output matrix. + + Returns + ------- + matrix : ndarray + Design matrix where each row corresponds to a frame and each column corresponds to an event. + + Examples + -------- + >>> event_sequences = { + ... 'Lick': [('Lick', 1, 5)], + ... 'CSp': [('CS+', 2, 0), ('CS+ Trace', 1, 1), ('Reward', 1, 4)], + ... 'CSn': [('CS-', 2, 2), ('CS- Trace', 1, 3)], + ... } + >>> design_matrix(event_sequences) + # Output: + # matrix with columns: + # 0: CS+ (2s) + # 1: CS+ trace (1s) + # 2: CS- (2s) + # 3: CS- trace (1s) + # 4: Reward (1s) + # 5: Lick + """ + frames = b_data['frames'] + length = len(frames) + n_columns = max(col for seq in event_sequences.values() for _, _, col in seq) + 1 + X = np.zeros((length, n_columns)) + + for event, sequence in event_sequences.items(): + event_data = b_data[event] + + for i in range(len(event_data)): + + frame = np.argmin(np.abs(frames - event_data[i])) + + for event_name, duration, column in sequence: + duration_unit = fps * duration if fps * duration != 0 else 1 # extreme case for licks + X[frame:(frame + int(duration_unit)), column] = 1 + frame += fps * duration + + return X + +def subsets(Set): + """ + Find start index of subsets (series of consecutive numbers) + """ + subsets = [] + start = 0 + end = 0 + + # Iterate over array + while end < len(Set): + + # Get first and last frame of each subset + while end + 1 < len(Set) and Set[end + 1] - Set[start] == end - start + 1: + end += 1 + + # Save first and last frame of each outlier subset + subsets.append(Set[start]) + start = end = end + 1 + + return np.array(subsets) + +def get_trials(feature): + """ + Find index of start of trial based on design matrix vector + """ + # Find the indices where feature is 1 + feature_trials = subsets(np.where(feature == 1)[0]) + + return feature_trials + +def compute_lick_rate(data, trial_onsets, fps): + + lick_rates = [] + + for i in range(len(trial_onsets)): + + trial_start = trial_onsets[i] + # Baseline -1 s before CS presentation + baseline_licks = np.sum(data[(trial_start-fps):trial_start]) + # Number of licks in trace period + trace_licks = np.sum(data[trial_start+(2*fps):trial_start+(3*fps)]) + # Corrected lick rate + lick_rate = trace_licks - baseline_licks + + lick_rates.append(lick_rate) + + return lick_rates + +def compute_and_add_lick_rate(df, fps): + """ + Lick Rate (Hz) per frame using X dataframe version + """ + # Group by 'Animal', 'Day', 'Session' and apply rolling window calculation + df['Lick Rate (Hz)'] = df.groupby(['Animal', 'Day', 'Session'])['Lick'].transform(lambda x: x.rolling(fps, min_periods=1).sum()) + return df + +def store_indices(animals, days, sessions, outpath): + """ + Store cumulative index (based on X matrix length) for each session, day, and animal, + as well as trial indices for CS+ and CS- trials in a nested dictionary structure. + + :param animals: List of animal names + :param days: List of days + :param sessions: List of sessions + :param outpath: Path to the output directory + :return: A nested dictionary containing the cumulative indices and trial indices + """ + # Initialize an empty dictionary + X = {animal: {day: {} for day in days} for animal in animals} + + # Iterate over all animals, days, and sessions + for animal in animals: + for day in days: + # Initialize the cumulative count + cumulative_count = 0 + + for session in sessions: + # Load design matrix + X_matrix = np.loadtxt(outpath.joinpath(f"X_{animal}_{day}_{session}.csv"), delimiter=",") + + # Here we are assuming 'CS+' info is in column 0 and 'CS-' info is in column 2 + trial_types = ['CS+', 'CS-'] + for trial_type, column in zip(trial_types, [0, 2]): + feature = X_matrix[:, column] + trial_indices = get_trials(feature) + + # Store the trial indices in the nested dictionary + if session not in X[animal][day]: + X[animal][day][session] = {} + X[animal][day][session][trial_type] = trial_indices + + # Update the cumulative count + cumulative_count += len(X_matrix) + + # Store the cumulative count in the nested dictionary + X[animal][day][session]['Cumulative Index'] = cumulative_count + + return X + +############ +### VSDI ### +############ + +def pca_ica(vsdi, mask): + X = vsdi.transpose(2, 0, 1) + X = X*mask + X = X.reshape(X.shape[0], X.shape[1]*X.shape[2]) + + # Create a pipeline with PCA and ICA + pipe = Pipeline([ + ('pca', PCA(n_components=10)), + ('ica', FastICA(n_components=10, max_iter=200, + random_state=1, whiten='unit-variance')) + ]) + + out = pipe.fit(X) + + fingerprints = out.named_steps["ica"].components_ @ out.named_steps["pca"].components_ + timecourses = fingerprints @ X.T + + explained_variance = out.named_steps["pca"].explained_variance_ratio_ + + return fingerprints, timecourses, explained_variance + +def normalize_vsdi(vsdi, mask): + # Transpose to this shape (time, x, y) + v_t = vsdi.transpose(2, 0, 1) + # Mask vsdi + v_masked = v_t * mask + v_reshaped = v_masked.reshape(v_masked.shape[0], v_masked.shape[1]*v_masked.shape[2]) + # Normalize usign Standard Scaler + v_norm = StandardScaler().fit_transform(v_reshaped) + v_norm_reshaped = v_norm.reshape(v_masked.shape[0], v_masked.shape[1], v_masked.shape[2]) + # Transpose to this shape (x, y, time) + v_norm_original = v_norm_reshaped.transpose(1, 2, 0) + + return v_norm_original + +def find_outliers(vsdi, nsigma=3): + """ + Identify the start and end indices of outlier frames in VSDI data + + Parameters + ---------- + vsdi : numpy ndarray + vsdi data in format (h, w, time) + nsigma : float + Number of standard deviations to consider an outlier + + Returns + ------- + outliers_subsets : list of tuples + Each tuple contains the start and end indices of an outlier subset + """ + mean_vsdi = np.mean(vsdi, axis=(0, 1)) + # How many standard deviations away a value is from the mean + zscore = stats.zscore(mean_vsdi, axis=0, ddof=0, nan_policy='propagate') + # zscore = StandardScaler().fit_transform(vsdi) + + # Get index of outliers from vsdi presenting average activity higher than 4 sigma + outliers = np.argwhere((zscore > nsigma) | (zscore < -nsigma)).ravel() + + subsets = [] + start = 0 + end = 0 + + # Iterate over array + while end < len(outliers): + # Get first and last frame of each subset + while end + 1 < len(outliers) and outliers[end + 1] - outliers[start] == end - start + 1: + end += 1 + # Save first and last frame of each outlier subset + subsets.append((outliers[start], outliers[end])) + start = end = end + 1 + + return np.array(subsets) + +def clean_outliers(vsdi, nsigma=3): + """ + Correct outliers by pixel-wise linear interpolation in VSDI data + + Parameters + ---------- + vsdi : numpy ndarray + vsdi data in format (h, w, time) + nsigma : float + Number of standard deviations to consider an outlier + + Returns + ------- + vsdi : numpy ndarray + vsdi data with outliers corrected + """ + vsdi = vsdi.copy() + # Get first and last frame of each subset + outliers_subsets = find_outliers(vsdi, nsigma) + + # Set outlier frames to the mean between the previous and next frame + for i in range(len(outliers_subsets)): + start = outliers_subsets[i][0] + end = outliers_subsets[i][1] + if start == 0: + vsdi[:, :, start:end+1] = np.tile(vsdi[:, :, end+1][:, :, np.newaxis], (1, 1, end - start + 1)) + elif end == vsdi.shape[2]-1: + vsdi[:, :, start:end+1] = np.tile(vsdi[:, :, start-1][:, :, np.newaxis], (1, 1, end - start + 1)) + else: + average = np.divide(np.add(vsdi[:, :, (start-1)][:, :, np.newaxis], vsdi[:, :, (end+1)][:, :, np.newaxis]), 2) + vsdi[:, :, start:end+1] = average + return vsdi + +def find_bounding_rectangle(binary_image): + contours, _ = cv2.findContours(binary_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) + if contours: + x, y, w, h = cv2.boundingRect(contours[0]) + return (x, y), (x + w, y + h) + else: + return None + +def crop_to_bounds(image, bounds): + return image[bounds[0][1]:bounds[1][1],bounds[0][0]:bounds[1][0]] + +def resize(mask_list): + max_h = np.max([x.shape[0] for x in mask_list]) + max_w = np.max([x.shape[1] for x in mask_list]) + + resized = [] + for m in mask_list: + resized_mask = cv2.resize(m, (max_w, max_h), interpolation=cv2.INTER_CUBIC) + resized.append(resized_mask) + + return resized + +def resize_video(video_list): + max_h = np.max([c.shape[0] for c in video_list]) + max_w = np.max([c.shape[1] for c in video_list]) + resized_vsdi = [] + + for arr in video_list: + # The last dimension (time) is not affected by resizing, + # so we need to iterate over it + reshaped_images = [] + for i in range(arr.shape[2]): + # Resize each 2D slice along the third axis + reshaped_img = cv2.resize(arr[:,:,i], (max_w, max_h), interpolation=cv2.INTER_CUBIC) + reshaped_images.append(reshaped_img) + + # Stack the reshaped images along the third axis + resized_vsdi.append(np.dstack(reshaped_images)) + + return(resized_vsdi) + +def filter_data2(data, onset, offset, idxs): + fragments = [] + # For ids + for idx in idxs: + # Check data dimensionality + if len(data.shape) == 1: + # Append data slice + fragment = data[idx+onset:idx+offset] + else: + slices = [slice(None)] * (data.ndim - 1) + slices.append(slice(idx+onset, idx+offset)) + fragment = data[tuple(slices)] + fragments.append(fragment) + # Return ndarrray of fragments + return np.stack(fragments) + +def filter_data(data, onset, offset, idxs): + """ + Get ndarray of data fragments based on index (idx+onset to idx+offset) + """ + fragments = [] + for idx in idxs: + if len(data.shape) == 1: + # Manage extreme cases (when onset offset falls outside data) Why are there onsets at the end of the data? + if idx + onset < 0 or idx + offset > data.shape[0]: + start = max(idx + onset, 0) + end = min(idx + offset, data.shape[0]) + length = offset - onset + fragment = np.full(length, 0) # Fill missing fragment of data with value + fragment[:end-start] = data[start:end] + else: + fragment = data[idx + onset:idx + offset] + else: + slices = [slice(None)] * (data.ndim - 1) + if idx + onset < 0 or idx + offset > data.shape[-1]: + start = max(idx + onset, 0) + end = min(idx + offset, data.shape[-1]) + length = offset - onset + fragment = np.full(data.shape[:-1] + (length,), 0) # Fill missing fragment of data with value + slices_start_end = slices + [slice(start, end)] + fragment[..., :end-start] = data[tuple(slices_start_end)] + else: + slices.append(slice(idx + onset, idx + offset)) + fragment = data[tuple(slices)] + fragments.append(fragment) + return np.stack(fragments) + +def split_data(data, labels, axis=-1, attr=1): + """ + Splits the provided data based on the given labels. + + The function partitions a multidimensional data array into smaller slices, based on the shapes provided in the labels list. The slices are then stored in a dictionary, where the keys are determined by the `attr` attribute of the info list. + + Parameters + ---------- + data : ndarray + Multidimensional array to be partitioned. + labels : list + List of tuples, where each tuple contains an info list and a shape integer. Example: + [ + (['A07', 'Day1', 'ATC1'], 30000), + (['A07', 'Day1', 'ATC2'], 30000) + ] + axis : int, optional + The axis along which the data array is to be sliced, by default -1 (the last axis). + attr : int, optional + The index of the attribute in the info list that will be used as a key in the resulting dictionary, by default 1 (the second item). + + Returns + ------- + partitioned_data : dict + A dictionary where keys are the extracted attribute from the info list, and values are the partitioned slices of the input data. + + Examples + -------- + >>> data = np.arange(60000).reshape((2, 30000)) + >>> labels = [(['A07', 'Day1', 'ATC1'], 30000), (['A07', 'Day1', 'ATC2'], 30000)] + >>> split_data(data, labels, axis=0, attr=1) + # Output: + # {'Day1': [array([0, 1, ..., 29998, 29999]), array([30000, 30001, ..., 59998, 59999])]} + """ + + # Start index for slicing + start = 0 + # Partitioned data dictionary + partitioned_data = {} + + for info, shape in labels: + day = info[attr] # Extracting 'Day' attribute from info list + + # Slicing the array + slices = [slice(None)] * data.ndim # Create as many slices as dimensions + slices[axis] = slice(start, start+shape) # Modify the slice for the specified axis + sliced = data[tuple(slices)] + + # Storing the sliced array into dictionary + if day in partitioned_data: + partitioned_data[day].append(sliced) + else: + partitioned_data[day] = [sliced] + + # Updating start index for next slice + start += shape + + return partitioned_data + +### DECODING + +def train_SVM_day(t_csp_day, t_csn_day, time_bin_size, n_splits=5, n_shuffles=100, n_iter=1000, tol=1e-4): + # concatenate the two ndarrays + t_all_day = np.concatenate((t_csp_day, t_csn_day), axis=0) + + # Create time points based on time bin size + time_points = range(0, t_all_day.shape[2], time_bin_size) + + # initialize StratifiedKFold + skf = StratifiedKFold(n_splits=n_splits) + + # prepare the label vector + stim_type = np.array([0] * t_csp_day.shape[0] + [1] * t_csn_day.shape[0]) + + avg_performance = [] + std_performance = [] + surrogate_performance = [] + + # for each time bin, train a separate SVM classifier + for i in time_points: + # Average within time bin for SVM + X_bin = np.mean(t_all_day[:, :, i:i+time_bin_size], axis=2) + + # flatten the data for SVM + X = X_bin.reshape(t_all_day.shape[0], -1) + y = stim_type + + accuracy_scores = [] + surrogate_scores = [] + + for train_index, test_index in skf.split(X, y): + print(f'Computing time bin {int(i/time_bin_size)}/{len(time_points)}') + X_train, X_test = X[train_index], X[test_index] + y_train, y_test = y[train_index], y[test_index] + + # Train SVM + clf = svm.LinearSVC(max_iter=n_iter, tol=tol) + clf.fit(X_train, y_train) + + # calculate accuracy + accuracy = f1_score(y_test, clf.predict(X_test)) + accuracy_scores.append(accuracy) + + # Surrogate analysis + for _ in tqdm(range(n_shuffles)): + y_train_shuffle = shuffle(y_train) + clf.fit(X_train, y_train_shuffle) + surrogate_accuracy = f1_score(y_test, clf.predict(X_test)) + surrogate_scores.append(surrogate_accuracy) + + # calculate average and standard deviation of accuracy for the current time point + avg_performance.append(np.mean(accuracy_scores)) + std_performance.append(np.std(accuracy_scores)) + surrogate_performance.append(surrogate_scores) + + avg_performance = np.asarray(avg_performance) + std_performance = np.asarray(std_performance) + surrogate_performance = np.asarray(surrogate_performance) + + return avg_performance, std_performance, surrogate_performance + +def train_SVM_baseline2(t_sound_day, t_baseline_day, time_bin_size, n_splits=5, n_shuffles=100, n_iter=1000, tol=1e-4): + # Create time points based on time bin size + time_points = range(0, t_sound_day.shape[2], time_bin_size) + + # initialize StratifiedKFold + skf = StratifiedKFold(n_splits=n_splits) + + avg_performance = [] + std_performance = [] + surrogate_performance = [] + + # for each time bin, train a separate SVM classifier + for i in time_points: + print(f'Computing time bin {int(i/time_bin_size)}/{len(time_points)}') + + # get the data for this time bin + t_sound_bin = t_sound_day[:, :, i:i+time_bin_size] + t_baseline_bin = np.tile(t_baseline_day, (1, 1, t_sound_bin.shape[2] // t_baseline_day.shape[2])) + + # concatenate the sound and baseline ndarrays for this time bin + t_all_bin = np.concatenate((t_sound_bin, t_baseline_bin), axis=0) + + # prepare the label vector + y = np.array([0] * t_sound_bin.shape[0] + [1] * t_baseline_bin.shape[0]) + + # flatten the data for SVM + X = t_all_bin.reshape(t_all_bin.shape[0], -1) + + accuracy_scores = [] + surrogate_scores = [] + + for train_index, test_index in skf.split(X, y): + X_train, X_test = X[train_index], X[test_index] + y_train, y_test = y[train_index], y[test_index] + + # Train SVM + clf = svm.LinearSVC(max_iter=n_iter, tol=tol) + clf.fit(X_train, y_train) + + # calculate accuracy + accuracy = f1_score(y_test, clf.predict(X_test)) + accuracy_scores.append(accuracy) + + # Surrogate analysis + for _ in tqdm(range(n_shuffles)): + y_train_shuffle = shuffle(y_train) + clf.fit(X_train, y_train_shuffle) + surrogate_accuracy = f1_score(y_test, clf.predict(X_test)) + surrogate_scores.append(surrogate_accuracy) + + # calculate average and standard deviation of accuracy for the current time point + avg_performance.append(np.mean(accuracy_scores)) + std_performance.append(np.std(accuracy_scores)) + surrogate_performance.append(surrogate_scores) + + avg_performance = np.asarray(avg_performance) + std_performance = np.asarray(std_performance) + surrogate_performance = np.asarray(surrogate_performance) + + return avg_performance, std_performance, surrogate_performance + +def train_SVM_baseline(t_sound_day, t_baseline_day, time_bin_size, n_splits=5, n_shuffles=100, n_iter=1000, tol=1e-4): + # Create time points based on time bin size + time_points = range(0, t_sound_day.shape[2], time_bin_size) + + # initialize StratifiedKFold + skf = StratifiedKFold(n_splits=n_splits) + + avg_performance = [] + std_performance = [] + surrogate_performance = [] + svm_coefficients = [] # to store the SVM coefficients + + # for each time bin, train a separate SVM classifier + for i in time_points: + print(f'Computing time bin {int(i/time_bin_size)}/{len(time_points)}') + + # get the data for this time bin + t_sound_bin = t_sound_day[:, :, i:i+time_bin_size].mean(axis=2) # taking average over time_bin dimension + t_baseline_bin = t_baseline_day.mean(axis=2) # taking average over time_bin dimension + + # concatenate the sound and baseline ndarrays for this time bin (trials, components) + t_all_bin = np.concatenate((t_sound_bin, t_baseline_bin), axis=0) + + # prepare the label vector + y = np.array([0] * t_sound_bin.shape[0] + [1] * t_baseline_bin.shape[0]) + + # flatten the data for SVM (trials, components) + X = t_all_bin.reshape(t_all_bin.shape[0], -1) + + accuracy_scores = [] + surrogate_scores = [] + + for train_index, test_index in skf.split(X, y): + X_train, X_test = X[train_index], X[test_index] + y_train, y_test = y[train_index], y[test_index] + + # Train SVM + clf = svm.LinearSVC(max_iter=n_iter, tol=tol) + clf.fit(X_train, y_train) + + # calculate accuracy + accuracy = f1_score(y_test, clf.predict(X_test)) + accuracy_scores.append(accuracy) + + svm_coefficients.append(clf.coef_) # store the SVM coefficients + + # Surrogate analysis + for _ in tqdm(range(n_shuffles)): + y_train_shuffle = shuffle(y_train) + clf.fit(X_train, y_train_shuffle) + surrogate_accuracy = f1_score(y_test, clf.predict(X_test)) + surrogate_scores.append(surrogate_accuracy) + + + # calculate average and standard deviation of accuracy for the current time point + avg_performance.append(np.mean(accuracy_scores)) + std_performance.append(np.std(accuracy_scores)) + surrogate_performance.append(surrogate_scores) + + svm_coefficients = np.array(svm_coefficients) + avg_performance = np.asarray(avg_performance) + std_performance = np.asarray(std_performance) + surrogate_performance = np.asarray(surrogate_performance) + + return avg_performance, std_performance, surrogate_performance, svm_coefficients + +def moving_average(a, n=3): + if n > 1: + ret = np.cumsum(a, dtype=float) + ret[n:] = ret[n:] - ret[:-n] + return ret[n - 1:] / n + else: + return a + +def plot_decoding_performance(avg_performance, std_performance, color, fps=50, time_bin_size=5, window_size=5, label=None, ypos=1): + # Apply moving average + avg_performance_smooth = moving_average(avg_performance, window_size) + std_performance_smooth = moving_average(std_performance, window_size) + + # Compute bin_centers_sec_smooth after smoothing + num_bins = len(avg_performance_smooth) + bin_centers_sec = np.arange(avg_performance.shape[0])*time_bin_size/fps - 100/50 # First calculate for the original performance data + + if window_size > 1: + bin_centers_sec_smooth = bin_centers_sec[:num_bins] # Then adjust for the smoothing + else: + bin_centers_sec_smooth = bin_centers_sec # No smoothing, so they are the same + + # Ensure the lengths match after smoothing + bin_centers_sec_smooth = bin_centers_sec_smooth[:len(avg_performance_smooth)] + + plt.plot(bin_centers_sec_smooth, avg_performance_smooth, color = color, zorder = 1) + plt.fill_between(bin_centers_sec_smooth, avg_performance_smooth - std_performance_smooth, + avg_performance_smooth + std_performance_smooth, color = color, alpha=0.2, zorder = 1) + + plt.axhline(y=0.5, color="black", linestyle=(0, (1, 5))) #, label='chance level') + # Add the axvspan for CS+ sound presentation + plt.axvspan(0, 2, color='lightgray', alpha=1, zorder=0) # label="Sound") + # Add the axvspan for Reward period + plt.axvspan(2 + 1, 2 + 2, color='#B5DBA8', alpha=1, zorder=0) # label="Reward") + + plt.xlabel('Time from sound onset (s)') + plt.ylabel('Accuracy (%)') + + # Modify y-tick labels to display as multiples of 100 without the % symbol + formatter = mticker.FuncFormatter(lambda x, pos: '{0:g}'.format(x*100)) + plt.gca().yaxis.set_major_formatter(formatter) + + # Set y-limit + # plt.ylim(0, 1) + + # Get the current axes + ax = plt.gca() + # Modify the spines of the current axes + ax.spines['top'].set_visible(False) + ax.spines['right'].set_visible(False) + + # Add a colored label at the top left corner + plt.text(0.02, ypos, label, transform=plt.gca().transAxes, color=color, fontsize=12, va='top') diff --git a/preprocessing/vsdi.py b/preprocessing/vsdi.py deleted file mode 100644 index abda7e0..0000000 --- a/preprocessing/vsdi.py +++ /dev/null @@ -1,164 +0,0 @@ -########################################################## -######################## PACKAGES ######################## -########################################################## -import matplotlib.pyplot as plt -import numpy as np -from scipy import stats -from scipy.stats import norm -from sklearn.decomposition import PCA -import seaborn as sns -sns.set_theme(context='notebook', - style='white', - font_scale=1.5, - rc = {'axes.spines.top':False,'axes.spines.right':False, - 'image.cmap':plt.cm.jet}) - -########################################################## -####################### VSDI CLASS ####################### -########################################################## - -class VSDI: - def __init__(self, vsdi, raw_mask): - """ - Constructor for VSDI class - """ - self.vsdi = self.correct_outliers(vsdi) - self.raw_mask = raw_mask - self.X = self.vsdi.transpose(2,0,1) # reshape in time x image format - self.T,self.h,self.w = self.X.shape # saves time, height and width for future use - self.X = self.X[:,self.raw_mask] # select only cortex pixels, returns a flattened image - - def time_course(self, start_time=0, end_time=600, framerate=50): - """ - Plot time course of a single PC - """ - plt.figure(figsize=(10, 5)) - t = np.linspace(start_time, end_time, int((end_time - start_time) * framerate - 1)) - plt.plot(t, self.vsdi) - plt.xlabel('Time (s)') - plt.ylabel('PC activation (a.u.)') - plt.show() - - def create_frame(self, t): - """ - Create a frame of the VSDI data - """ - plt.figure(figsize=(10, 10)) - plt.imshow(self.vsdi[:, :, t], cmap=plt.cm.inferno) - - def pca(self, n_components=50): - """ - Perform PCA on the VSDI data - """ - pca = PCA(n_components=n_components) - pca.fit(self.X) - - return pca - - def pca_projection(self, pca, num_pc): - """ - Plot the projection of the data onto the first 10 PCs - """ - PCs = pca.components_[:num_pc].T - Y = self.X @ PCs # compute the PC timecourse, by projecting the original data on each component - return Y - - def cumulative_explained_variance(self, pca): - """ - Plot cumulative explained variance - """ - evr = pca.explained_variance_ratio_ - c_evr = np.cumsum(evr) - plt.figure(figsize=(6, 6)) - plt.axhline(0.9, linestyle='--', label='90% explained variance') - plt.plot(range(1, len(c_evr) + 1), c_evr) - plt.legend() - plt.xlabel('# of components') - plt.ylabel('EVR') - - def fingerprint(self, pca, num_pc = 10): - """ - Plot topographic organzation of the weights of these ten components - """ - PCs = pca.components_[:num_pc] - plt.figure(figsize=(10, 5)) - for i, pc in enumerate(PCs): - plt.subplot(2, 5, i + 1) - plt.title(f'PC {i + 1}') - reshaped_pc = np.full((self.h, self.w), np.nan) - reshaped_pc[np.where(self.raw_mask)] = pc - plt.imshow(reshaped_pc, aspect='auto', cmap=plt.cm.jet) - plt.axis('off') - - def first_last_subsets(self, arr): - """ - Get first and last frame of each subset - """ - subsets = [] - start = 0 - end = 0 - while end < len(arr): - while end + 1 < len(arr) and arr[end + 1] - arr[start] == end - start + 1: - end += 1 - subsets.append((arr[start], arr[end])) - start = end = end + 1 - return np.array(subsets) - - def correct_outliers(self, vsdi, nsigma=4): - """ - Correct outliers in VSDI data - """ - # Array with average value of all frames in vsdi - mean_vsdi = np.mean(vsdi, axis=(0,1)) - std_vsdi = vsdi.std() - - # Get index of outliers from vsdi presenting average activity higher than 4 sigma - outliers = np.argwhere((mean_vsdi > nsigma*std_vsdi) | (mean_vsdi < -nsigma*std_vsdi)).ravel() - - # Get first and last frame of each subset - outliers_subsets = self.first_last_subsets(arr = outliers) - - # Set outlier frames to the mean between the previous and next frame - for i in range(len(outliers_subsets)): - start = outliers_subsets[i][0] - end = outliers_subsets[i][1] - if start == 0: - vsdi[:,:,start:end+1] = np.tile(vsdi[:,:,end+1][:, :, np.newaxis], (1, 1, end - start + 1)) - elif end == len(mean_vsdi)-1: - vsdi[:,:,start:end+1] = np.tile(vsdi[:,:,start-1][:, :, np.newaxis], (1, 1, end - start + 1)) - else: - average = np.divide(np.add(vsdi[:,:,start-1][:, :, np.newaxis], vsdi[:,:,end+1][:, :, np.newaxis]), 2) - vsdi[:,:,start:end+1] = average - return vsdi - - def bimodality_test(self, distribution): - """ - Test for bimodality using moving average to smooth the histogram - and get the x-axis location of the highest point in the histogram - """ - # Create a histogram - n, bins, patches = plt.hist(distribution, bins=1000) - # Define the window size for the moving average - window_size = 5 - # Create the moving average kernel - kernel = np.ones(window_size) / window_size - # Convolve the histogram data with the moving average kernel - smoothed = np.convolve(n, kernel, mode='same') - bins_adjusted = bins[:-1] - - # Find the x-axis location of the highest point in the histogram - x_max = bins_adjusted[np.argmax(smoothed)] - - return x_max - - def bimodal_components(self, Y, threshold=1): - """ - Get bimodal components - """ - bimodal_components = [] - for i in range(Y.shape[1]): - x_max = self.bimodality_test(Y[:,i]) - if abs(x_max) > threshold: - bimodal_components.append([i, x_max]) - - return bimodal_components \ No newline at end of file diff --git a/preprocessing/vsdi_preprocessing.py b/preprocessing/vsdi_preprocessing.py index b0f033d..7ad86b9 100644 --- a/preprocessing/vsdi_preprocessing.py +++ b/preprocessing/vsdi_preprocessing.py @@ -8,7 +8,6 @@ import scipy.stats as stats import statsmodels.api as sm - ########################################################## def peak_distance(component, smooth_window_size, hist_nbins): diff --git a/preprocessing/vsdi_visualization.py b/preprocessing/vsdi_visualization.py deleted file mode 100644 index 961686d..0000000 --- a/preprocessing/vsdi_visualization.py +++ /dev/null @@ -1,170 +0,0 @@ -########################################################## -######################## PACKAGES ######################## -########################################################## -import matplotlib.pyplot as plt -import numpy as np -import seaborn as sns -from scipy.stats import sem -from scipy.ndimage import gaussian_filter1d -sns.set_theme(context='notebook', - style='white', - font_scale=1.5, - rc = {'axes.spines.top':False,'axes.spines.right':False, - 'image.cmap':plt.cm.jet}) - -########################################################## - -def plot_timecourse_histograms(timecourses, nbins_rule = 'freedman-diaconis'): - """ - Plot the histogram of the timecourses of the first 10 PCs - - Parameters - ---------- - timecourses : numpy.ndarray (n_timepoints, n_components) - Timecourses of the first 10 PCs - num_bins : int - Number of bins for the histogram - """ - plt.figure(figsize=(15, 25)) - - for i, tc in enumerate(timecourses.T): - # Freedman-Diaconis rulex - if nbins_rule == 'freedman-diaconis': - iqr = np.quantile(tc, 0.75) - np.quantile(tc, 0.25) - bin_width = (2 * iqr) / (len(tc) ** (1 / 3)) - nbins = int(np.ceil((tc.max() - tc.min()) / bin_width)) - - # Plot histogram - plt.subplot(5, 2, i+1) - plt.title(f'PC {i+1}') - plt.hist(tc, bins=nbins) - plt.xlim(-2*np.std(tc), 2*np.std(tc)) - -def plot_timecourses(timecourses): - """ - Plot the timecourses of the first 10 PCs - - Parameters - ---------- - timecourses : numpy.ndarray (n_timepoints, n_components) - Timecourses of the first 10 PCs - """ - start_time = 0 - end_time = 600 - # framerate = 50 - t = np.linspace(start_time,end_time,timecourses.shape[0]) - - plt.figure(figsize=(15, 25)) - for i, tc in enumerate(timecourses.T): - plt.subplot(5, 2, i+1) - plt.plot(t, tc) - plt.title(f'PC {i+1}') - -def plot_fingerprints(PCs, raw_mask): - """ - Plot the topographic organization of the weights of the first 10 PCs - - Parameters - ---------- - PCs : numpy ndarray - PCs matrix (n_components, n_pixels) - raw_mask : ndarray - Mask of the brain cortex - """ - plt.figure(figsize=(10,5)) - for i, pc in enumerate(PCs): - plt.subplot(2,5,i+1) - plt.title(f'PC {i+1}') - reshaped_pc = np.full((raw_mask.shape[0], raw_mask.shape[1]), np.nan) - reshaped_pc[np.where(raw_mask)] = pc - plt.imshow(reshaped_pc, aspect='auto', cmap=plt.cm.jet) - plt.axis('off') - -def create_frame(vsdi, t): - # VSDI - Should be already masked - plt.imshow(vsdi[:,:,t], cmap=plt.cm.jet) - plt.axis('off') - -def fingerprint_gif(vsdi, to, tf, step): - plt.figure(figsize=(20,15)) - for i, t in enumerate(range(to, tf, step)): - plt.subplot(1, step, i+1) - create_frame(vsdi, t) - -def plot_betas(results): - # Get the beta coefficients and their names - coefficients = results.params - names = ['Intercept'] + ["CS+ Onset", "CS+", "CS- Onset", "CS-", "Reward", "Lick"] - colors = ['#3C3C3C', '#1E70AA', '#8BBEE2', '#C11910', '#FFB3AF', 'green','#832F95'] - - # Plot the beta coefficients - plt.figure(figsize=(2, 3)) - plt.rc('xtick',labelsize=9) - plt.rc('ytick',labelsize=9) - plt.bar(names, coefficients, color=colors) - plt.xticks(ticks=range(len(names)), labels=names, rotation=-90) - # plt.show() - -def convert_pvalue_to_asterisks(pvalue): - if pvalue <= 0.0001: - return "****" - elif pvalue <= 0.001: - return "***" - elif pvalue <= 0.01: - return "**" - elif pvalue <= 0.05: - return "*" - return "" - -def timecourse_around(t, d, to, tf, feature, comp): - """ - Plot the timecourse of a given feature around a given timepoint - - Parameters - ---------- - t : numpy.ndarray (n_components, n_timepoints) - Timecourses of the first 10 PCs - d : numpy.ndarray (n_timepoints, n_features) - Design matrix - to : int - Start timepoint of interest - tf : int - Final timepoint - feature : int - Feature of interest in the following order: - ["CS+ Onset", "CS+", "CS- Onset", "CS-", "Reward", "Lick"] - comp : int - Principal component to plot - """ - - names = ["CS+", "CS+ Onset", "CS-", "CS- Onset", "Reward", "Lick"] - colors = ['#1E70AA', '#8BBEE2', '#C11910', '#FFB3AF', 'green', '#832F95'] - frame_rate = 50 - start_time = to - end_time = tf - peri_Y = [] # empty list for peri-lick timecourses - - for i, j in enumerate(d[:,feature]): - try: - if (j == 1) and d[(i-1),feature] == 0: - peri_Y.append(t[:,(i+(frame_rate*start_time)):(i+(frame_rate*end_time))]) # saves the slice of Y - except: - pass - - peri_Y = np.asarray(peri_Y) - mean_Y = np.mean(peri_Y, axis=0) # average over licks - error = sem(peri_Y, axis=0) # compute sem over licks - - y = mean_Y[comp-1,:] - err = error[comp-1,:] - - y = gaussian_filter1d(y,2) - err = gaussian_filter1d(err,2) - - t = np.linspace(start_time, end_time, int((end_time-start_time)*frame_rate)) - - plt.plot(t, y, color = colors[feature]) - plt.fill_between(t, y-err, y+err, alpha=0.2, color=colors[feature], cmap="Blues") - plt.xticks(np.arange(start_time, end_time+1, 1.0)) - plt.axvline(x=0,linestyle='--', color = "black", label=f'{names[feature]}') - plt.legend(prop={'size': 6}) diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..707805c --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,17 @@ +[tool.poetry] +name = "vsdi pipeline" +version = "1.0.0" +description = "Preprocessing tools for voltage sensitive dye imaging data" +authors = ["NeuroNetMem"] +license = "MIT" +readme = "README.md" + +[tool.poetry.dependencies] +python = "^3.11" +scikit-learn = "^1.2.2" +numpy = "^1.24.3" + + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/visualization/__init__.py b/visualization/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/dim_reduction/vsdi_visualization.py b/visualization/vsdi_visualization.py similarity index 100% rename from dim_reduction/vsdi_visualization.py rename to visualization/vsdi_visualization.py diff --git a/vsdi/__init__.py b/vsdi/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/vsdi/clustering.py b/vsdi/clustering.py deleted file mode 100644 index e138467..0000000 --- a/vsdi/clustering.py +++ /dev/null @@ -1,46 +0,0 @@ -import numpy as np -from scipy.spatial.distance import pdist, squareform -from sklearn.cluster import KMeans -from sklearn.manifold import TSNE -import matplotlib.pyplot as plt - -def compute_distance_matrix(arr_list): - """ - Given a list of 2D arrays, compute the pairwise distance matrix using Pearson correlation. - """ - # Get the number of arrays in the list - n_arrays = len(arr_list) - # Create an empty distance matrix with shape (n_arrays, n_arrays) - dist_mat = np.zeros((n_arrays, n_arrays)) - # Compute the pairwise distance between all pairs of arrays using Pearson correlation - for i in range(n_arrays): - for j in range(i+1, n_arrays): - corr = np.corrcoef(arr_list[i], arr_list[j])[0, 1] - dist = 1 - np.abs(corr) - dist_mat[i, j] = dist - dist_mat[j, i] = dist - # Return the distance matrix - return dist_mat - -def cluster_and_plot(arr_list, kind='betas'): - """ - Given a list of 2D arrays, compute the pairwise distance matrix, cluster it using k-means, - and plot the t-SNE projection of the distance matrix, colored by the cluster labels. - """ - # Compute the distance matrix using Pearson correlation - dist_mat = compute_distance_matrix(arr_list) - # Set the number of clusters for k-means - n_clusters = 10 - # Apply k-means clustering to the distance matrix - kmeans = KMeans(n_clusters=n_clusters) - labels = kmeans.fit_predict(dist_mat) - # Compute the t-SNE projection of the distance matrix - tsne = TSNE(n_components=2, perplexity=30, random_state=42) - emb = tsne.fit_transform(dist_mat) - # Plot the t-SNE projection, coloring each point by its cluster label - fig, ax = plt.subplots(figsize=(8, 8)) - scatter = ax.scatter(emb[:,0], emb[:,1], c=labels, cmap='viridis') - legend = ax.legend(*scatter.legend_elements(), loc="lower left", title="Clusters") - ax.add_artist(legend) - ax.set_title(f"t-SNE projection of {kind} distance matrix") - plt.show() diff --git a/loaders.py b/vsdi/loaders.py similarity index 100% rename from loaders.py rename to vsdi/loaders.py diff --git a/vsdi/pca_ica.ipynb b/vsdi/pca_ica.ipynb deleted file mode 100644 index 71b27e7..0000000 --- a/vsdi/pca_ica.ipynb +++ /dev/null @@ -1,356 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "import sys\n", - "import os\n", - "sys.path.append(os.path.abspath('../'))\n", - "from scipy.io import loadmat\n", - "import loaders\n", - "from vsdi_preprocessing import clean_outliers,pca_ica,glm\n", - "from pathlib import Path" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "datapath = Path('/ceph/imaging1/davide/ATC_Data_preprocessed')\n", - "atc = loadmat(datapath.joinpath('A04/Day1/ATC1.mat'))\n", - "vsdi = loadmat(datapath.joinpath('A04/Day1/vsdi_ATC1.mat'))['vsdi_data']\n", - "mask = loadmat(datapath.joinpath(f'A04/Day1/vsdi_mask.mat'))['mask']\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(94, 54, 29999)" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "vsdi.shape" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "from sklearn.decomposition import PCA, FastICA\n", - "from sklearn.preprocessing import StandardScaler\n", - "from sklearn.pipeline import Pipeline\n", - "\n", - "def pca_ica(vsdi,mask):\n", - " X = vsdi.transpose(2, 0, 1)\n", - " X = X*mask\n", - " X = X.reshape(X.shape[0], X.shape[1]*X.shape[2])\n", - "\n", - " # Create a pipeline with PCA and ICA\n", - " pipe = Pipeline([\n", - " ('scaler', StandardScaler()),\n", - " ('pca', PCA(n_components=10)),\n", - " ('ica', FastICA(n_components=10, max_iter=200,\n", - " random_state=1, whiten='unit-variance'))\n", - " ])\n", - "\n", - " out = pipe.fit(X)\n", - "\n", - " fingerprints = out.named_steps[\"ica\"].components_ @ out.named_steps[\"pca\"].components_\n", - " timecourses = fingerprints @ X.T\n", - "\n", - " return fingerprints,timecourses\n", - "\n", - "clean_vsdi = clean_outliers(vsdi,nsigma=5)\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "ename": "TypeError", - "evalue": "'numpy.ndarray' object is not callable", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[23], line 11\u001b[0m\n\u001b[1;32m 8\u001b[0m vsdi2 \u001b[39m=\u001b[39m loadmat(datapath\u001b[39m.\u001b[39mjoinpath(\u001b[39mf\u001b[39m\u001b[39m'\u001b[39m\u001b[39m{\u001b[39;00manimal\u001b[39m}\u001b[39;00m\u001b[39m/\u001b[39m\u001b[39m{\u001b[39;00mday\u001b[39m}\u001b[39;00m\u001b[39m/vsdi_ATC2.mat\u001b[39m\u001b[39m'\u001b[39m))[\u001b[39m'\u001b[39m\u001b[39mvsdi_data\u001b[39m\u001b[39m'\u001b[39m]\n\u001b[1;32m 9\u001b[0m mask \u001b[39m=\u001b[39m loadmat(datapath\u001b[39m.\u001b[39mjoinpath(\u001b[39mf\u001b[39m\u001b[39m'\u001b[39m\u001b[39m{\u001b[39;00manimal\u001b[39m}\u001b[39;00m\u001b[39m/\u001b[39m\u001b[39m{\u001b[39;00mday\u001b[39m}\u001b[39;00m\u001b[39m/vsdi_mask.mat\u001b[39m\u001b[39m'\u001b[39m))[\u001b[39m'\u001b[39m\u001b[39mmask\u001b[39m\u001b[39m'\u001b[39m]\n\u001b[0;32m---> 11\u001b[0m vsd1 \u001b[39m=\u001b[39m clean_vsdi(vsdi1,nsigma\u001b[39m=\u001b[39;49m\u001b[39m5\u001b[39;49m)\n\u001b[1;32m 12\u001b[0m vsdi2 \u001b[39m=\u001b[39m clean_vsdi(vsdi2,nsigma\u001b[39m=\u001b[39m\u001b[39m5\u001b[39m)\n\u001b[1;32m 14\u001b[0m vsdi \u001b[39m=\u001b[39m np\u001b[39m.\u001b[39mdstack([vsdi1,vsdi2])\n", - "\u001b[0;31mTypeError\u001b[0m: 'numpy.ndarray' object is not callable" - ] - } - ], - "source": [ - "animals = ['A04']\n", - "days = ['Day1','Day3','Day5','Day7']\n", - "\n", - "for animal in animals:\n", - " vsdi_total = []\n", - " for day in days:\n", - " vsdi1 = loadmat(datapath.joinpath(f'{animal}/{day}/vsdi_ATC1.mat'))['vsdi_data']\n", - " vsdi2 = loadmat(datapath.joinpath(f'{animal}/{day}/vsdi_ATC2.mat'))['vsdi_data']\n", - " mask = loadmat(datapath.joinpath(f'{animal}/{day}/vsdi_mask.mat'))['mask']\n", - "\n", - " vsd1 = clean_vsdi(vsdi1,nsigma=5)\n", - " vsdi2 = clean_vsdi(vsdi2,nsigma=5)\n", - "\n", - " vsdi = np.dstack([vsdi1,vsdi2])\n", - " print(vsdi.shape)\n", - " vsdi_total.append(vsdi1)\n", - "\n", - "vsdi_total = np.dstack(vsdi_total)\n", - "print('Done')\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pca_ica(vsdi_total,mask)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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XZl9fvWrX8Xxxx+Pzs5OdHZ2Yt26dfjpT3865f7S+PznP4+6ujpcdNFF+9Xvpz71KdTV1ZX9rV27dlrPVVQiO5AdiP2zA2D6bUF2IDs4GMwFOwBm3hZkB7VN3uwAmNv3hANmB1HOuPbaa6Pm5uboW9/6VvSrX/0qet/73hcVCoVo165dE/r8T37yk+jv//7vox/+8IcRgOi6664r2//5z38+6urqiq6//vrowQcfjN785jdHa9asifbu3ZvZ59lnnx1dc8010datW6MHHnggeuMb3xitWrUq6u/vj4/5wAc+EB122GHR5s2bo3vuuSc644wzojPPPDOzzx//+MfRjTfeGD3++OPRtm3bor/7u7+Lmpqaoq1bt06pP89dd90VrV69Ojr++OOjj3zkI1M+zyiKossuuyw69thjox07dsR/L7zwwn71KaojO5AdiP23gyiafluQHcgODjRzxQ6iaGZtQXZQ2+TRDqJobt8TDpQd5O5l9bTTTos2bNgQr4+OjkYrVqyINm3aNOm+/EAcGxuLli1bFl1++eXxtmKxGLW0tET/8R//MeF+u7u7IwDRli1b4j6ampqi73//+/Exjz76aAQguuOOOybc74IFC6JvfOMb+91fX19fdNRRR0U333xz9Ad/8AfxQJxqv5dddll0wgknpO6brt8uypEdyA7E9NpBFM2MLcgOEmQHM8NctoMomh5bkB3UPrVgB1E0t+4JB8oOchUGPDw8jHvvvRfr16+Pt9XX12P9+vW444479rv/p556Cjt37izrv6urC6effvqk+u/p6QEALFy4EABw7733YmRkpKzftWvXYtWqVRPqd3R0FNdeey327NmDdevW7Xd/GzZswDnnnFP2+f09zyeeeAIrVqzAEUccgfPPPx/PPPPMtPx2UYnsQHYgZt4OgOmxBdmB7GAmmat2AEyvLcgOaptasQNg7t0TDoQdNE7q6BnmxRdfxOjoKJYuXVq2fenSpXjsscf2u/+dO3fG/fn+uW88xsbGcNFFF+FVr3oVjjvuuLjf5uZmFAqFSfX78MMPY926dRgcHER7ezuuu+46HHPMMXjggQem1B8AXHvttbjvvvtw9913V+yb6nmefvrp+Pa3v42Xv/zl2LFjBz796U/j93//97F169Yp9ymykR3IDsTM2wGw/7YgO5AdzDRzzQ6A6bcF2UHtUwt2AMy9e8KBsoNcvazWAhs2bMDWrVvx85//fL/7evnLX44HHngAPT09+MEPfoALLrgAW7ZsmXJ/zz77LD7ykY/g5ptvRmtr636fH3nDG94QLx9//PE4/fTTcfjhh+N73/se2trapu17RO0gO5AdCNmB7EAA02sHwPTaguxAHEjm2j3hQNlBrsKAFy9ejIaGhopKUbt27cKyZcv2u3/2MdX+L7zwQtxwww342c9+hpUrV5b1Ozw8jGKxOKl+m5ubceSRR+Lkk0/Gpk2bcMIJJ+Cf/umfptzfvffei+7ubpx00klobGxEY2MjtmzZgquuugqNjY1YunTplPr1FAoFHH300XjyySenfK4iG9mB7EDMvB0A+2cLsoMSsoOZZa7ZATC9tiA7mB3k3Q4A3ROAmbODXL2sNjc34+STT8bmzZvjbWNjY9i8eTPWrVu33/2vWbMGy5YtK+u/t7cXv/zlL6v2H0URLrzwQlx33XW45ZZbsGbNmrL9J598Mpqamsr63bZtG5555plJnffY2BiGhoam3N9ZZ52Fhx9+GA888ED8d8opp+D888+Pl6fjPPv7+/HrX/8ay5cvn7bfLhJkB7IDMfN2AEzNFmQH5cgOZpa5bgfA/tmC7GB2kFc7AHRPCJkxO5hUOaYDwLXXXhu1tLRE3/72t6NHHnkkev/73x8VCoVo586dE/p8X19fdP/990f3339/BCC64oorovvvvz96+umnoygqlaUuFArRj370o+ihhx6K3vKWt4xblvqDH/xg1NXVFd16661l5ZkHBgbiYz7wgQ9Eq1atim655ZbonnvuidatWxetW7cus89LLrkk2rJlS/TUU09FDz30UHTJJZdEdXV10X//939Pqb8swkpfU+33r//6r6Nbb701euqpp6Jf/OIX0fr166PFixdH3d3d03quIkF2IDsQ+28HUTT9tiA7kB0caOaKHUTRgbEF2UFtkkc7iKK5fU84UHaQu5fVKIqiL3/5y9GqVaui5ubm6LTTTovuvPPOCX/2Zz/7WQSg4u+CCy6IoqhUmvoTn/hEtHTp0qilpSU666yzom3btlXtM60/ANE111wTH7N3797oQx/6ULRgwYJo3rx50Vvf+tZox44dmX2++93vjg4//PCoubk5OuSQQ6KzzjorHoRT6S8LPxCn0u/b3/72aPny5VFzc3N06KGHRm9/+9ujJ598ctrPVZQjO5AdiP2zgyiafluQHcgODgZzwQ6i6MDYguygdsmbHUTR3L4nHCg7qIuiKJqcFiuEEEIIIYQQQswsucpZFUIIIYQQQgghAL2sCiGEEEIIIYTIIXpZFUIIIYQQQgiRO/SyKoQQQgghhBAid+hlVQghhBBCCCFE7tDLqhBCCCGEEEKI3JHLl9WhoSF86lOfwtDQUO77VZ/T/+8kEmrl3019yg5mklr5d1OfsoOZpFb+3eZynzPZryhRK2OhVvqcqX6ns89czrPa29uLrq4u9PT0oLOzM9f9qs/p/3cSCbXy76Y+ZQczSa38u6lP2cFMUiv/bnO5z5nsV5SolbFQK33OVL/T2WculVUhhBBCCCGEEHObGXtZvfrqq7F69Wq0trbi9NNPx1133TVTXyVEbpEdCCE7EAKQHQgByA7E5GmciU7/8z//Exs3bsTXvvY1nH766bjyyitx9tlnY9u2bViyZEnVz46NjeG3v/0tgJKEPJ2wv+nsV31m9xlFEfr6+rBixQrU1889EX9/7eD5558Ho/RrfSzM5T5lB1O3A2Dm7gmzZXzVSp+yA9nBXOhzvH5lB7KDvPU5U/1Oqx1EM8Bpp50WbdiwIV4fHR2NVqxYEW3atKni2MHBwainpyf+e+SRRyIA+ptFf88+++xMDLPcIzvQn+xgcnYQRbKF2f4nOyghO5jbf7KDErKDuf03UTuYdmV1eHgY9957Ly699NJ4W319PdavX4877rij4vhNmzbh05/+dMX22074Mdob5k/36YkDSP/oHrzmwTejo6PjYJ/KAWe67GDzsT+RHdQ4/aN7cNav3ig7MKrZAZBtC5fPfwRtdXPv/+FsYW/Uh4v3HCM7MKZqB5+oewqtdSraU6sMRr34X9Ea2YExVTt49i8vRWdL64ydq5hZeocGcdjXN03YDqb9ZfXFF1/E6Ogoli5dWrZ96dKleOyxxyqOv/TSS7Fx48Z4vbe3F4cddhjaG+ajo6F9uk9PHATq6uoO9ikccKbTDtplB7MC2UFClh0A2bbQVteBNj2k1zyyg4Sp2EFrXadeVmudSHYQMhU76Gxp1cvqLGCidjAjOauToaWlBS0tLQf7NIQ4qMgOhCghWxBCdiAEIDsQJaY9u3vx4sVoaGjArl27yrbv2rULy5Ytm+6vEyKXyA6EkB0IAcgOhABkB2LqTPvLanNzM04++WRs3rw53jY2NobNmzdj3bp10/11QuQS2YEQsgMhANmBEIDsQEydGQkD3rhxIy644AKccsopOO2003DllVdiz549eNe73jUTXydELpEdCCE7EAKQHQgByA7E1JiRl9W3v/3teOGFF/DJT34SO3fuxIknnoibbrqpIqlaiNmM7EAI2YEQgOxACEB2IKZGXRRF0cE+iZDe3l50dXXhvpM2qxpwjdM32o+T7jsLPT096OxU9cLJQDv45fFbVA24xukf7cfpD/2B7GCK0Bb+uf1ZVQOuYfZGvbiw/zDZwRShHfxD/W5VA65hBqNe/P3YItnBFKEd9PzVp1UNuIbpHRpE11WXTdgOpj1nVQghhBBCCCGE2F/0siqEEEIIIYQQInfoZVUIIYQQQgghRO7Qy6oQQgghhBBCiNyhl1UhhBBCCCGEELlDL6tCCCGEEEIIIXKHXlaFEEIIIYQQQuQOvawKIYQQQgghhMgdelkVQgghhBBCCJE79LIqhBBCCCGEECJ36GVVCCGEEEIIIUTu0MuqEEIIIYQQQojcoZdVIYQQQgghhBC5Qy+rQgghhBBCCCFyh15WhRBCCCGEEELkDr2sCiGEEEIIIYTIHXpZFUIIIYQQQgiRO/SyKoQQQgghhBAid+hlVQghhBBCCCFE7mg82CeQJ7Y+txIAMDpW/g7Pdb895NQjfjNzJybEAeSWR44BABTmDQAAFrX3AwC63DrbcN8TO5cdsPMUYqa5ua8TANDgtnO92dqWYB+3HdfRO3MnJsQBZOMbfwIAeLG3ZA/d1j730sKydrvZCwA8Z+1xDfsO0FkKMbPUXf5VW+KrU6u1i127MvhUaTm6eHRGz222I2VVCCGEEEIIIUTukLKKRFFtqB8ra6mkcp2kKawPPrMKAHDCqmdm7DyFmEmuvf8kAMCipmEAlfYwr7m0vb11EECipgJAk6msxxz/EADgkYeOPwBnLMTMcHOgEIU0uLbaMVSZVkthFTXKxj/7bmmhvx0A0NxYrpIO7Ss9Qg4Ml+IJ+oN9Pdb+YLR0zJ9IYRU1St3lm9wWKqr73Hq7taEl7LU+VgMAooufn/bzmwtIWRVCCCGEEEIIkTvmtLL66PMrAAAt5i30CupEFFW/jX1y+3Ern6v4jBB54kumqC5x2zn+25yiylzWpiBnFZ2mHlFh/aP/Lq2bbT3ykzdO92kLMe14RdUrqb5lrmozEprdMbtNlaI9FYKIBCHyyMYPfaW0MGiK0XBz2X4+3wybsto/VDquLzim6NovjpY/bv6NlFaRc+ouv8yWOFYbXZtF9v66y//AllYDAKKL/21qJzfHkLIqhBBCCCGEECJ3zDlllconADSap5t5GM1OYfUtCdVUXymYnkau8/tesUJx6iI/fMzUVABYZO2wO8Yrq1SE5lNRraKswlRYKqvHvONaAMAj175j/09eiGkkLT91sopqmrI6r678/kJ7Yn4fc8CFyAMbP/aFZIVKqj3PwD0DMVd1rx3HWIEwU48qa9HaHpTzj6a0/q0UVpEj6i7/+2DNj03mpvpqwFktALRZ25HaR+PlHyt908WB/YkKpKwKIYQQQgghhMgdc0ZZZcXflqCaHT3eVI7o6c5SWtOgksrWexz993O75mUVB4M/M0W1EGybZ62fBYzj31cBBnPuQmWVy1RYnbIKizQ45i++U1q3XKhHvvenU/gVQuw/t2TMoRpum6iiSt952THj3EeGXBSOlFZxMNj4qU+VFsJnln3u0dBFjsWKqrV77bAwZ5V3ByqqAxhy31yylK+bwnqEbf0fUlrFQSBRVNPGn89V9dV/CxltuNzu2payHhebwkr99SkprWVIWRVCCCGEEEIIkTvmjLKaRpZy1GEtFdes+VeBxNMYexitbXHzkfmc1jufPDLed8aRT07L7xFiPHZbG6pJ9PN5XafR5ay2UvmhasoWSNRW3zplNfbeW9/MZQWUzyoODtWUVWpNWYqqz08FKhXVrGrzQ0696htM8pw6QtsSYibx12ggyVHltozIMbZUVMOc1aK1A/HWXWVfO4Cl9tnSHYj3n6eDqsGHS2UVB4xqiqpXUsdTVNlW22dzF9uavw8dY0orADwilVXKqhBCCCGEEEKI/DGpl9VNmzbh1FNPRUdHB5YsWYJzzz0X27ZtKztmcHAQGzZswKJFi9De3o7zzjsPu3btyuhx5rlv+2rct311vN5QPxb/NTfuQ3PjPrQ1D6OteRgdrYPoaB1E17wBdM0bQGd7Pzrb+zG/UMT8QhGtnb1o7ezF/OBvgf0tcX/so2B//A5+d8htj63FbY+tPcD/Z8RUqUU7OPb+E3Ds/SegB6Ucov7gb6/9Ddnf6Fg9Rsfqy2yloX6s5IEP/5qHk7/WwdLfvIHSX3t/9b/O3tJfsO2Yv/hOktMqck8t2gFQylW9pa8TDUDFX7P9zbO/Fvvj9jb74/6Ohn3oaEjuIeHfPPvjOu83tKdG+0uju68T3SlVikU+qUVb2PjFv8HGL/5Ncj2vH0v+xupLf/saS3/DzcBwM/oHW9E/2IqB4WYMDDejf8T+ULqX9AV/L9lfSVHdBWC7+/stgN/Gxw2jMrqHz0+iNqhFO6i7/DKbT7Ux5a/V/goT/Ftsf2nbyvdxb7v98Z6Sdl868/KP4cxAaZ2LTOpldcuWLdiwYQPuvPNO3HzzzRgZGcEf/dEfYc+ePfExH/3oR/Ff//Vf+P73v48tW7bg+eefx9ve9rZpP3EhDhayAyFkB0IQ2YIQsgMxc0wqZ/Wmm24qW//2t7+NJUuW4N5778VrXvMa9PT04Jvf/Ca++93v4nWvex0A4JprrsErXvEK3HnnnTjjjDOm78zHgTmhWXOnhsvMyesyD14rK5vSo+erNIa5HZaz0WS5HE2Wd+TzW5nTyvPx1YJF7VBLdnDs/ZxFtQgAGLBZVUNfNUc3qwH7uYPDHG0AST5TmJedlc/qc+847nl82MdgK0TtUEt2AABbXPVf3wLj56Zyf1tDeV5qWMl3vCrAWXZVNn/3eD9G5IpasoWNV2xM3xGOR5erOuhyVP38qsxZfSnobiiukLDdWl+bY68dt8z66Ko4JT6bFQfmVewT+aOW7KDu8sttyVf6DV+LJpqb6ls+d4XLi+yIhrIjWUne56ym1VKYy+xXzmpPT6ko+cKFCwEA9957L0ZGRrB+/fr4mLVr12LVqlW44447UvsYGhpCb29v2Z8QtYTsQIjpsQNAtiBqH90ThJAdiOljytWAx8bGcNFFF+FVr3oVjjvuOADAzp070dzcjEKhUHbs0qVLsXPnztR+Nm3ahE9/+tNTPY1MvJLK3KDmQMmZ5+ZXbc2aR5Jec3rIwyqOXKZiZP3Pt90FVz2vxzyEaQrv3b8pzTSmOVhrh7zbQVKTscRoXHmxJd7G2e9ihTUq+bD8PJDwCms1ZdVXBfa2QxU1VF7NNo75my8CAB754t9k/yyRK6bLDoCZs4WsWJaWlGMmq6iG95XJKqsVdobEJreaGnxchx7QaoXc3xP8tTjt+s7nGa+ksvqvXb9Z55eKanfZFz1nLRXV7dbSVkasXW19lZTVMKqANvT2M+4EAPznnQc2GkNMndzbQYyP6GpPWS5Msj0k6GM5AGCe9UWddaG1PmYgLaqGKusbLG/1p3OwOvCUldUNGzZg69atuPbaa8c/uAqXXnopenp64r9nn312v/oT4kAiOxBi+uwAkC2I2kb3BCFkB2J6mZKyeuGFF+KGG27AbbfdhpUrV8bbly1bhuHhYRSLxTLPya5du7Bs2bLUvlpaWtDS0pK6T4g8IzsQYnrtAJAtiNpF9wQhZAdi+pnUy2oURfjwhz+M6667DrfeeivWrFlTtv/kk09GU1MTNm/ejPPOOw8AsG3bNjzzzDNYt27d9J31BPBhwD40K1xmEn9mKCPXJxEGTLpsPwsEtKWEjRFfTEAl2/NJLdlBUvqCgSQFAOVhwKOu5ajzxTTGbCzX+3BgIBn3tBWG0Hf2lu/nZxkGHBbO4Gft+4757McBAI98/LMZv00cTGrLDsrDfYH0AktZ4b/Nden3EX9/CZdbxgkDHt6XffulLTI0/+cWDvxqhQPnkpqyBR/2659hwmW7TjPsl/eCflsv2uEspTSAnuCLtlv7nGtpKwy/3G2fLd8LJGH2i+x+svG93wAAXPGN96b/NnFQqSk7qHj94XgMw4AL47RZYcKLgz5Kgb9LbI0tA4X5BMT7EK/5TAUBkvsB70d/buHA/z6HwoEn9bK6YcMGfPe738WPfvQjdHR0xDHmXV1daGtrQ1dXF97znvdg48aNWLhwITo7O/HhD38Y69atO+CVH4WYKWQHQsgOhCCyBSFkB2LmmNTL6le/+lUAwGtf+9qy7ddccw3e+c53AgC+9KUvob6+Hueddx6GhoZw9tln4ytf+cq0nOxEePCZVQCyC2CEUwx0mJIz30+z4YvDeGU1xHsl3TQ39badKunu/vaK86DnnccsLxQBAIeueB4A8OT21Rm/VhwMasEOjr3/KVui548F0ktjeTiYJmA4q7Wx7QvAxLpqtQJLVFRtLGdOYdMfeDGpsnKffe8xX/kQAOCRDx24/39ifGrBDoCkSBF1o2pT11Qoqq6gkldN04ooZUX1ENpVVQV2tGRl/CRt8ib7La+XwporasEW4ilrvKLqi94FyyMspEQl1a7RxdHSZ6io7o4/GBbJ4fKLriVFa0vRP3tTzpnRZvF0ggtLpZw2XnkRAOCKi65M+ZQ4WNSCHdRd/mW3ha9BU1FWfbvYtZUFlZZbS2W1w1reh6iihvYw5PbxPnWxKayXzwGFddJhwOPR2tqKq6++GldfffWUT0qIPCM7EEJ2IASRLQghOxAzx5Snrskr9E57zzc9dO2BwtM+nqLq25Q80/GUVW7vcnmoe4P8kGbrg/sKbuqcI193CwDgyVtel/KLhUij363Ta1ga62E+hM+RSCudXgYVoDRl1U/7FCurzNSgH3FHqel8PumDyio9/F5h/fc/BwA88uf/Pt4ZChHT5ta9olo2dc0kldQ09bTR7Yu/1x3LSIW0OgYNplxl3aBvNIX1HCmsYqpQYXXT1ACIr8Wcao8RYWw5VQ3bRFl9IfiComt5T+Ko5njPvuPENuGUVSwpTZKz8YY3AQCueNMNmX0IUY5/jm90bTiVjVdbfY4qddNyRbUhiFzzR3qFtdBUuv7zPsD7QviOsNfuB+FzG5Dku371ny8EAHzwwn/GbGXKU9cIIYQQQgghhBAzxaxVVr1nnDmiYa7o/PEUVXrzuO5VUyC7GrDzWtabh3KRtaHXhBNtV3jY6ZlPq74qRFUYQdDg1ktt6MseT0mlUtTEcemrZ4fLFZW0qai+z9qjrDVltfW+pI/WLaV22HKdvMc/zKkSYoLwSsubHS3Cq6hAZY2DrOq/Wepp1rY0qqmzLd6Fbkw4+kEIj5/NYALVgOMcVWtf2lNSlop2GNvRuAowt4TLVFRTItMCOKbDh9LYJnwtBCqsbIWYNFmKajVltWAtlVTqo8vKWqqoAGKNteBbU1SX2JhmpCejeIaCavF+Zgbua3GRo7MZvQUJIYQQQgghhMgds05Z9R5v7xlvS1ODslQhr7BORFn1aii3Wx9dLvcDqKy2Su9JU29n2VcdeVJJhXryvpMqz0OIMqik0sRHXJtoM6OmNXm1pkLx8faSZks8NlaJjrb296z9A/ctgbLKY5u3lLeD5R75Y64/FwDwyLnXQ4jxoAVkzZUaRtvw/sC2WtXfLHgdH28+VX/dHw0iaIZcy9mSqVHxjK+x3NV3KXdVjAfHrn9G8QorgBGn5LAaMMdh0bWVe4DkHrTPtRN/7OTzXHx/8fN3szqwzQJxxapnJty3mKtkKao+LxXInk81PVd1nlVA4FFpPbCGAmcjYY2aLmvnpbxn8F7hFVb/jHbPT94IADjljT+p6KPWkbIqhBBCCCGEECJ3zBpldetzKwFUzlnXmKGwlnbuq95mKa+hd51eSZ9PRy8lK5zaZ+tTPPPee0lP/EL7bIefo1KIDI69/2e2NJ5ph2plQ+ZRQKAm+SrA1WwpHuf0J3a4liwPlpn34T9jEQ4pCoAQWezg/Kp16dE285yKGi77ffxMo7t+70tRT72i6hVUbmfbZ9f93UPJPaTbtZbhHWcGDvC70n+6EDEbbZ7q+Prpr+cpZEUHUNlnm8wFWbR2T9CLV1aJv35bdeyUoxv8PcdXnY9rI+gZSVSn7vJrbMnnpnpFNVRWvaLKlrOklhTWBmtZ6TepBZx8Yp5rfc0C3nOYuxpG8Xg7HAjzy5Hcl2Zz7qqUVSGEEEIIIYQQuWPWSBSjGRVzJ1SZ0Xsax1OSQkXJfy897GnHAhiz41ldDwCee2lhxTYgUYkJPfQ9e5Pj/uTUu9J/kxAAJmLifra7uE3JpRsXnwcVa0KPW7vcfeDxYPm+8nbY/PcD5t1knrflch/zxb+JP/nI33xx4uco5iTek51ahTejCrC/FntCfzbthdfrON/PWkbSFG3uPKql3UEftJrn3L6+OIu1XNt6D1MGAXyzo7zWgZjjUG3hswnbCSis+9w9gPcGjvdEWeW4HEGCz1WdGOEdq0JZzXoms+0bX1wcf/aKxS9O6nvFbMfPJsD1QkYLAPOt9Qrr/LJ1HzcW9uD1Wlah9+8m+9xzVrg/655Fu/T3q9/dc0r82QWn3IPZgJRVIYQQQgghhBC5Y9Yoq4zl9h6HCalCPhfOz0Pm+wg9Ir6yXtYcqc7L/kJQ6ffp3SVv4K9t3ecl0XvpK0ICwJ9k/SYxR/GzSZKmzE94bznbIZdbV2EPoV1422FOxdjdpbaeVYHD0QuUVwO+sdQMWP5Rr2WAUFEtFkqtRSLErRDThPdgZ+3nfSUtZ3XA1SBgxAxzUjkzpM9HZRsu98V3g2et3WWtn7syvJX/Yeq5izlK1jOJ356i5BCOc1+lOtFMfXxO+V77wozWvtO1QJU55/0c3MSvCxHjldWsXNW0asBs57v10rFtZWvJerjMkeltKys/PIz44WeyIny84jobc1elrAohhBBCCCGEyB16WRVCCCGEEEIIkTtmXRgwi1dQLvehjGG4VqsPXcwKZcwqTBAuZ4VI8jMuJKw7CANm+O+vrN1uLcPERrHblorWJmUNjrq71N8Tpw5AiCTUJSscmCSFMEZtIus4/Nda2hLDGsdsDNdzmqZwuibaCre5KZvQfq0dGIb9Ahh7NFlmuG9/oXydtsIwYN8COOYdpf4fufYdEAJIghAboomnhGSlj/jtDIv0k7QDleG/3Rb+y+v5cxnt7jjkF0juAs/Ge0sUrQ0qKgEIp4R6T991AIBvdrwVQlQUWKoS/puFL7CUtFwa8R+ZALxHpYdSAinhjH5KQN4DeFxgtxsfOBEAcMWJD0zh3MTswz8bZYX/FoLPdLh9XC+NVj8dTYtrw2+Lw9wz7M3fY8J7UIsL7/UFleqzCo8BgE3riZXPoZaRsiqEEEIIIYQQInfMGmXVT5LrPQ9pHvBOn6Tv1SGvEnkVNdzm1dgMpYmKaqisspgGFdbu2ItO1YlFNYqohB6fNSn7xNzDFxHwhZXoCR+KtwzbGKqYFGOkvFBMj43hBbSHcKolqqB+n/d4Nz5Vvr4vmGbDf5a24ws8kdBDOc7UImLuMdGpmKoprlnH+kieviDKIKugEq/zT1v7G2sH4i2PBd9EL3jRtYPuDHkLD0t6+GuAmNN4JdUrrClkqTzepioLK1W7DmcVXCoE/wUKdcl1fZ5XVvlcxfsNfxOPC+8Jk5lyTcwBCtZ6ZZXbF7v1cNlPYVNq+Tbh2zCejcuxwppRxM/fa8L9VFQ751kEJSPW2GZMlQlgQpETtYCsWQghhBBCCCFE7qh5ZfUHd58GIJlol2RNohvmQLSbN3x+lpLqvXX0fITePu+tzMiz67VpNp5jGyV+gmTid2pbT1r7W2tfsJb7w3+20vcddXcEAHji1DqIucex9z9vS/T8pU1pEW5P8p65REWV2XBFa3fbmGa7gGM7iA6A30aPn7cP7+ULcsgzpyOgvbW7aW/CvuyYY97/LwCAR/7l/RBzk8f7SmOQHm2OeI6qatOaeeV0vP1UUYtBlMFLe0vLXlHldZ466kAcS/OAtbzuA8CL1mYpqX5C+6XBMasBAO/pK2VOfbNjCGLusfGHbyvfkHUNTmE8ZTV5AmKu6j7XZm0DspStRba2KLjOt2fdR3y0m1eagFhl2njPKQCAK065B2LuUXf5E7ZUsJbXTo6/xRlt+Bm2/Ezp2sp4Fj89TfgEE2+ziAFGC2Tln7INowpiRbWz106jv7z1dhLi73M1Or2TlFUhhBBCCCGEELmj5pVV+oxHR0s/ZXQwPe670Sms4TI9HPXjTUBN70bahLteWX3RvDPPrwAAPGrtYztsPfjoExVLO62lh5F5h/TfhJ6fZdautvZpiLlIwdo91npFhnD8J2rLkC33mbeQNUmZOU1FlXnWh1vbVE1Zpa3QprxX31fN9svhZ72ySu9ioZj9/UJMkFBh3RfnUjeW7cuqAkxF9aU9SQ1T2g2r//pc1b5YY33A2q3Wbg/Oitd+r0Lx2s/rvlV6xMuDzx4HAHhFvC5lVQT466yfuQCVEQTZOatx7Xhrw/sOl8dTVktj+RBbWxgoq01Zz1z+nLmeEm0j5jq8Rvpos4JrF7n1cPmQsnXWBPZVgLme1GZPRnmXjWVGC3RYm7XO40sb3bPPwpfK1/3zVmjjfjaTnctQi0hZFUIIIYQQQgiRO2peWaXvjJ4+zqnnqzX63FUgUVu5b4l5I5rc3KgVc0amVdyi+kplp3sJAOCB3xwBALjb2jvs8LuDjw7gQVt62FpW/+U/Dz0+h1m7Ovh0yWtUsAyt/3F3KXfp5lPvqjxHMYspuHWOHe9NZI7R3uDYfvtvyT9YtK2xwmpVTb3CemioYsZzpLqWtkL78LlHaRUb6RGP52g1r6L3HobzvDoP/DGf/AwA4JHPfLKyfzGr8RUZ6fWeSBXGWEmyY7yyyv2s/ttj+am7keAV1e3WJvOockbtra5lRA2Q2C398q2upVpQUlFbAmX1WGuprG63HN7VHb0Qcwifd501j3xKrQA/e8Jei1yj1pNo9byPMKInrCvgldX0KIEWdAEAltjWJZ3BOPXXft4bfPXTtGqoLlJu40PHAwCuOP4hiLnEamvHU1Z9Gy6Xxuw8u6t0lW1N1n0LAItaSnbAXGyO70KG0kpFtSm0Ax9NxpYKK+0kTVn1M5PQluydpFaQsiqEEEIIIYQQInfUvLI6mrFOT/iQeRGbrQ3nY202T0OD86IvsmPjKsFUeLxXD0g8GHbsHqv2yxzVO588EgBwm6lTt9nHivh5cNa/sJbVINn/MteuBgDMw+HxJ+mNpIcnnG1PzCUKbp2e7hG3vcm1CcOupRedvnLOt9rvIw7CZd/6vFOfaxR6/321bXoTfc6qt8fws96LKOYcHJUNdeXRNGxbrPUKK1CpoLIdcpE6/TYHcdE+1510ES8zM3VHfFd6zLW83m+3NlRWiZ/7r8Gtl+4va4NPHGctldXDF71Ydu5ijuAr5mZFjLFlNAySKJq42rVt73dt5TzAacoq8YpWKWJsoa3xWSasBgw/r2TWPJNpUW++PkJGhW8x21nt1v01tMOtJ7oo97S5dR6xJKNd3pKM/eWmgrL1ymqspPoxHtoBn4V866sC++csILF3H+VWY0hZFUIIIYQQQgiRO2re1cSMCT+/Udocen67z2cl9KZ3mEeCMeXNKbmqfr69p60K8IPPrAIA3GmK6hY7vohf2tLmoJc7rd1uLf9ZjrT2UGvL4+WBpEbZvLIjgL+0+We/rtzVOQJ9f77yp489oOI4P9jWXtaDz/lrQDmjaZ5qn/eU5c1zkQhlCij742fo8ednfF5SaLd+H3NXP/5ZAMAjn/04xNxg4fzy+Xh9JfjmCSirPjKH0QR9lrvHb9jtWiBRVhO1dbu1rPbuFVVqsMXwrK2lffAby+faZg4VPfpAks1KRXWl5TVRsWK0j5jleGXV19Vwc8G/GNQg2GHb4ta2c0wX43HI+hovxHsSvLLq57csPb0UbI2qVXs4V2pWjqpXoXhcaNP+nmS/j/PPXvG2H0LMBV7m1vmkUwCQXEM5KoN4sYqIxYJrfVTASrv3LA9mKvCKKttWn4/tx3RYDdhv89FlaVGfHv8sdpq9G9x1WvZncoSUVSGEEEIIIYQQuaPmldU+a72y2BiVe8h9Gy77Co9DLl+pLyO3FUg87vRAPm5zGN1nOU3UTLuxzZaYq3pP8Ct8NUhf+ZHey6K19J0n/4A+Cl0zjM01fKU7n5vqx1Qh/uQ8q5fqZxljG+dtmPcuTZHKzIfisX6+VZ8vBVTmUnhl1ecghZ5H/1n/vWLOUJbzhmS8trixkHY9H3LzSpL4XmHre10bfiNr/vbF6hN1KV7HeZ1/0X06VKIa3T7flqtWYa2CRQ2l38n/D2zL5u0Ts5/w2gok12Z7VoHV1xi09tfdiT7PCLGnLZKAcwQns7gzSmC7tf4ZBchWVhkbVjqPWL1qKllXY3h/8fNx+3uBb8NoH/5eKsb2O9EdxiGI2U6LPS/z3SAr/zRW9oPPznPbCu4zi2zMUi31Kmq4vDgrzzRLNQ0jDLIUVf8slvZsxs/Qdvx6jVBbZyuEEEIIIYQQYk5Q88oqfdb0itCXHc+7OlSuiqaqQgaVVB7Tn6Go9gV5di9Z1bztPQUASZ3H+6z9dexx5MyqPIJ5SkDijdyX0dLDUqrwGs6QySNGXUvF+c2Wu/pj5a7OcpgzFI98a+lHLFdUO+LZJxNFNa5k57Z3WWW7eebNa06by4s24edX9Xmo1ar2+gq+PlfVexOdglbWr/MaHrPxCgDAI1dsrPyMmFVQSfTX/Kxr/3CgxjTY+OG13s/FjdHSdl53B1wLJNfexCaZ0ZqlpE5E/ff3glJLaw9v5LRPRkKwpf3+ieUq/aBGcpXEFOH1lNdCKq1OWf2NKY1UUwHg1zY376+5bm1f/DzDLdutZbRAMTgBjlmfq1ooa/08yPvS5ogcr/X3FSBRVPm7LOoNNlPDxj/7LgDgiu/+GcTshXVdOM5iVdS1XmEFkhHbYdEqvoKvnzuV6wuDZ5OmLAV1Msqqz031OapZkQbj7QOAP/lBqf3BnyDPSFkVQgghhBBCCJE79utl9fOf/zzq6upw0UUXxdsGBwexYcMGLFq0CO3t7TjvvPOwa9eu7E6EqHFkB0LIDoQAZAdCALIDMb1MOQz47rvvxte//nUcf/zxZds/+tGP4sYbb8T3v/99dHV14cILL8Tb3vY2/OIXv9jvk03jN9ZSrqekz1BZFsQY2lsKgQknRmeJ9P4qUxkAleG/PUNJuOKz1rLcwKPW7ohDvxj+ywJLDAUL8RO/s11t7cqy7WEpGf8PyLAwXwhEzAx5sYMkHIsFlea7/bSQlrI1ICm/7lvaUoebuon2sCcI250fTHsAIAnHYuhZVkGAahO1+9Auhhizr/CzPsyY+2qsiECtkh87SEKy/PXcr/sCe+Ex3OenN2uwC6xPuwivs8ly0bXjhf82piz7trxQmp+yDaicomeeCweulgoj9o882UHW1C1sd1kY8HPWhmHALKTE56sdcYIV05g4/RLTmfhcExZV8mHAhdQ2LA4GlNtjRbqIL+DnCbezoJKF/eK5lWXtU9wupp082UH8HGMtn2+Y7sT0JxZLKgSF6Bjuy2cgrhdcGPCCrJBeIHle8eG9WVPVpIUBZ01VM154cLicFTpcI89IUzrL/v5+nH/++fjXf/1XLFiwIN7e09ODb37zm7jiiivwute9DieffDKuueYa3H777bjzzjur9ChE7SE7EEJ2IAQgOxACkB2ImWFKyuqGDRtwzjnnYP369fjsZz8bb7/33nsxMjKC9evXx9vWrl2LVatW4Y477sAZZ5xR0dfQ0BCGhobi9d7e3opjqvG4tfSavGQtfdh9ri2MJj+5bU9JqWlAOl6lZB8vBMdst5YeyGJcgGCrO4JeEmpaq1O+sWAtldSXW3uq7S2th1Mc0ztEz7qfnGAUYqbIkx0kBS98EQuUrXOsh2N+XkbbXFdeXIZqEwuP7e5P9Fl6wxd4RXW8yaxDlSdr4nc//Yz/jrRjvGIrNWnGmE47APbfFuj99sWR/DhmO+CnPUIynttcUbEGm5LM3zPC62xyDeZvyFJS/XRS+1L20caoei0ra2NVIPhkwXn/+f+jlTao6ZxmhLzZQYUqyeulXbe7TWFluyNKtAvqpTviLdutfdKtV1NW/fguvze1WJQPldW0qaQqImV8lA3XuT+M8KFSTEV1+2oAwMPPrAIAbOV2Ma3kzQ78lHzLfdtR6u8QVyQJqFRQK66lXlFNe2bxzzVZBSP9dHvV1FGv1lZTVrOU3Rp7Jpr0y+q1116L++67D3fffXfFvp07d6K5uRmFQqFs+9KlS7Fz586K4wFg06ZN+PSnPz3Z0xDioCI7EGL67QCQLYjaQ3YghOxAzByTell99tln8ZGPfAQ333wzWltbx//ABLj00kuxcWMynURvby8OO+ywcT931N2RLd0LAOgzv0kflgIAiubFoxpKXwkzSYFEQSI+D4m+CSqr7KMYfGZHvI17d7qj6TekR5we8vD/H30/R1m7FgCwxIppU0k93Fp6hIDy3EMgmZDeT2b8LpvC5hpNYbPf5MkOjr3/GluiKfNffKm1LNhemvYobaoLQn2pQjVyClSzn2IGSW4fj+kwL37neGXa03I7sryGhF708DzG8xKap/GYi64EADxy5UXVjxfjMhN2AEzdFt58UmnCsGZXg2C8WgRp2/x0L2xbrPZBS8Unq+HzTdtdm6Z0ch/VnyOtPdbaEwAAR7ijgGRieratCy3eiDZov+Xd7/w2AOBb337neD9AVCFvdrDxks+XFrwaaS1rDbAGR9Gu1cWgj2Lc8o7htVY+57zoPhHi7zL8f1OKg+OTURzR46dGAyrz6vy137dpyqpNzfOUtY9aruqju0v7mZ97QoMiDvaHvNnBH13+MQCJospcVU5lc8j80vXQXy/DaWdY/6CV28abbiarNsdE4Nj2LVCZVzqeGjsRZdWf62c/Xmo/nqjheWJSOav33nsvuru7cdJJJ6GxsRGNjY3YsmULrrrqKjQ2NmLp0qUYHh5GsVgs+9yuXbuwbNmy1D5bWlrQ2dlZ9idEnpEdCDEzdgDIFkRtITsQQnYgZpZJKatnnXUWHn744bJt73rXu7B27Vr87d/+LQ477DA0NTVh8+bNOO+88wAA27ZtwzPPPIN169ZN31kDSHJCCT3RhwIAipYTOmw+Z/pKuoJP+Ewlr6z6lvpOmBdaWW3Xe8QXuf1tbj/QYSoYddVXWEuv+fK28hykUCnwlYqpaDVb/gm/rQdiusiXHTCHyFdcbHTrtIBS7se+SWhDvmrq3pQcv30uD3DY5YxW3F68RxAor34X4qsC+4ng/XLY72SqD4tJkS87yFZUsxRWr6ICwJCND6o8e10l3faW0hhts4rwVIXCiqbcNlBR/ZT3gn6Uw/3h2GQEDhXVU6z9fQDAcbZ2tLVHHNIdf3KlKamdVFTZmnKQmQsupkTe7KBChXQK696sNugiGaFF1/a49X7XhmSpa6XYHV/J2kczAKhUivy9gL/N5eOWbeMsDrbOWgu0GGrFJ2ScrZgYebMD1rHxVTwKVvWXeagLXUs1FQBaec3kNq+wTkRR5ZjNaidSX8MrqeNtD/HXAX5v/AxWZwdGyDOTenLr6OjAcccdV7Zt/vz5WLRoUbz9Pe95DzZu3IiFCxeis7MTH/7wh7Fu3brM5Gkhag3ZgRCyAyEA2YEQgOxAzCzTLjN86UtfQn19Pc477zwMDQ3h7LPPxle+8pXp/hokyqrP1StaW1KQqIJuNyWzEPTgc/TGq5ybVjU4rmRn3z9g7Wi8vQS97fSthzlGa609zjw+r1jxfOkY84i3O8WpP8jVYyU/FAtl+xpGy5Um+dAPLAfODphLxDEx6Na9mlNqhwNlNTOiwNR5r5r6tto+Kqwj1jZVy8vguPZeQp8jm1YNmMvc5ysK0/NZI3OKzRYOnB1kQ0W1PsP7HCquLTZu2pyiynn2qEJ1mLLKSJ0OJDA3aiDOG+fVntoV50IuWOttNvwM7w6lh7mj7RupAh1l9wzeK4BAGaD3n+rA4hfLt0tZPWAcUDvIUFS5zuiB+Fpt1/mwMkDyLLTXtb6ydVal63Bf+jF8NooVVmd7pY0p1U2B7GibMOpnnCgaX4tEzDwH0g7aXMs3BF7Ls9rWsI6Gr7nBa2tWrioJnzOqPfOEx/p87GpVsbNsPC1qxtuG//4aqQ683y+rt956a9l6a2srrr76alx99dX727UQNYPsQAjZgRCA7EAIQHYgpo8aTuDabq1XVulRoJe6PDevGNcCAxpsn/+f4Oei9LkV86oc6z/j4+ZZyXd10Mexh5bUMSqqRy6zSnv04tDjYR6XPaaihhRDlQmV/lC2f2FVgb+jqsCzBFZl9PlBHHGsf120tuQh3BvkUnMGM/oGfYSBn68yzQM+zylRbCvyBbPmzQMqPXs+N9Urqi8tjA/ttcqPO8w2fD4i81N47qz8tyPFlsTsgmPBK6v1bjyHy2w5rofN+8xq1+0Dpe0Fm3c1rEyQVKAv2WAxVkd9HnmRZ+i2A4myWgqfO9ruVVRU47oGS0qZd6GyOt8rq1QBuN3lrr77e38KAPjWn34PYhaQpaRYO+yU1YnBaIDGjJZMXa3395dS91WqnIak/RbaO/PNnYLWbJW9eQe6ZrT0W96lqsCzglhJtXaezRvvn1F8izRlP6uirlcy/XMOUP6ME+7zY9bnlKaps962s84n/A18XuI2l8tdEWmz8YpSe0VSgTkPKCZOCCGEEEIIIUTuqGFl1efqFTLW2dK/Qg8hMIr51iaZp0CixWappOwRqMxZ8t4c7l9kuUXMJ6JHHACONiV1ARVVesnpEaeHxarYzQ++f7l5XKissuJdsad0loy+p++ev/QiU1gB4EqprDVM0VqOe6/evOja0vF98ay9iepOhdUrq/R4z3Me6kKQ20GvZFbOX32W5zEtZ9XnVPhcDlNDn9qZlLt/zObOe9y27TbFizbMCoC+ovZA4PV89dGPQ8weMudZdWMw3F+hqLo8v3kuh5XKaqLxJ9fcxLddugsU4xq+rPTrq18X4qUWy3dlRXgqqdRoj7Lqvy9LUVZj5dRXrvQ5rLRf+/3vvun1cRffev1NEDUKlRN33Ry0lmM6rkVgHwtrciTLfGLwcwS3ZrShKpmlupa+MSuSpwxfNT4rNzCt+rtTYxe5aq/Lf1ey2sByAADXjSbn/VaprDVLwdr42dyu2f7ZxEfToJqynzUeqymrnqyqwMQrrOG2rBxt36ZV1Oa5sWI2Wzf/dvy9b/th0scP35b9ew4QUlaFEEIIIYQQQuSOGlZWqRT5XL2Ctazx1ufaQnBs+Wd93il9ivTMMC9pSfCZQ9y2RU7B4dxN3qsXesJbueyrNdLTUSWWfYF5S04w70n8vd2lM3rO8vp6LD8jyacSswNflZGtn/+uaC3tJpl5t8+UHyqs3pdMjyM9kxzLacoqj23K8kRm5aUC2VXyTBEYM8WAY/qJQFmlovqoKV2Mu6B/sY25hT1WzZW/Lfi6V0PUMlnzrMa5qhkKa+ixZR9Un7juIwZoC+02NheNJCPJaT/x/aTdYnZ6LKrBHxfMEBnXNmD8AxXWl3UVS+umqB5u94x63juAJDLHz6/qc1Z5n+H/F81BPDvIUFY5U4CfXzVNO0yUVcaZtbu24Nq0ir8+2gdlx3L8s+X5hLm0cRycv4/43NW0CvEuZ7XL7lesV7C6WGr7LQqNv5nPSKK2WdJQfs3m8wqjYhglMy8r+itcHq+diLLKbV7BHE9hTSOrKnBaX/5cGaFGW2HrbcrPwnCQkbIqhBBCCCGEECJ31LArlZ5kn0NBJYmePp+JF3oPGuy/pZY+ufEU1XCO1JVWYYzeOiqnbL2yOt9XZgQSD3faHElA4hFJq/Rl/cw3T/sxls93lFVHfdpaqlFx+7sky+pKy1+9SLmrNUhWXtB4SmviP95ryqrPIWpw1fPomeRYXtAe6PNZ8+ERr2pVq3hn7Zh5y5mHvdtyLDiGw0q+3aZsUS/2v5L6QOzFt5Y55QDwnftPAgD8xe/dl/4bRK5pdmOvQlHNmkcuxQvuFVVfATued9VsYrg3sEObt9LXPChYW7SWY5HHhXO1MmLnMGtXWsQO7zOHmWo6n4pqUAMBrH3AbTyGrc9Z5f+3wJP/7oeOBwB86/iHIGoM5qLZuO5lHQvXUsmsnjvqZ6ksuJb51/6+A1Qqq+XHMC4nnrHAKb4A0OrVpazc1Wq5etbWm83y2YxRCX2mII3a3Mnh/4cfW/7qm5W7WnMwepHX7g4XGUalvd0/V4f3kax7RpayyjZN2fRk5bWmKapZyqnvI+27vK34Y/3c9Gnnd5I9E913UnpfBwApq0IIIYQQQgghcodeVoUQQgghhBBC5I4aDgP2Zf99gn9W2Eb4k0vp+wz/9dPOMPyXIVkM/z08CAlhqAFbHw48308b4CfvBcYPoeT2tDBgL/FbCFCTFVg60kIdGArBEJswhLIYyWdRuxTcug+L93CMDcVbssLAfPgMQ9oXMIS9WhhwVriKD2cJCyzZsg9b6+7tBAC8YC3Xd1hhjPA3sDf+XwinYxiPtvEPETkmM+x3vDCsYL+f5obr4xVaCovCNNi4bbYQQt5PitYynYQWyDtSOP5472GhJd5XeJ9ZylDetDDgFc+Xb+MxLLjk70VpBZay7kUi9+yx8TfsprXzLcNf0wrrJcUmS0ujFWG/S63lPWCfWw/xYcB91ueQrbWUnU84ndgCf7/wKVE+hD18rsoo8pdVKLDBwoCTsoHAjpRfI2oDhnm3uH93/nszDLiJ6RATeTYfL/w37bqZVVwy6z7F8V8tHDhtepu0vtPO1Z9Hlo2Fx2WFEh9A9JYihBBCCCGEECJ31LCySrJ+QqNr/cQ0QIN59KjC0JtdsJYe8OWuDaedoffGK6v1VJ+8CpVWRGk8RYBeDX42VLTcxO4w1SnGlNZ5Ly4u2xyqqfTJv8YKLd2mQks1xGprOZ6oqPLfu+C2e7uotAwWI2pzJf/jqWo4/sIiYV6l8UoqvYUsh57iPex1SipbFlTi+u6hckUASFRhPyWNnx7BT0tVCPpY0lb6fYw6oC2LGiHL+51V3CtrPQWvsPqiY6EiG6uuNtYL1i40pZXjNi5kxs8F39dh0TteUY3HpJ+eJq3AEhVWKqu018aX24G8o1kZsuYngjMo/a53P3IMAOBbxzwCURuwEJ1XVl+y7SxY1+OUxLQCS7wXDGC+LfG+wrGzx30imEKpIrqN6/xMEQDQbypt/1D5FDulH2FXcq/6+GciEk5dw2chd09iFMSQ/f+J/z/Zx0I19dfW/vXorwAA/0/DsRC1wdF2HfTX7HqvoPqxlKas+jZraj7uD+85WYrlePerUFmlTWRNb1Ot0NJE1N+QtOP47PfmH5faH7+5eh8zgJRVIYQQQgghhBC5o4aV1YK1rW6dOul8t7/DtUmuatYUNV5ZXbnAebeD5VhR5T4/ETvbaspqlgfGe3zSFC2PqVHei8J8kJ5gW7drRS2x1lr+O9OkaQfLrPVKK/cnik7FJAVOUa3Iv56Isuona/fbA48g86l9riqVTk5Pw7iCUAmgktrl1uGO9WrWoqYkF8Pbsvj/t3f2QXZc5Zl/NZ8aaaQZWba+sGyLSMQYyNqsvQTbG1JZdkkWgqmtCuUtV8XES5kKVUsZBwimbEy0gNcOUCqTih0bcHCFhKUqC0sti2uzziapLMR2xYTE8beFjIUtCWRfz4xGGo1mZv/o9+l+73PPufeOpNH0lZ5flX26+3b37dac033u+7wfPUbOUs2w5TqxH5RSbjl2Ff0+KqsoMs9lbtb7981QLNIAndusiq9C7gMoq+v4/cIKq1mlskJhXft6/+BqbzdbM1BU/77aNPQ//eIUu9prTFHsJ5f+QouyXux9YtZadmm6fG9gltTAt3mbyhXC8avpcmqTrqxC4T0axwcrRpy/g8d8SlmleDvExkJpfmHSPXj8891h3zl7ypf+yVspq73COjwHWfXMqaS83ax17t3tOVLvnpzCmVNco4cB5/5gzzT+PH4/30Pu+wH/7jCrlNVRHtOnDimrQgghhBBCCCFqRw8rq1CMWEFCO+4tK0rQXqql9dS2xKquKazbsHJvCIoSMsr1sdqElhVWWCii9SanrLIFpJ1PPSwsOWuJU8ZrhG1VDFWxdccjxb/MM5dF/VXUk4u9PUzb4S8w7i2Pj/XZPcuWY1VzrVleWc3FsHo/nQ+WcyhOh0kRmCJFFd8aM/3iKbDBlVKMyxGyquPcGAejYSxxJu+zPdbv8d2vNdEDdJsNuE3Wwz7aF4rpACms6FesvJpVfQv7QCmay8TGQlGNyipn4H4NK6g5z52mz8Z9w4e9fSd9M+c6DcoqWeqv+97lZmb2lcu/l7wHUR+gqEJhbckC7LHTeJ5yDHWk8lAp/W28xXtkktro6XWMtvF6cQWcjT45TnKxgTyfitnloaxiHz8v3it7PI8HlFS0DTsYvvhJb4vo1d+Z+y0zM/t8/32t1yjqBWL1c+pnTmFMVdvIKaydzhnp5PnTziOIFVWeV/H8KnoncFZh/j2R80BqpzB/6M6ivfND6WOXACmrQgghhBBCCCFqR08pqzse+f2wtt1bzn4Ki99m2r4+/L9g3FsorB7lWdZVPWd1Yfk7hxTV9cFvu4zjy6lOHOeXUlbZCpNTVnl73MYWFvqcrffp+pOz1Io68oYfxL/Pxd5yLAH+whyRvalpLS5jHIx5VlyojiO5OI2UBZLr3uUsggmOkrIKpRW9vSVbcTh2g2dPRWwfsnRHLwizSm2YjPEgDsb1aCquXNSS6371gWqlUz05JvV5JlaVY1ah/gy16SPDHfoPP5OjFwCU1bV4b3Csau69YxY8b37J2x04K13B094+Sq1V8VLcilryzov/oVzGsw19lJ+r7KHSLhswdMpV5b7jvoSMvpgtNbyN3lhcXzWntDbTVOuYlS2eV5Fq2jT/gbK6b5NFkAth96FCLX7Ctz9d7vFE2HuPt4ho3Ze8ZlETYt/BszI3b+mUlTd1TC52dTEZdzvlVACxL+c8J3n+nzqWycXX8hiK52j32SlCyqoQQgghhBBCiNrRU8pqVVPSrLWu5Li3r/F2o7eFbjTsMRfYq/qktb7q+GBzDT0oLmdRa2atlu2cBYYtLilltZOimoLrWGbqksF6j0yV0cZeKVSD3qZsrKI+XBiWG97CWg3VFX9LjI+il6/ycRCVVXgUjHsLVYezmraNBewUL5ixJsb4JI5VQpzgqhV+jNcGxkNrbLiKj4KS+nqvLbkdmVBhXcX3egbIVzxbNjJjmrWqZi2xHqJ+pPpgbp+cNbiThTtBPx0TFVZWXTtlFMZ6jJ8uawFyLgRWlNp6AeA99QxtR6zqd7z9UtE0Vle7vOweScgqj1bUktj/WNFHfyxb394SKxqOyXmxzPj7Y658W6DPYEbRToFPZQyugIo72i4Laa5+fWpsexZ5Vl/xzMeo+OfygIdatlTK6j5qRS1JeZh0Wys1NUfJzdu7PVdcRh/FvljHOVi1jL8RMK/PXU8uo3BqW+73BWcYTs1/ulWFlwApq0IIIYQQQgghakePSQfbwzKsb7ABjnuLWNVzmlrE41U6SrXMLdfH47YvWv46+bDnLBDtMt7lfOlTig9bQTKZv1b6dcFqGf8dKpUVdtTi33THI0WGv2cu41gnsZysChmtp8vlmeS+/f43zdUSjtvGvR0hRbUvZ01rF9MAOmS+iwoVx+6NuZWUVSz04VgP9XWupJ59rscWucJaKqu4LleI1pHqZdaaKRiWxou2P2tmZo8/G58/omc4gfiaXAbfdnRSUtG/h+jZ3LauHXvw5LJvmwXvmr/0ffC0x1PAY1OPFBlO7WV/V0b1FKoUWo/zu+5zHzEzs6985HMm6sOqoMIgRpWVfcBKasqPqp9aKKv4lslSQR2hPVN0p6iu8bwDMSdIqaByNmxkel2JaFrPRhzHAc5DyhXqdnvvt2l7zJf+zlusm1WxqmiL7/2duXVmZvb5/leS9ySWidTcvFMm31zOmLicUyU7ZRbOnTfuy4pr6hztasHGc+CYqDCz12fuvjm/SMysHZcj7/vjov3j96U/P4lIWRVCCCGEEEIIUTt6TFm9ICyzsgoL39lN7bArS7C/oY3Lw9xSLFFLHbxokeiUBSxXB6ldvF+OlD96rmZgpsU9IC7XzOwsr2MJte1AqU7D5ppW7cTyMBaW0evnyt5bgFFRWq3p2BiBNu7t6GCzR8FQzkrYTbY4JmOh7EtkQIVlnWNIoR4gO/drYF03q5RUtBsO+E25dR3jDtZVP+facL0jHsvUoqYtQ+Y70SWpPtjtMW36cUucX4c20imTMK8n3x2dYpP4XqLlG3HYOHbV/24+Bpl9G1uKFooqVFSzKpMqWpxzOr5BRV2ImaSRRZ0V/FJhnev+eYZehbNX+mlOST2WWU4x0PQdo5wB26xVSS0V1St9h7d56zWCY1+nudgs6nfPFP2/qjL8lLdQVJ8MRyFGtUGtMsXXkm7UyJzC2k4N7TavzGJiOnN1VlPr/L25Gqlcfzguc36DXC4HzoMTt/H3ncK8HpqFCSGEEEIIIYSoHfqxKoQQQgghhBCidpwGbsAAAf9IpT5uZpWb5BC1Zq2ukkP9ze6+OXeutu5anZLRcHHf+Fm3LpSpz3DeDoV+4bYW3YY2uxvwz/n6nKfcOVi6lj6evi6xLESHX3bGwoDm/o5xME6tWZVsC2647D7WVZKwTn03V9w9uJqcTSU/jpI722q4h8E1DK6+cRluYkjMge/ltOxwhQzXPeguj4OcTGAZ0rSLLmnXBzlEgrcnEtbN+jL6Hp6XM5nt7RIwtSS2oX2x3pc6R85Vma8ZfTWUYCrfE/iM3wno+ziGXX7jMvaRG3CtieVe0K+m/O+8ip7nQ3NF32mXEonJ74s5yQytx+X2LrN4n+H9Uz67zaoEeWjXYqy+39sdzSfre6BaprGCsYsrPVzuCLfjBrVxGfvI/bfn4PlzLhlqar7TKelpN+6/3c7vc9+ZusacC3MqWR8nY+J3R6fri5/h+Z8KP1lipKwKIYQQQgghhKgdPaasxtIRsHTBgoBbKSzAw24LxO9+TsXOy2atiS+4hMdKtmbE5W5SV0cWo0q1S7LBBX0zZW4OuZW1pTyHtRb9qUKzY4EbURdSfbjFS8BbLuq+htbNqkRj3N9XdUp1noLVLD6GEhw14fs2JdiIx8Dizsk24meceIBLOuF6OPGSWTW+oDyx5VHUj24Kl+cU14RFmRXTmYyS2o2yis+OZpJQ8LGDqec6+iKrAayOxmNzXjb874H+zf09LvM+aEWt6AsJVZBEb9L/VlBdS4V1pvu/Yb7MDfRJzL8O07pZXoXEeCiugxMsNSWHwXO6fCe801skVsIc5W+KJvZh6rMYb3gnlv9OLcXbUgUO+V6ksNaSVFnHXBLS3Lw6Nb/vpKx2c02d3kNMuwRLTLtkfTg/P+dzv1VS35V7V0ydut8ImoUJIYQQQgghhKgdPaWsrg+a0mG3i814C4sfK0wpRZUpj6ESNatYYUoV5O3k976YFNa5tp1a28lK7u3hTGtWpaUH/G/2xkf+lZmZPXbZw53vRSw5sYg7/63QsqLKbYx7Helv9iQYJs+C44rt6BTLkbIAwqLOadKxneOXogWelSi0rKyyYpSKCwE0ti66qIjdfvzxi0zUg/lgSS8tr536Hlm057tQzjspqzE+lRVVfMbbW2Kzw72sZqt7p3uKikJKbW13LEiVKsgorNdd/XUzM/vK169On0ucWoI3CnrzuP+tXqZcBLk50VximYvXVXMFVlJZaTXrHLPaXLpmmJWuuFzG4L3O283WjN9/7MOIryNvgLNGivfG1sPF53vtTf7Jc4l7GKC24W1xrb8zt9XMzD7f/4KJGhD/1uhPOWUzN89ejOdkN/k8eFun903q3ByT2kkNjd/Bz3D29MnFwS7mHBfsKdo9F/DdnDSkrAohhBBCCCGEqB2LVlZ/8pOf2O/+7u/ad7/7XZuenrbt27fbfffdZ5deeqmZmS0sLNitt95q9957rzUaDbviiivsrrvush07dnQ4c2c2hOVJb2HfY3WQY/baKazlZ26dYGWpjKXgYsJxuZsCwzlylp2c0hOtR8ja+LOzm1sUeKd4jWm3jBycq/70z3v7HK03Srtqo9s7OWNYznGQslPP0XpOaU1mxaZs1y1F5HP9MvbPbr0B2IoXs9axtY73gXqQKogNK/rLZzW3UJk4a11qLOEcfswR/ywXcyiWdxyYNXuIDPnfdLBTxsYuLNydlNRcZt9252J43MUM7ehzY95mz57qx53ePTkrfbxOGgst2YCVFbiJ5R4HqefoaCa7O8+JUrCyip45U+5xyNspatvFrOI52t+0Xr6T2r1XSjhGDjPBp/3rwzgg7xqcf4PnN9jhyupzdr6ZmR2wX0zcQ+5esI9iuJllHQvt4u5zOSjaKau5ef1iPF1y2xbjjdZNvhCzdJZefpZjnfN48Hwrfid72uTuZQlZlLL6yiuv2BVXXGGDg4P23e9+1x5//HH7/Oc/b+vWrSv3ueOOO+zOO++0u+++2x566CFbvXq1veMd77AjR1IPACF6D40DITQOhDDTOBACaCyIpWJRksHtt99uW7dutfvuu6/ctm3btnJ5YWHBdu3aZTfffLNdddVVZmZ2//3328aNG+1b3/qWXX11a3zLzMyMzcxU9rqJiYmWfcB4WG62zVUZbGEJXEzMaosqRVaC/pxqFJe7rbOasrLnaiSxNYXVIzOzfZuK9sfnNa9jH1dYJykb8EvhtI95+3RpN33SW2RbxXVUD5wzmeUeB93QSWltyiicsYq19Pt2lr9O8dY5L4EUOUsf1wuLVnRYDQ+4/8Xec4vWx8ER8jCAcnUwZLN7ycfKAfdWwFhh5et1m/blr/0MYinGgdnixsJU6AOccwBti9J6EjmW6McDFKOa25fjXZvyCFAWYjzxy5qsXC84Kmu5sZbL1J36d8F5c1Z5ZQUuqcM4SM1J+jLjIRerOhO2sZJaPXlZSeXY1VSdVY77RE76ok9xNvq275Xye6GoYiaTUFbJmwbVHDZ7zoPX79/UdIa/sLf40k/DUQ36XtwTV6EQZjWYG3WjrHaKYe1mfn887xSOBe2UjyCV0Zevld8H3JpV941nN7wuuWYqvi8332p37al9TzKLUla//e1v26WXXmq/8Ru/YRs2bLBLLrnE7r333vLzH/3oR7Zv3z57+9vfXm4bGxuzt7zlLfb9738/ec7bbrvNxsbGyv+2bt16nLcixKlB40CIpRkHZhoLorfQOBCiQHMjsVQsyiy0e/duu+uuu+zGG2+0T3ziE/bII4/Yhz70IRsaGrJrr73W9u0rFIeNGzc2Hbdx48byM+amm26yG2+8sVyfmJjIdsZURR9WkGYyn7fWCUvEZbg1gq3aWF/ZTb3FTtnBUladTnWfYBlBfCrUUzOzpz073u7XFru8uMXMKsWoVFLdmoJ2b7i0p8ulR7x9ytsG3cS/br2vM5DlHgfc580qazk+W0wVuFw8Xku/X0z/z2WYa6fOcvw3exjkMv6atdb98tjtZ32sYDxAiWu4VXFv8FLYPVucA2MDzxJY/rGnlNWCpRgHZosbC9PBko6aqJxzAP15iBVHJyqg7WJP2zGwCAs7v19SzGTeRYhhXcnZ36OymotF7XRv8XNWbn28wENhSspqSR3GQRP0bIVyjz7av8I/XyClPyxDJ4FuWuVdP0SfYD01tlhRHU22yFDfUnXBLJGZlGJU7RlvH/XL+LnqWFZ/PHs8lNXXnnPAzMz2/rTwxtnthz1nF4R7QCaPhjUDpVXKamS550bJOqusqKbUR7P2HmOLrbeaeh+w+riYeRWfl++Nzxnvjb8n82wvSWXl7qT+tlNjTxKLGmnz8/N26aWX2mc/+1kzM7vkkkvsscces7vvvtuuvfba47qA4eFhGx4e7ryjEDVB40CIpRkHZhoLorfQOBCiQHMjsVQs6sfq5s2b7aKLmmsMvv71r7c///M/NzOzTZsKFWP//v22eXNVB2v//v128cUXn+Clmv1hqPP5W177E3YF/j3PcRiwA06GfUZp29RMYWlAfCfHea7M+bqbLbq2X/JYVqEAK6uunppZqag+5bUfH/NYvVfdWoI4qZcPFXf7hB/2jEWQ//egt/jX4pgTYbb84+D/XPJoufyOH7zZzNKeA6ntSQ8DUlShVh1lFaddH+bYjlyW7Nx6XObs22xNZIt5xPeZ9ZYVVMSjvuSZIHeHQ2GrRwwTrmzcW67sd6az3OPAzOz/hpq3V7yu+AuiH+PZN5yJ3UvRbeZe3t5uW0vm4Ezd1bgfb+OxOe7tmLd9UVnNeSTk4ptS45r2nSWld4ZViTOYOoyDL/zhB8vlG3/z/uQ+LX3XW874a9Y6b5priVWFojpL3xL7xShtG/e28HpZ5XmJEcE6kpr/tIwvPJ1JUT26omhjH2bVx7PJQ1k996yXi9aVVfxlnrOo2l3gLWf/VTKgFMs+FuJ8Iqcodnp2pbLw5uboudjV+B2dvC3ZgzL1GwIqaE6F7ea3Cc+vKGZ11r8Dz4m+drG7OS/QJVRWF+XzdMUVV9hTTz3VtO3pp5+2888vUn9v27bNNm3aZA8++GD5+cTEhD300EP21re+9SRcrhDLj8aBEBoHQphpHAgBNBbEUrEo8+iHP/xhu/zyy+2zn/2svfe977WHH37Y7rnnHrvnnnvMzGzFihV2ww032Kc//WnbsWOHbdu2zW655RbbsmWLvec971mK6y/J1QVjYia8l72FgwEsfGMe3zbuMQ6oy7Wum3jTnLKa2z8u8znYLx3KKjKemtkrrqQ+uucCMzP74cHCaskaKdahJO1p0taQ9Rf/Oud4O+7tGhMVdRoHXLmuXdbrSFN8ktfchQcBt2s7xXiY5ZXTXExDKsaBFdWWeCX63lRsiZ8PGWARpwVF6IArqrDLP1edofQvgHZA0SBd/9ueKdRpHJhVnjCspM5R7Cpn4Y2wCpqrQZzbL3des2o85bICR7WSVVe00zQ2cc/rUYPYzFbjPLms8hTvOptQdvm+OSN27h7PROo2DpisN8BcPmY1H6va8BbKIo7iuFSzSoVEi1wb65v2RMzqUEql6qis+nrK24brc/s8bqW3mNdtWOPtZDG/Grex8hQNu9CX8PT3OvZBcxYVtRoLrKzyPGIx2YBzHmGlskizg2PtvAMIVlTb1WhlL7dONWTjNfrvmZZzeTvo24+gCkI412DuXjr93jmJLOrH6mWXXWbf/OY37aabbrKdO3fatm3bbNeuXXbNNdeU+3zsYx+zQ4cO2fXXX2+NRsOuvPJKe+CBB2zlSiVkEKcHGgdCaBwIYaZxIATQWBBLxaIDT971rnfZu971ruznK1assJ07d9rOnTtP6MI6wUoSVJBcNuDDlgfngIVv1NWX9e7TXWY+TFk8ctmxcpaGdrF6gK0myHAKZRV1kqyKxUMLdQgZTRveQll9qfwX2RO+EFagNdTi4bHa28rOeqZTl3FQWqWpba5kV+3XToFlNWeas+jlLJFxOVdflRVWWPlSWUxZCcpYApsy4WXqfnENS9jlMU5izGrDW3harPf2fG9fa4Kpyzgwq57TR73/rGJFlZ6zqThUVkwHqD/nFNWBhLKK9ii9N3KxqnE/LLOCCvXpVb+XUR8/sUbrBj92Ha41k13+CKm0ESiogzQm+/wcg8eZNfl0pU7joFN20XI8YJ1as27qquIZjTcJ5grjiW/E/AGqZOG5hXdUa+8LtKhik9TiJKQemZVKqnmMajlv8n3W+NgZQ5ZgV1Z3hNM+aT/v3+bHGjLW+jkXlXf/zKBWY6Ed3dQ3zSmpQwu+w+u9pVolAzErjPfDnMKb86RM/d7AsVwRgX+jpOK+MdfKZQVGSzlLzEIcK8/R2BtuCdEbRwghhBBCCCFE7dCPVSGEEEIIIYQQtaNn889DdM+5NWId7iwpVxc4ksANBecc9xZuZdPtgpc70U3xXHYDQMtuv2inKpcDuIdNe4FvOMGgbXj7ankE3ANi3So/b5mGHv9KnCBBbsB1A6m2cu6/7GrFbsNmZkP9za5MnIimq1IXOXIuNt0UgMe4Q4p19HuMA4yPuI+Ph3kauwf9WLgB7/H2YNMTofj+ER8bSKz/Om8vHFa5gjrDCZYYds9N7ZdLRoNkE7nPYzkc3ofdgLHebj/cC7sK8/fBlbEMVbHWpExneYIZdks+TO5eyaRJXJKAy+CInoWTUca3e7Xc8JZL1vDYwRsnxh1y0iUEVhRuwTxnm0u9V7L9jJI+9p3rX1UlGivdgNFS6Alc3TGG/AzlHUd220YzMzuYdQcWtadTqFJqTsIJIQcw54CzOGYJ6I9lIczqHAOT6e/JXVcqWRi7/2K+gzkQl7aJ7zYuAdihzCa/PyKr+T3Av2sSISUnC71xhBBCCCGEEELUjp5VVmHPgI0Cdoxxbxu0nRVWs4Rlj9oZsmojxf9gtDjk1Ca2WrQr2QFIHSoVpJ+d3byO/ayyfuCKOEUS7gU66qQvTZV2RLPp8l8JaZga3nJyBVE3kPQHPQJJ98dXFP0OCVg4EUyq1MYoWZxblBZWPLsZByBnzWxnPeTEYp5ErGVcmFXlnF7cYmZmu30d7fPueYDEY5WnQUy95iWrfA2qNQo5odSBqCdQF+eo/6bUz0i7sjOpJEyp7X3x80xyPXx/7jqiJRv30vCyUi3vL88kOHqo6LPrU942Pk7RrqJ3zgxZzqPS3OJVcWRl077J5B+iHtDcI/XMN2tVVJuTUOIJ2aAWcwH2Mhmm1qwqeIEESyO0vaCcd3Gfi8st/W2UWvd/Wfm9ahcoqZzMz/s53nNlgqWxhpmZNV4dL08BnQxlDg+WM60jtIeoLTmvLk4OlEoWhL4zsMU3wM8KyirPuF/0Ns6ZvY8M7bUkuXIwcQ7Fz2GeG2E9payyYoxz4Rj/PTHrLXv1mFVjE2Omr10ZwyVCyqoQQgghhBBCiNrRs+bR17lydJRiNWHPaHh7kLYn9MzS3jfuLdQpxDLA4pyM6ckpSZ1KdUTLB6wUUExZOYJq5NsPBWW1VMUGiztbP1tY0WGtxL0cpfZAuNTn3To5Wf6rwVp4yJpZZ6JevNHjTce9fyE+bb23a0hZhYXsWOivHA+HY3DObLxau9iiTvEhqbHEMapQUjEOuMW4MLN5V1Sf9PaHPz6vaA8W+z7n+8FCjvHRH1LOI6IKXhv+7bZqxdJbDcWJw7GXLbHXREo1ZRW2RTldTFF0Gle5FmMxKp2Trqiivza85cIheBOsn6mUz6n9m8ysNTYV45mV3dR7rZ/iWefoGlPxTKJmZBRVwDGrzRphw1vMoH5G23PeVisTy5hhDVBL18GlO8xay2oYSoI87S3HCgY6lFEb9PccPGZedqXpQMiFMODzy+rsUMf2eIvY1V9s/X6xvOTK57GyinkO4p1j+aOBn/cFKKlQVjFLoJI1JQlltc+3DWQ8tPiZGt9bGBM5ZRVtKmaUy83gvD7PmvffFej3L0+13lPWyy41ZpcIKatCCCGEEEIIIWpHz5pH33huYeFiSy9ifZD986Bbxhp+XHNcRgHsftBpzl1dWEDOPauwa5/jlrc+VprM8lYbttawP3y0VLC1hBUlrPvnUSmAlRxK2tQrxb6Ix+X8van7h8paWQ/nEnuJOvIvzvuxmVV/f/RVWIsHWclPxAAdcasY+hX61GCuD7PSGs/fKS6kXVZRWOc46y/Gwb5NTe0RrJvZY3uLGOx/9vYxjzuC/R32cIyHEWrNqmyQaMetmSmO2xO1hhVVXk8pq2Xfz3kCdBOb00HJBQO0Hq8Pz+mGtwdoHZ/Dng2vALOqj8+5VwHOC4WV49hxz6mYWRw7nVFaRQ2hvsqx0mW/n3PPAz9srum936CWlVWOWcWzsT+xbSDxWQW+dZqf/2atytGE+xqs/W/NJznq76jpkCGe8yhw/hB/v+FdGRVVAF35QKmU/ZO3P/FW+TxqS6eYVFZWy/jUfxlO8mZvWVHdbM2wsv9iWKYaDcgOPJ95p7SL3WaFlSqGzNNz2yzvWVHmRXCFFYpqKscBvEv7+H3IeUwy+RhOBnrjCCGEEEIIIYSoHT2rrF64pbBcwIIAiy8yWcFKAIUV1oPDCd9qWJqhTkFRPf/swpr4Gm9tvOEHBGsaltF2qO3VUlPVLF9PkrJ1GcVkmVVxSLh23P+xw8UxuNvD1MbY3UptzdVQW22inrz5gj1mZrYu1/+wneMVgkq4Ev2Px0an2I44DnKfcf/n+In4nTwOuM6wexjMu9K6O8SsYnmPK6pQUn/qLa4Utn0/Y5N99HxvWVnFeOPsqaJesHK02OPMEopqp1jrdjWHOyi77YDaxAor+jPU037aL25DPOsQxo+DfjycUdziMr9fNQZ6APJuGcm0Q4d9PlEeGN/7UE4bmRafpxRVo8/QQmEabjoCfX2K1SKzVq8avEem/f1Wegy591n0fsnVnsQ5/B212udZGA+oWW9W1eU2e8pbVlRzMYti2WHFNJcdulRUEZ/6tnASKKusqFKd35YswFvCZ9j2ErUOv0Pa5QRhhdVbZPJ91dvpMK/i/AL8TMe++G2Uyp6PjNkt80qezy0hUlaFEEIIIYQQQtSOnjWTbttQRPHMk5UA1jnEIcDSAGU1lcUQlkaok5tdQV3nCqtBWcU6FFazvJLFyhLXOEopSrAEQlnCdrIMrg6K1gbK+AhlFf8OU5TNrorBqJgsLT+w2yM+Bf9W4ybqyTr3MGhR9tkLgOv6xv7H/Q19lLMpsiUy1h3N9ft2WbCZXFwGeRyw14RZNb456ze+jWNUEeMHNdWsqlm7Ybi41lW5erOilnBsXkuMXqZWahPHq6y2qQ15lNpURu643SzU+vYWyime4+wpEHUtVMjEs37U3wFDlPOA/32iJZ0z4HOmcPDTRJyfWGbwN/K/8yB5X8Eba9y9r6q4/Tg3mvUWfYLrq/JzHLVTYxYAqJzwzCr6HzKw4w2Evo65y3zoU31QVj3LezkO8X7j90qqNmV5MopZpfwJ8Bp4ORxSzZP8+8p/F78u+zkTNaWTlxd7e5UqKlqzKgswlNJcrCrFpSb3cea9xx/z8cF5RDjWOi5zS/P/Bv3eMWvNP9AJ/j1kZrYS4w2/gTD34xwk5MVzMpGyKoQQQgghhBCidvSssopf+H1uLUDcHdoxtybAingOZTM0q6zFUFBQo7IPVoRcGxUljk3NWXFAImawJUb1CFlcYLVIqFOofAq/c2S02+vHTHrGP/aWh9W9wO+rjFmFRQX/VriHaDUVtcA9DFr6Hyv+3Hfa1bJjRZ8t0qywxmW2WueUqVRcBiurmfgMWOBj/HlZK9bXOcP3OG2HffSC6tvt/PWFRwEsilCaOMZD1BNWwnPKalcKK2f/5Zat1Akr+CxZvTk2iJXWdpbvOWpZ14p+E7DjN7yFrX8INbiniu8ZoX+v4fBe4TwOWGfFNcaNi5qAZz496/G3hNfZmGeLhibUH/T5uVIpzcE1UzGficoSlse9Pbtprfpev0wom8Fj5mxUQkA/Yw81zMniu6hb/ByzlOekEXYJ+VC9xZtjo7eXLf57xakh593VMkdZ4QekMv0iCzDHqIJcPGrMBoxtXpuAPcd43pVSVkHGswdjB4pq9Hhhr1I8u/H8x3tzjLJjb4wepKys8riTsiqEEEIIIYQQ4kykd6UCKEiwQpCCg6yO62A1SNSHG8xkh8sqqaksqLytUz3JbmqJUfbfFkUrWlz8/BvcOrPXLR2wnhx2UzzimNJVwWA1QmwJrIiw40tZrS05ayErm7xftESzhY+VfcA1VNvFcmZiK1rGQ/yO3DGksLJSZRbi8HwdMakYZejRbqe3rWuKMb05WA9hWWSFDrFMr4Y4EFE/OimogJXM+E7oSyn+7dYTOQhmKW8A5xHgdfTnVMxqeW/e4luG6fO4P+Jb8czHMaWCNVdc8xrPBju0otnSblb927E3wfFmXBanEFZW/W+41ucXUFjXD/rcyBX3qB01Wmqkosexpo/tnPnXrNJQz/E9x4rv9a1j3uIZncy6jnkS5kZYx3yLvX9S/ZLHKGWb3+vq7UuuCsXM2pjxTNtWX8K/UpGdeEP230UsO528u04IUkvL9lFqw/K0eyug/6FlZTU3/4rQPfAc5aWgcB6YLPo53hF43uM5gDwE46SsNv3O4X9L/k1yCt4HUlaFEEIIIYQQQtQO/VgVQgghhBBCCFE7etcNOOeKyO4gLlv3uUzeF/eHpM2lONgNOJcCO7WNE82AjAuKmZkhiQDa6CJs1prQJpHMY9D3gaRfJs9wFx92I4sOvXDPmSkDy1EwoeHtrImagn6Ffg0Xkk6lN2IJGe6rfG52tQKxH/J15Fx6Y2KneL1xmRIqYfsEpWWfCscepvNiBMHVbLy/uF+4/ZZJRhKJOeBSg/OjRA6Sl0XXYVEfOEERu/nCpRWurFxSxqxyRewjF8ps30dR9tAXuVxazv23JeHSXHUd7AY8RO1IZj8zM/RoJNHDSMcoh3PXOM7lpW1GZ6p76FRIPpa5ETUD8xj0WTwbfTsSSZalbF4p5h1x1tEoe8d4uaUZJGBKl6dpXi7OgWcx3ICRmmuDuyNj7jKQcilkN3wOZ0GbCivB2MS8yl0kj3hZHCQJe8ndJWesAk6/B+3c5D3R20zUiQ7lXqqERgtFOwBXXpSrMauSLeGpifR1cANmt19vjz1VnYJK75UtlwzkBEtxbpRzCfZ7wjsEcxX05Xil6Ndr/HmP6zjHnwstJcxS8zv8buFnyyl4H0hZFUIIIYQQQghRO3pXWU0pRN3sF612rFhyuQ9WVNslWOL02PgetuLAWhKVVU6whH34XO2SCJBVBFbK9YcK6wms7LCuRIv8UPnZOG6KTt673eS0h5Ny5ZIloeVEYGbpguopOKV6tPZx/2ZFlxM/8XFmVdpzTqaBkgJ+j1CuJoPlcdqthUiOwZ4EnBgGSlFMmoTzQUF9ycfOXv8c7a+YqCNQKln167YYegTKZV/Og8f7/hHvM7EfcWF27q+srL56uPg8lhODOornNPozp/g6Sq1ZpQFgLDS89aID5fdA4Rr3Nj7117jKe9hVN1w7J+UQNQR/GzyfKbke/nYoRwT1cDycYm9L78B6TKAU13GW2IuKY1d5EiKc4RxvoVnBywV9q8nbhd8b+Iy933CPMQkeq0GupKIMDhRVJFjyInBNCZaqcVcsTfs9Dfu6ZkY1Jjf3RsuK5/h3/MBUmRre9oy3f++tK6pH9xXtxHi1ay5JGFpWVLntYl8oq6U3WLhSKKsYVeWd+JxpzOddpacFyn2Gd14feRKV/3bdJNs8SUhZFUIIIYQQQghRO3rXMMS/5Fk5ZRUoFXfH1jpY51hxRZtSVjvFqrJVPxW71yk2kM+VUrSo/AFiVsd9N1g1ceUoa2AWVVYoEjnr6YyJmgFrcS6lOPoqrHqptOS59OO5MZQq75EbZzmFlWMezCrrIcVwz/t2WA2PUfycWVphMgt92+Pxjr5cHAP1NJ7joKtJz/v6bm9f8PYlE3WmjP1ELKr3OSitHHfJ62atfWskE6OJzzk+1ayKG0LL+7zqfRHRTxiJjXB+fMb9OVc8LO5XqbLNEa0HXQ3C9+AdwKVEzKr3RnkGV387lQUSNSKTz4P/hqk8FpVCit7B5eswHgZof8SuVsvNUZ7VGdd7HgEoOoilXRmVVZ578fsLn6feJ6yo7ivKzfzE2+d9+0uvFlfW8MOisgqqsxZjaKRlu6gdnby9cp6Ka79WLfchjnVz8z7lbMAV1iPeD6e8z4XSMeUyt5jv5ErVxPkVe2T6sfN+j8izUb6/wmkwmnLlK0fcg2zVgQ1N22NpQIzRtRz/zV555/3Ylgopq0IIIYQQQgghakfvK6u5LI1QcNoV1uV4iFybU1zjMj7jGFrOJok2KrCsgnGGLc70GrOEuYUDmVK5wDwKAA8tNNslos290kuR9ZcLfKPdb6Je7HfrMKzkUNRXo09xEXVeN2v1CsiNKY5biFZszuSbK9bOxaXbWQ9dWYUyhT49QPdqZjZEWa/xySS1L7l6isyr0cqImCXEpu7xdq7cEiNBRN2AJXg4o6TmsgGPhvhLbDvsfQt9bJhinrEf1NKDIYM7VPuXkUXaMzOi9zS8ZUU1Kjocs8otM9e0zNncj/h2xDON+/pw07HxzYVxBAUJqmsqg7KoGfx8pjg3zpIN4l8UfgLTpR46Q3ux/ojtg2Fb0XtYucW5R2iMreL5llmrstopN0ispACl6MUtZmZ2yFvEqr7g75cG3VEcSzwOOCu3lNUaw1l1c7lf2lU5WPlPRTv09+l9yhhOyjsD77C4DIUf65xvpN0zlWNFXZ3FO4afx/3WCp7vGMl4H2HErPL8BCmvmZZs8NPNnjb4fK2UVSGEEEIIIYQQZxK9bx5tlyHXrFJyUhkhc5lKc8oqW/VS21gxQsvqbFS2kNEOx+ayg7G/uJnNu3XmIGVMRXzf0YVmH/aUhX6g3IY8YYP0ybC3UlbrxktuYeMaWWXMsvfPtbnswGatfTM3pjjeOmZepNph86TwD/JYS2Xn9mPmKcNqzPqbujezYFn0eEDEZ8CKiPUGtTF2+yC11qKoQp/lnKyiDqCvQWHFmBgg6y/HrEaFCZ4prPZwNmmcA30zKqusqCK6ifsX98kYZ8QKKlvK0a+5+l/zGdHifYWzzPqnRe1IqEYxjyt/f/neoLp+ooZwtlNaR58tx0HiFFV/497BsarHWo6oaP6MFXxWdktFJ1UDnL1+WEnFvXo8qpmZ7fXaqD8+z8zMniBl9aceq4cxhOuLPRt33U/7iB6AvRpzMaxtldXmTNot++A70P+glsaYVcpCXa5z7CrnCEncC+ZG5TvGv2+K50hhGVeCO2CfCPbwwbsseq6x2prLuL/Wlg4pq0IIIYQQQgghakfvKqu5+qmLyVLYSVllxaltzCpsbsgaRtWNYPlANrtoCYElZRXty9YatuJYZWHhjJOwnjZ8P1hPYCuJdtDKol5EJs20WFGHTdQTWNZyyirHmJ3lbV+McWDrYc7iyMpqUJOOkMIPSx8sbnx9aIeDhQ77ztA1swUeMYZxe5nhEmPFs5eiv0OJQlwqRmeMWZ1pWWJVAWP2kIn60RK3A0XV22MU85zKBszj5jCptByjM0VeAGbVGEBfg5LKCiuU1VzmX7O0XmVWWcdnWuJTzcx+Wn5awGrYTFN7lGJX4zJaXNvUbLOiqnqrNYTrOJL6iD6LNpXjv/or49mHHjdLbamTehv7wxE/suhfnLGdx1jbOGj2LmNVCnGAey6ojnFF9VlXWJ90ZXWPZ/9F3WHM5nDP0cOgn1r8K7CnmqghOWUVc45cLGu7c6BlZZXzbUwEjRF9NRO7esT7MOebifObGRork/TeaVBej6isIt8A+mr49WJmrXk+pmaanw9xGe+/Yc7NcwqQsiqEEEIIIYQQonYsSlmdm5uzT33qU/Ynf/Intm/fPtuyZYu9733vs5tvvtlWrFhhZmYLCwt266232r333muNRsOuuOIKu+uuu2zHjh0n+co71EzqRmHNKausNOUUVrOgqL7Z29d56/bylY8W7Vq343EcaoQzuHIW4ESdVcRnTZN1EhYYWAJhTUlFmKyhbVO+NO1tzrp/plKncQAVh5VLxNrlMj+OhfVBWBw7xaziGO+Pswk1ieNMc2oXrnOgi3HK8RI4ZrSNqlMqX24lxCjlOsMzwTbe7z192JWAY6XiBFs7vu+5jtd8JlCncWCWV2ZYFUULa3W0EnPGYI5VHaBj8ZyNdVYbnieggXVvua4qr3dXxRr9lc/eCPuk8pqaVZ4BuN9Z36tVWeX4pnh2M7NjrrBKWa3fOCg9r6g9RCoM5gztY1bhVQWtBl4lyGuBXnuE2mr5qGs7mIOgTx32jOw8h2nyOmMvM6hUnHUe8YC7X1seOuuK6jMex7rXs53Cw4FHCe4Z86EI75vyUBM1Gwv8PmCFNfebIc6VWFkFOWWVvRlS21x1haLK3mh4B82E62fvA8yvWGnF5/HOx73FNrx3UjHacXusszpJyuqczy9PZb3tRSmrt99+u9111132B3/wB/bEE0/Y7bffbnfccYd98YtfLPe544477M4777S7777bHnroIVu9erW94x3vsCNH9FITpwcaB0JoHAhhpnEgBNBYEEvFopTV733ve3bVVVfZO9/5TjMzu+CCC+zP/uzP7OGHHzazwmKya9cuu/nmm+2qq64yM7P777/fNm7caN/61rfs6quvPnlXztnhuq2hFNdhUc8pp6ywcmtmlZLKyirwGNbR7xTtfKNoo9UnF3+bq7caLD+5DJcMLID41pHEZ7C3w56Sqr8n6jUOGlTvaphqSLKymlJaobKuRJ/ksUVWxFnvlzFOjy1/7TKuxs8jOQWMP08BBQxKz2GP/z7oyipHXVd9urKN425gE62s6MXRhxW73USdxoGZ2TTVki572JzHTfsftH9FOv7UrIpr5ecq9z18XsYOzYT4nkzLXi54i4So7fANzepn9Rns4lC4GvQtzWcsWGlp5pquI2YUzlnbWVnamjnzmUTdxkFOWZ0iNYafwfFvvora6fKpGPuZWWs/nQ2fob5vGhyJ68D1zYf3Sl+qbqVZ9Y6CooU4QI9LNasUVWTMRww5vGrQh9vVTOU4vypWvEDKajO1GgusvneCK3iYVfN0jtHsVKkjKqs8HilmHC2rpTHj+gyNEXzGHj6p+T/HYvP8nvcrM80HDweuM95prrYULEpZvfzyy+3BBx+0p59+2szMfvjDH9rf/u3f2q/92q+ZmdmPfvQj27dvn7397W8vjxkbG7O3vOUt9v3vfz95zpmZGZuYmGj6T4g6o3EgxNKMAzONBdFbaBwIUaC5kVgqFqWsfvzjH7eJiQm78MILrb+/3+bm5uwzn/mMXXPNNWZmtm/fPjMz27hxY9NxGzduLD9jbrvtNvu93/u9RV/4s99+t5mZbX/vN4oN3Sqs0QKQq6Oay4qaVGuR/ReKKvzu16TX136paI81qlOw/zssKqxwJcgpZrB0jLqqsB77p87hLXQjznT32GUPZ7//TKRO4+BtFz5pZmYP/OMvmJnZYYqpg9WaFaMIPkPd0iFSk1hl4jiJuG0mEzfItMv8eDzWOs4kDNiTANZFjM7oIwHLIsYBrOawqv+/Sx7t+nrOBJZiHJgd/1jYuqaYxDzn9U1T2XXNzPpdgR2eax0Tuecox1azpTuqklieppavh71dmp/NUKhyFVUb3kJhTbnQsaKK9dVNV8DfEGFFFfrClWs0YQR1Gwdf2HWDmZndePXXzaxSKvG8ns6oMFFZ5OfldPlURB/q5jnfn1xr6fdUHzl67KyDsoo5GitdpKwegsJqVab8MkYX30dXyd4CcZyyd0RzPWOzT/TL7yxSp7lRqcaPN5q3s4Kaa81afwvwOVhZZRU1sW02k2eG2ziXYUV1mtTXo/5OS/VGjDeM6VyFbB4XiCk3q54dnGsE2fN/+T/898xZTx6LUla/8Y1v2Ne+9jX70z/9U3v00Uftq1/9qn3uc5+zr371q8d9ATfddJO9+uqr5X8vvPDCcZ9LiFOBxoEQSzMOzDQWRG+hcSBEgeZGYqlYlLL60Y9+1D7+8Y+XfuVvetOb7Pnnn7fbbrvNrr32Wtu0qYgR2L9/v23evLk8bv/+/XbxxRcnzzk8PGzDw4oFE72DxoEQSzMOzDQWRG+hcSBEgeZGYqlY1I/V6elp6+trFmP7+/ttfr6QhLdt22abNm2yBx98sOx4ExMT9tBDD9lv//Zvn5wrZrotYcP7mVUSP9x/c27AIBmoPUotBiAC/blAwS/57v+rOgW7EHRw/50P15FLaAN5fgNyQrmkn0oIwGW94SKZcxc406njOIDLBpLI5BIbpdyAed9VlJacP2cXFLNWt+NOiZ3auSXn3H/bJYliV2VcI/o2XGA2YH9vU66P3O/1mkxTx3Fglv6bRvD3hbvfSEjMNDfb7CIJt6e5jEs8kjodtgosczhFLtFMf2Kp9Ww591/cbXxX8WsdrpvsBD/atHe8h9w16p3QSl3HAeYTr1KCpfIZ7X039bfF87I10RK7AXNfG2xZ5nOV7oiZRGcxvGRdrmQNl/VDEiW4DVvl/nt0rrmcB76fxyfP1Myq0ZZzIRbN1HIsoM9wAklOksT7xX35twDIuQGnyi/RvIldenPuwHEZ+6IkH0I4uC/HNwm733OYE+BQj3jHHALGJd1OBYv6sfrrv/7r9pnPfMbOO+88e8Mb3mA/+MEP7Atf+IJdd911Zma2YsUKu+GGG+zTn/607dixw7Zt22a33HKLbdmyxd7znvcsxfULccrROBBC40AIM40DIYDGglgqFvVj9Ytf/KLdcsst9sEPftAOHDhgW7ZssQ984AP2yU9+stznYx/7mB06dMiuv/56azQaduWVV9oDDzxgK1fm0uefIDllldc5mVJchqLKpWqYVAB2CazVUFShsLLiurn5+uIyW3EyJWtSihKApQPqGNpRJM05VFxPvENWAmBxeUCJlZLUcRzM0PqcW5PnjnQuXcPJiVhZ5f1SyYxypWuOUf9sV9KGk9rwMTn1Ni7Dig5LOKzk6NMYhbCuo4xBPIatlN9UYqUkdRwHZp1VELYwx2dhqfp4Pxr2dogSqaCfcV+J8Da2cLcvezFD7SFqG952k1gJ4xR3XLwDVlmeXKmaa5RYqYW6joNDXj6DEyuVz0/aP3qQoG/g+QnVdbrstbhuHDVA282QyCuX3G4k856JitIhv/bVUKx47uX3hHuN5TbK94kruKOkJOM58bK3uNeD4fQNfA3O6e2nlFgpSS3HAvoE+hkn6YKiivl/8BjLJlsFrMqmlFV8xkmROiRWip5r7M3GpZRy7xqzauzm3jdlKTesL6R+3xQcI8+if4cEt6eARf1YXbNmje3atct27dqV3WfFihW2c+dO27lz54lemxC1RONACI0DIcw0DoQAGgtiqVjUj9U68uz9v2lmZtvf7yVhWJVEyypqXEbbQdFsX1yYY1dzdIqoso5ld6IlEr7jsFKO+b2w4srWm6lEEXtYD++Totpz1CFqcgAACi1JREFUXO3q39d+8GYzqyxvM24lOzrTHK80k4iHGPUxAmV1KBenkSAXk8oqaLv07Kn41aZjXM3iOI24jBb7cAzHuLdraN2ssqJjPHxRimpP8lZX//7CS9jkrM7oKzFWr4xj5X3mml+VrDi2KxnQSUmtri/6R8BmzsUzuMV+MVaQv2mA9mlfUiTFR6So9hx/9Je/YmZm//aNj5lZa/kLgN6RUmNay11gC/cptFEdK/bluNdS6cl47hxNeOwMuWI1SKXJUAYE95YqnYa50Rp/B+I++bmQilll5UqKag+CeQXHO7MXJj5P5bXppKyiTZWu8b45T3Me9hRrUU/DOC23UY4EtLhi9P5UboFsvPVCswcCvIhSvzOGvf2P130ld7YlY1Gla4QQQgghhBBCiFNBzyurWThWNRWzyrGqsJ6wwtNVrCq3AHa6p719qWiidbNdUWKzlnvpCzG146SkwgKSyihmZrbG73U8KKtj3t4uRbXnyWUeLRVHxNodqjwAODsd+hBnfOOC0N0or7ksveV3zlbjgLPR8XZWT6Oyeoy28f2PUItvjX4QGLkflKJ6WpCLXWVldSR8xn2QMyey+tguZhX7ppSreOxMeXQjfNqgNqeocrR6JPd6L46Z87tL3RuWPy1FtefhmFUoOujj7bIBY9uqct9i77lyZHCcYbU+7PvmYuZyMXtxzoJrLt9BNJ9JqVAAHkKY85SeO/7O4TzaGIVxRGHbLVJUe59EHzGz9hVDUtsi6FO52NWwLRerynMijNcYfz3p87bc079dzGq3GazL5wDN/8wqRfXa6+/p8mwnHymrQgghhBBCCCFqx2mjrD77pfc3rW+/YVexsBirSS5GNad0mllLlt8WXvT2GW9dtYlWHsoW1vJ9rAqHuNuzRtMxsLDO5LIFjwRL4SfeLCXpdOE3SRX8ksew5rJ7mpnNzDZb/NiyNkxx0YhtjXbKsh5lh+y/Zcy0f+dk3LfDveXiUdsdy+oWgC4QM6Lyv53oba4iVfDrHsOaUzgjPE5YfUR/YlUmwsfwOauneIPauAxPoJyys5hX+GzTOWdIWY3cJkX1tOHvnt3etM4eMSlllZ+PQ7R9utReWVmtfFWGqAXo//CqYXV0NJFPgTMZc04EjsM1a83jUWZZnW3eN+f5YCZF9bQi5qsxq2r3Av6tELfl6onybwSuu2pWzus7eRKwh9tkyJPAFTty752UZ10qN0MKjiUfDv8Oy6moAimrQgghhBBCCCFqx2mjrDLP7rqhaX37zk+27pRTTtlKwjRZWXKxqh6bCiW1VFRdCT0yXu0KKwxnFuPvS8TdDvryiFtjYE1MxXBE3i019Yzg/aQW/pErramYhjnPCjfslucRGhfoW4hZHQmx02yth3UQiipbvjnG1KxZZY3klKlUNuDyeqjNZWZ9t9TUM4arSS38H4lswWyZzvUb3q+buCDuv3Olj0CDWrPKfyCnrI7Q9oHEZ/z+ytnhi7u6Q2rqGQGUnDWuGk6hlnDYh2P8uZ0uFdTD1kyrsspjBvoWnvfI9DtCMabxWqH2zHnL8X8gqkFGsaqIAXx12qsqUN1VqMYfkZp6ZjDeaF7/2dlFG/tUTlFlcrGrYVuu2kG5G1dMCJ91qnJgtH4ssY0VVu73/VRtpA5qakTKqhBCCCGEEEKI2nHaKqvMs5/MFyDefs/1xQKsKDmFE+vRQtIH+yBiU7EOxeZvvP3rojnitsmET3u5DeudFNawzJlbB8hK8sZz95oQH2ijJN7vqivod4v7iDX3sZQFHNtyMau5zMEp62FO1eL9phPbOP6K22ukpAqHY1ojD5DqmlNYU3FuneKIqj6P8QN1atYqeLzgXcAxgvy5WaVuraS2+aq/vOZQ5lziTGKzK4mprBt/TaprlTl7mLa4Alpuz+v76P/ItoEaxuMUs2fW+v7g3AeIQ01lqF9F76QRniu5B9EvSkkVZmZn/yz/2YEN6e2svCa8Nec7KKqgrFXvin/K4wfkKmmD2KNz7zCMVNRVvfHGL3R1ncuFlFUhhBBCCCGEELXjjFFW2/HsIn2zt//VL1crA6if+je0FxSc7xTNlNsxUH8pKqtYzrU5hTUsQ0GFxREZW0djXVkh2rDYbLipmFW2fPeT5ZHXI50ysLI1sZ3l8RYpqOIE+NVFxm/+tSuxEa7Z2hrf2k7R4RylbA8fpP1XJpZXm5nZl9ewZtZlHJY443lbR9VxrGntU+FBzJmEOU/BDK1zHdi4zPkTShWK8yqE9wtnNX0eMYnOZimqols2HFjc/nsu6LhLbm7Uv6I5ptosX9Ugl0uhHZ/56B1d7FU/pKwKIYQQQgghhKgd+rEqhBBCCCGEEKJ2yA34OHj2l/+qi72u8PY/d9xz++c+UizA7ZddhZFwwF1enn34X3V1nUIsJTERBpemgUvLhrUTTW07PusJnthdMleE6Q65+oqa8LbjKvsCV97zqDX7T5P/mDmGEy0V619es+M4vl+Ik8unTsC1FqEju0Mym/WjU02ftQsjMTP7zj9cfNzfL8RJ44I95SIUwbOpXQwf/f2PmVm+VA3Pkf5rj7r6tkPKqhBCCCGEEEKI2iFltQY8+5HPLfclCLHsfEJKqRBmZvblNb+w3JcgxLLzyO7XLvclCLHs/P5pqJQuFimrQgghhBBCCCFqh36sCiGEEEIIIYSoHfqxKoQQQgghhBCidujHqhBCCCGEEEKI2lG7BEsLCwtmZjY1d2iZr0ScKPgb4m8qukfj4PRB4+DEwL/b4YXJZb4ScSLg76dxcHzg3+3IwvGUSRJ1AX8/jYPjA/9uEzNHlvlKxImAv1+346B2P1YnJ4sX2i/98N3LfCXiZDE5OWljY2PLfRk9BcbBv/nnf7/MVyJOFhoHxwfGwkcPXbTMVyJOBhoHxwfGwX9Z2Gam3zk9j8bB8YFxsPWPblvmKxEng27HwYqFmpl35ufn7amnnrKLLrrIXnjhBVu7du1JO/fExIRt3br1pJ5X58yfc2FhwSYnJ23Lli3W1yeP88UwPz9vL774oi0sLNh5553X833hTD6nxsGJsVTvhNOlf/XKOTUOTgyNg944Z6fzahycGBoHp77PLsU5FzsOaqes9vX12Wte8xozM1u7du1J/WOApTivzpk+pyyHx0dfX5+de+65NjFRuAydDn3hTD6nxsHxs9TvBJ1T46AX0DjorXO2O6/GwfGjcbB051yq856McSCzjhBCCCGEEEKI2qEfq0IIIYQQQgghakctf6wODw/brbfeasPDw7U/r8558v9OoqJX/m46p8bBUtIrfzedU+NgKemVv9uZfM6lPK8o6JW+0CvnXKrznsxz1i7BkhBCCCGEEEIIUUtlVQghhBBCCCHEmY1+rAohhBBCCCGEqB36sSqEEEIIIYQQonbox6oQQgghhBBCiNqhH6tCCCGEEEIIIWqHfqwKIYQQQgghhKgd+rEqhBBCCCGEEKJ26MeqEEIIIYQQQoja8f8BErUpPsu56NIAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import matplotlib.pyplot as plt\n", - "plt.figure(figsize=(10,5))\n", - "for i,f in enumerate(fingerprints):\n", - " ax = plt.subplot(2,5,i+1)\n", - " ax.matshow(f.reshape(vsdi.shape[:2]),cmap=plt.cm.gnuplot2)\n", - "plt.tight_layout()\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Match masks" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Mask clustering" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [], - "source": [ - "from itertools import product\n", - "\n", - "animals = ['A04','A06','A07','A08']\n", - "days = ['Day1','Day3','Day5','Day7']\n", - "\n", - "masks = []\n", - "for animal,day in product(animals,days):\n", - " try:\n", - " mask = loadmat(datapath.joinpath(f'{animal}/{day}/vsdi_mask.mat'))['mask']\n", - " masks.append(mask)\n", - "\n", - " except FileNotFoundError:\n", - " print(f\"Not found mask for {animal},{day}\")\n", - " masks.append(np.nan)\n", - " continue\n", - " except OSError:\n", - " print(f\"OS error for {animal},{day}\")\n", - " masks.append(np.nan)\n", - " continue\n", - " \n" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "16" - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "len(masks)" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA0YAAAPeCAYAAAAoEQo2AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy88F64QAAAACXBIWXMAAA9hAAAPYQGoP6dpAABT0klEQVR4nO3da5CV1b0n4P8WsGlAONACyuU0g4iGqwhq4miaSIwkGsTCIJrEZKxJvBUTPWqiE1vBa6Fy9JjjNcRUNJUao2Iuoo4y4zknUzGQaGSCkqgIIWCCjKFEEwWBNR9S3WTTXLqhL+/u9TxV/YG113732pffhx/r3e8upZRSAAAAZOyAjl4AAABAR1OMAACA7ClGAABA9hQjAAAge4oRAACQPcUIAADInmIEAABkTzECAACypxgBAADZa/ViNHny5BgzZkxrH7bD/fCHP4x+/frFe++919FLaTNPP/109OrVKzZs2NDRS6ENyGblks3OTTYrl2x2XnJZufYnl3aMmmHbtm1x7bXXxuzZs6NXr16N4x9++GHMnTs3hg8fHlVVVTF8+PC44YYbYuvWrXs83o033hilUmm/Ard69eoolUq7/Psf/+N/7PZ+H374YYwaNSpKpVLcdtttZbdNnTo1RowYETfffPM+rwvak2xCMckmFI9c7l3XFt8jQz/96U/jd7/7XXz1q18tG//CF74QjzzySJx33nkxadKk+MUvfhH19fWxZs2auP/++3d5rLVr18ZNN90UPXv2bJW1nX322fGZz3ymbOxjH/vYbud/61vfijVr1uz29vPPPz8uv/zymDt3bhx00EGtskZoK7IJxSSbUDxy2QypldXV1aXRo0e39mE71LRp09IJJ5xQNrZ06dIUEam+vr5s/LLLLkulUiktW7Zsl8c666yz0kknnbTfr9OqVatSRKRbb7212fdZv3596tOnT7ruuut2e9/169enLl26pO985zv7vDaKSTZlk2KSTdmkeOQyz1y26FS6d999Ny655JIYNmxYVFVVxYABA+Lkk0+OF198scncV155JT7xiU9Ejx49YvDgwXHLLbeU3b5ly5a45pprYuLEidGnT5/o2bNnnHjiifHcc8+VzWvYYrvtttvi9ttvj9ra2qiuro66urpYvnx5k8f97W9/G2eeeWb069cvunfvHpMmTYqf/OQnTeatXLkyVq5cudfn/MEHH8TTTz8dn/zkJ8vGf/azn0VExKxZs8rGZ82aFSmlePjhh5sc6z/+4z/i0UcfjTvuuGOvj9sSf/nLX2LLli17nXfllVfGEUccEV/4whd2O2fAgAExbty4+PGPf9yaS6SNyeYOskmRyOYOsklRyOUOcrmTlrSoc845Jx144IHpn/7pn9KCBQvSvHnz0mc/+9n0/e9/v3FOXV1dGjRoUBo6dGj62te+lu6+++500kknpYhITz75ZOO8DRs2pEMPPTT90z/9U7rnnnvSLbfcko444ojUrVu39Otf/7pxXkOTHDt2bBo2bFiaN29emjt3burXr1/q379/+tOf/tQ4d/ny5alPnz5p1KhRad68eelf//Vf08c//vFUKpXSwoULy55LbW1tqq2t3etz/j//5/+kiEg/+clPysZvuummFBHpjTfeKBt/+eWXU0SkU045pWx869atady4cen8889vfJ1ao2H36tUrRUQqlUpp0qRJ6X/+z/+5y/lLlixJBxxwQPr5z3++13b+X//rf00HH3zwPq+N9iebO8gmRSKbO8gmRSGXO8hluRYVoz59+qSLL754j3Pq6upSRKQHH3ywcWzz5s3pkEMOSTNmzGgc27p1a9q8eXPZfTdu3JgGDhyYzjvvvMaxhiddXV2d1q5d2zi+ZMmSFBHp0ksvbRybMmVKGjt2bPrggw8ax7Zv356OP/74dPjhh5c9VnM/SAsWLEgRkX7zm9+UjT/22GMpItJDDz1UNn7vvfemiEhjxowpG//Xf/3X1KdPn/TWW2+llPb/g/T73/8+fepTn0r33HNP+slPfpLuuOOO9I//+I/pgAMOSE888UTZ3O3bt6djjz02nX322SmlvW9bNoRk/fr1+7w+2pds7iCbFIls7iCbFIVc7iCX5VpUjGpra9OkSZPSunXrdjunrq4u9erVK23fvr1sfNq0aWnChAm7vM+2bdvS22+/nTZs2JBOPfXUdNRRRzXe1vCkG16Ev3fcccelI444IqWU0ttvv51KpVK6/vrr04YNG8r+5s6dmyKi7IPYXPPmzdvlfd9///1UW1ubBg4cmB577LG0evXq9PDDD6eamprUtWvXdNhhhzXO/X//7/+lfv36pdtuu63sdWrtc1fffvvtNHDgwMbXpMEDDzyQqqur05o1a1JKe/8g3XPPPSki0ssvv9yq66PtyOYOskmRyOYOsklRyOUOclmuRd8xuuWWW2L58uUxdOjQOPbYY2POnDnxxhtvNJk3ZMiQKJVKZWN9+/aNjRs3lo1973vfi3HjxkX37t2jpqYm+vfvH4sWLYp33nmnyTEPP/zwJmMjR46M1atXR0TE66+/HimlqK+vj/79+5f9XXvttRER8dZbb7Xk6ZZJKZX9u3v37rFo0aKoqamJGTNmxLBhw+Lcc8+Na665Jvr161d2GcSrr746+vXrF7Nnz97nx2+Ofv36xX/5L/8lfve738XatWsjImLTpk1x1VVXxRVXXBFDhw5t1nEanuvO7yHFJZs7yCZFIps7yCZFIZc7yGW5Fl2ue+bMmXHiiSfG448/Hs8880zceuutMW/evFi4cGF8+tOfbpzXpUuXPS4wIuL73/9+fPnLX47p06fHFVdcEQMGDIguXbrEzTff3Kwvke1s+/btERFx+eWXxymnnLLLOSNGjGjxcWtqaiIiYuPGjTFkyJCy20aPHh3Lly+PV155JTZu3BijRo2K6urquPTSS6Ouri4iIl577bW4//7744477og333yz8b4ffPBBfPjhh7F69ero3bt39OvXr8Vr25WGD8uf//znGDJkSNx2222xZcuWOOussxpD1/Ah27hxY6xevToGDRoUBx54YOMxGgJ/8MEHt8qaaHuyKZsUk2zKJsUjl3K5W83f2Gpq/fr1afDgwek//+f/3Di2uy21L33pS2XnQJ5++ulp+PDhTbYojz/++LJ5zd16XL9+fYqIdNVVV+3PU2qi4ctqP/7xj5s1f9GiRSki0n333ZdSSum5555LEbHHv6997Wuttt7LLrssRUR68803U0p/e9339vh//+XAlHyJtDOQzaZkkyKQzaZkk44ml03lmstm7xht27Yt3nvvvejTp0/j2IABA2LQoEGxefPm5h6mUUMLTyk1bnEtWbIknn/++fjHf/zHJvN/9KMfxbp162Lw4MEREbF06dJYsmRJXHLJJY1rmTx5ctx3330xe/bsOPTQQ8vuv2HDhujfv3/jvxta/GGHHbbHdU6cODEOPPDA+NWvfhXTpk3b49z3338/6uvr49BDD42zzz47IiLGjBkTjz/+eJO5V199dbz77rvxL//yL3tdw67s/HwiItatWxcPPPBAjBs3rvH5/7f/9t9i+vTpZfPeeuutOP/88+PLX/5ynH766fGf/tN/Krv9hRde2OOPalEssimbFJNsyibFI5dyuSfNLkbvvvtuDBkyJM4888wYP3589OrVKxYvXhy//OUvY/78+S160IiI0047LRYuXBhnnHFGnHrqqbFq1aq49957Y9SoUfHee+81mT9ixIg44YQT4sILL4zNmzfHHXfcETU1NfH1r3+9cc5dd90VJ5xwQowdOza+8pWvxPDhw2P9+vXx/PPPx9q1a2PZsmWNc6dMmRIR0bgdtzvdu3ePT33qU7F48eK47rrrym6bOXNmDBo0KEaNGhWbNm2KBx54IN54441YtGhR46/sHnzwwU3eyIhovPb7zrfNmTMn5s6dG88991xMnjx5t+v6+te/HitXrowpU6bEoEGDYvXq1XHffffFX/7yl/iXf/mXxnlHH310HH300WX3bXjOo0eP3uWH7P/+3/8bF1988e5fFApFNmWTYpJN2aR45FIu96i5W0ubN29OV1xxRRo/fnw66KCDUs+ePdP48ePT3XffXTavuVuP27dvTzfddFOqra1NVVVVacKECemJJ55oMu/vrzgxf/78NHTo0FRVVZVOPPHEXf4a78qVK9O5556bDjnkkNStW7c0ePDgdNppp6VHH320bF5zL2+YUkoLFy5MpVKp8SoYDebNm5eOPPLI1L1799S3b980bdq0Jtt4u7O716nhl4ZXrFixx/v/4Ac/SB//+MdT//79U9euXdPBBx+czjjjjPTCCy/s9bH3dBWPe+65J/Xo0SNt2rSpWc+DjiebskkxyaZsUjxyKZd7sl/fMWoPe7sUX3vYunVrGjlyZLr66qvb/LGOOeaYdOaZZ7b54+zOUUcdlS655JIOe3wqh2y2L9mkuWSzfckmzSGX7Wtfc9miy3XnqkuXLnHdddfFXXfdtctt0dayadOmWLZsWZMtzvby9NNPx2uvvRZXXXVVhzw+tJRsQjHJJhSPXO5diy7XnbOzzjorzjrrrDZ9jN69e+/TF/9ay9SpU9s0KNAWZBOKSTaheORyz+wYAQAA2SultNNP4AIAAGTGjhEAAJA9xQgAAMieYgQAAGRPMQIAALKnGAEAANlTjAAAgOwpRgAAQPYUIwAAIHuKEQAAkD3FCAAAyJ5iBAAAZE8xAgAAsqcYAQAA2VOMAACA7ClGAABA9hQjAAAge4oRAACQPcUIAADInmIEAABkTzECAACypxgBAADZU4wA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AIDsKUYAAED2FCMAACB7ihEAAJA9xQgAAMieYgQAAGRPMQIAALKnGAEAANlTjAAAgOwpRgAAQPYUIwAAIHuKEQAAkD3FCAAAyJ5iBAAAZE8xAgAAsqcYAQAA2VOMAACA7ClGAABA9hQjAAAge4oRAACQPcUIAADInmIEAABkTzECAACy1+rFaPLkyTFmzJjWPmyH++EPfxj9+vWL9957r6OX0maefvrp6NWrV2zYsKGjl0IbkM3KJZudm2xWLtnsvOSycu1PLu0YNcO2bdvi2muvjdmzZ0evXr0axz/88MOYO3duDB8+PKqqqmL48OFxww03xNatW3d5nBdffDGmTZsW/fr1ix49esSYMWPizjvv3K+1rVy5Ms4555wYMGBAVFdXx+GHHx7f/OY3m8xbsWJFTJ06NXr16hX9+vWLL37xi00+MFOnTo0RI0bEzTffvF9rgvYim1BMsgnFI5d713Wfn0FGfvrTn8bvfve7+OpXv1o2/oUvfCEeeeSROO+882LSpEnxi1/8Iurr62PNmjVx//33l8195pln4rOf/WxMmDAh6uvro1evXrFy5cpYu3btPq/rpZdeismTJ8fgwYPjsssui5qamlizZk384Q9/KJu3du3a+PjHPx59+vSJm266Kd5777247bbb4je/+U0sXbo0DjzwwMa5559/flx++eUxd+7cOOigg/Z5bdAeZBOKSTaheOSyGVIrq6urS6NHj27tw3aoadOmpRNOOKFsbOnSpSkiUn19fdn4ZZddlkqlUlq2bFnj2DvvvJMGDhyYzjjjjLRt27ZWWdO2bdvSmDFj0nHHHZf++te/7nHuhRdemKqrq9Pvf//7xrFnn302RUS67777yuauX78+denSJX3nO99plXVSHLIpmxSTbMomxSOXeeayRcVo06ZN6Wtf+1qqra1NBx54YOrfv3/65Cc/mV544YXGOQ0fpJdffjlNnjw5VVdXp0GDBqV58+aVHWvz5s2pvr4+HX300al3796pR48e6YQTTkj/+3//77J5q1atShGRbr311vTP//zP6R//8R9T9+7d08c//vH0m9/8pskaV6xYkWbMmJH69u2bqqqq0sSJE9OPf/zjJvNef/319Prrr+/1Ob///vvpwAMPTHPmzCkbnz9/foqI9PLLL5eN//KXv0wRkf77f//vjWP33HNPioj0yiuvpJRSeu+99/b7A/XUU0+liEhPPvlkSimlv/zlL2nr1q27nDtgwID0uc99rsn4yJEj05QpU5qMT5gwIU2bNm2/1kf7ks0dZJMikc0dZJOikMsd5LJci75jdMEFF8Q999wTM2bMiLvvvjsuv/zyqK6ujhUrVpTN27hxY0ydOjXGjx8f8+fPjyOPPDK+8Y1vxFNPPdU4Z9OmTbFgwYKYPHlyzJs3L+bMmRMbNmyIU045JV566aUmj/3ggw/GnXfeGRdffHFcddVVsXz58jjppJNi/fr1jXNefvnl+OhHPxorVqyIK6+8MubPnx89e/aM6dOnx+OPP152vClTpsSUKVP2+pxfeOGF2LJlSxx99NFl45s3b46IiOrq6rLxHj16NN6vweLFi6N3796xbt26OOKII6JXr17Ru3fvuPDCC+ODDz7Y6xp2ZfHixRERUVVVFZMmTYqePXtGjx49YtasWfHnP/+5cd66devirbfeikmTJjU5xrHHHhu//vWvm4xPnDgxfv7zn+/TuugYsrmDbFIksrmDbFIUcrmDXO6kJS2qT58+6eKLL97jnLq6uhQR6cEHH2wc27x5czrkkEPSjBkzGse2bt2aNm/eXHbfjRs3poEDB6bzzjuvcayhYVdXV6e1a9c2ji9ZsiRFRLr00ksbx6ZMmZLGjh2bPvjgg8ax7du3p+OPPz4dfvjhZY9VW1ubamtr9/qcFyxYkCKiSZt/7LHHUkSkhx56qGz83nvvTRGRxowZ0zg2bty41KNHj9SjR480e/bs9Nhjj6XZs2eniEizZs3a6xp2Zdq0aSkiUk1NTfr85z+fHn300VRfX5+6du2ajj/++LR9+/aU0o7G//fvR4MrrrgiRUTZ65VSSjfddFOKiLR+/fp9WhvtTzZ3kE2KRDZ3kE2KQi53kMtyLSpGtbW1adKkSWndunW7nVNXV5d69erV+EQaTJs2LU2YMGGX99m2bVt6++2304YNG9Kpp56ajjrqqMbbGj5IZ599dpP7HXfccemII45IKaX09ttvp1KplK6//vq0YcOGsr+5c+emiCj7IDbXvHnzdnnf999/P9XW1qaBAwemxx57LK1evTo9/PDDqaamJnXt2jUddthhjXOHDx+eIiJdcMEFZcc4//zzU0SkV199tcXrOumkk1JEpKlTp5aN33zzzSki0rPPPptSSuk//uM/UkSkhx9+uMkx6uvrU0SkjRs3lo03bJXuvK1KccnmDrJJkcjmDrJJUcjlDnJZrkWn0t1yyy2xfPnyGDp0aBx77LExZ86ceOONN5rMGzJkSJRKpbKxvn37xsaNG8vGvve978W4ceOie/fuUVNTE/37949FixbFO++80+SYhx9+eJOxkSNHxurVqyMi4vXXX4+UUtTX10f//v3L/q699tqIiHjrrbda8nTLpJTK/t29e/dYtGhR1NTUxIwZM2LYsGFx7rnnxjXXXBP9+vUruwxiw/bk2WefXXaMc845JyIinn/++RavZ2/HbNg6bJjXsFX69xq2PXfePm14rju/hxSXbO4gmxSJbO4gmxSFXO4gl+VadLnumTNnxoknnhiPP/54PPPMM3HrrbfGvHnzYuHChfHpT3+6cV6XLl12ef+/fzO+//3vx5e//OWYPn16XHHFFTFgwIDo0qVL3HzzzbFy5cqWLCsiIrZv3x4REZdffnmccsopu5wzYsSIFh+3pqYmIv52numQIUPKbhs9enQsX748Xnnlldi4cWOMGjUqqqur49JLL426urrGeYMGDYqXX345Bg4cWHb/AQMGNB67pQYNGhQRsddjHnrooRER8cc//rHJMf74xz9Gv379oqqqqmy84b4HH3xwi9dFx5BN2aSYZFM2KR65lMvdafHvGB166KFx0UUXxUUXXRRvvfVWHH300XHjjTeWfZCa49FHH43hw4fHwoULy5pcQxve2WuvvdZk7NVXX41hw4ZFRMTw4cMjIqJbt27xyU9+skVr2ZMjjzwyIiJWrVoVY8eObXJ7qVSK0aNHN/77ySefjO3bt5etYeLEifHss882flmtwZtvvhkREf3792/xuiZOnBjf/va3Y926dWXjOx9z8ODB0b9///jVr37V5BhLly6No446qsn4qlWr4uCDD96nddFxZLOcbFIUsllONikCuSwnl3/T7FPptm3b1mRLcMCAATFo0KBdbmvtTUML//vWvWTJkt1uw/3oRz8qe9GWLl0aS5YsafwADxgwICZPnhz33XffLtvkzr+Ku3LlymY1+YkTJ8aBBx64yzdiZ++//37U19fHoYceWrYlOHPmzIiI+M53vlM2f8GCBdG1a9eYPHnyXo+9s9NPPz2qqqriu9/9buP/LjQcMyLi5JNPbhybMWNGPPHEE2U/lPW//tf/ildffTU+97nPNTn2Cy+8EB/72MdavCY6hmzKJsUkm7JJ8cilXO5Rc7+MtHHjxtSzZ8/0pS99Kf3zP/9zuv/++9PMmTNTRKT58+c3ztvdD2J96UtfKrtqxgMPPJAiIk2bNi3dd9996corr0z/8A//kEaPHl02r+HLamPHjk3Dhg1L8+bNS9ddd13q169fqqmpSW+++Wbj3Jdffjn17ds31dTUpCuvvDLdf//96frrr0+f+cxn0rhx48rW09yreKSU0mmnnZY+9rGPNRn/3Oc+l772ta+l++67L916663pIx/5SKqqqkqLFy9uMve8885LEZFmzpyZ7rrrrvS5z30uRUS66qqryuZde+21KSLSc889t9d1XXfddSki0sknn5zuuuuu9NWvfjWVSqUmX+xbs2ZNqqmpSYcddli6884700033ZT69u3b5IonKe34QawFCxY045WhCGRTNikm2ZRNikcu5XJPml2MNm/enK644oo0fvz4dNBBB6WePXum8ePHp7vvvrtsXnM/SNu3b0833XRTqq2tTVVVVWnChAnpiSeeaDLv738Qa/78+Wno0KGpqqoqnXjiiWW/xttg5cqV6dxzz02HHHJI6tatWxo8eHA67bTT0qOPPlo2ryUfpIULF6ZSqZTWrFlTNj5v3rx05JFHpu7du6e+ffumadOmpV//+te7PMaWLVvSnDlzUm1tberWrVsaMWJEuv3225vMa/il4RUrVux1Xdu3b0/f+ta30siRI1O3bt3S0KFD09VXX522bNnSZO7y5cvTpz71qdSjR4/0D//wD+nzn/98+tOf/tRk3j333JN69OiRNm3atNfHpxhkUzYpJtmUTYpHLuVyT1p0ue6O8PcfpI6ydevWNHLkyHT11Ve3+WMdc8wx6cwzz2zzx9mdo446Kl1yySUd9vhUDtlsX7JJc8lm+5JNmkMu29e+5rJFl+vOVZcuXeK6666Lu+66K9577702e5xNmzbFsmXL4rrrrmuzx9iTp59+Ol577bW46qqrOuTxoaVkE4pJNqF45HLvWnxVulydddZZcdZZZ7XpY/Tu3XufvvjXWqZOndqmQYG2IJtQTLIJxSOXe2bHCAAAyF4ppZ1+AhcAACAzdowAAIDsKUYAAED2FCMAACB7ihEAAJA9xQgAAMieYgQAAGRPMQIAALKnGAEAANlTjAAAgOwpRgAAQPYUIwAAIHuKEQAAkD3FCAAAyJ5i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BAAAZE8xAgAAsqcYAQAA2VOMAACA7ClGAABA9hQjAAAge4oRAACQPcUIAADInmIEAABkTzECAACypxgBAADZU4wAAIDsKUYAAED2FCMAACB7ihEAAJA9xQgAAMieYgQAAGRPMQIAALKnGAEAANlTjAAAgOwpRgAAQPYUIwAAIHuKEQAAkD3FCAAAyJ5iBAAAZE8xAgAAsqcYAQAA2VOMAACA7ClGAABA9hQjAAAge4oRAACQvVYvRpMnT44xY8a09mE73A9/+MPo169fvPfeex29lDbzyiuvRNeuXWP58uUdvRTagGxWLtnsvOSycsll5yablWt/smnHqBm2bdsW1157bcyePTt69erVOP7hhx/G3LlzY/jw4VFVVRXDhw+PG264IbZu3brL47z44osxbdq06NevX/To0SPGjBkTd955536tbeXKlXHOOefEgAEDorq6Og4//PD45je/WTZn6dKlcdFFF8XEiROjW7duUSqVdnmsUaNGxamnnhrXXHPNfq0J2otsQvHIJRSTbO5d131afWZ++tOfxu9+97v46le/Wjb+hS98IR555JE477zzYtKkSfGLX/wi6uvrY82aNXH//feXzX3mmWfis5/9bEyYMCHq6+ujV69esXLlyli7du0+r+ull16KyZMnx+DBg+Oyyy6LmpqaWLNmTfzhD38om/fkk0/GggULYty4cTF8+PB49dVXd3vMCy64ID7zmc/EypUr47DDDtvntUF7kE0oHrmEYpLNZkitrK6uLo0ePbq1D9uhpk2blk444YSysaVLl6aISPX19WXjl112WSqVSmnZsmWNY++8804aOHBgOuOMM9K2bdtaZU3btm1LY8aMSccdd1z661//use5f/rTnxrnXHzxxWlPb/uWLVtS3759mzwvKp9syibFI5dySTHJZp7ZbNGpdO+++25ccsklMWzYsKiqqooBAwbEySefHC+++GKTua+88kp84hOfiB49esTgwYPjlltuKbt9y5Ytcc0118TEiROjT58+0bNnzzjxxBPjueeeK5u3evXqKJVKcdttt8Xtt98etbW1UV1dHXV1dbs8d/C3v/1tnHnmmdGvX7/o3r17TJo0KX7yk580mbdy5cpYuXLlXp/zBx98EE8//XR88pOfLBv/2c9+FhERs2bNKhufNWtWpJTi4Ycfbhz7wQ9+EOvXr48bb7wxDjjggPjLX/4S27dv3+tj78kzzzwTy5cvj2uvvTaqq6vjr3/9a2zbtm2XcwcOHBjV1dXNOm63bt1i8uTJ8eMf/3i/1kf7ks0dZJOikMsd5JIikc0dZLNci4rRBRdcEPfcc0/MmDEj7r777rj88sujuro6VqxYUTZv48aNMXXq1Bg/fnzMnz8/jjzyyPjGN74RTz31VOOcTZs2xYIFC2Ly5Mkxb968mDNnTmzYsCFOOeWUeOmll5o89oMPPhh33nlnXHzxxXHVVVfF8uXL46STTor169c3znn55Zfjox/9aKxYsSKuvPLKmD9/fvTs2TOmT58ejz/+eNnxpkyZElOmTNnrc37hhRdiy5YtcfTRR5eNb968OSKiyRvUo0ePxvs1WLx4cfTu3TvWrVsXRxxxRPTq1St69+4dF154YXzwwQd7XcOuLF68OCIiqqqqYtKkSdGzZ8/o0aNHzJo1K/785z/v0zEbTJw4MZYvXx6bNm3ar+PQfmRzB9mkKORyB7mkSGRzB9ncSUu2l/r06ZMuvvjiPc6pq6tLEZEefPDBxrHNmzenQw45JM2YMaNxbOvWrWnz5s1l9924cWMaOHBgOu+88xrHVq1alSIiVVdXp7Vr1zaOL1myJEVEuvTSSxvHpkyZksaOHZs++OCDxrHt27en448/Ph1++OFlj1VbW5tqa2v3+pwXLFiQIiL95je/KRt/7LHHUkSkhx56qGz83nvvTRGRxowZ0zg2bty41KNHj9SjR480e/bs9Nhjj6XZs2eniEizZs3a6xp2Zdq0aSkiUk1NTfr85z+fHn300VRfX5+6du2ajj/++LR9+/Zd3m9vW48ppfSDH/wgRURasmTJPq2N9iebO8gmRSGXO8glRSKbO8hmuRYVo9ra2jRp0qS0bt263c6pq6tLvXr1avJEpk2bliZMmLDL+2zbti29/fbbacOGDenUU09NRx11VONtDR+ks88+u8n9jjvuuHTEEUeklFJ6++23U6lUStdff33asGFD2d/cuXNTRJR9EJtr3rx5u7zv+++/n2pra9PAgQPTY489llavXp0efvjhVFNTk7p27ZoOO+ywxrnDhw9PEZEuuOCCsmOcf/75KSLSq6++2uJ1nXTSSSki0tSpU8vGb7755hQR6dlnn93l/ZrzQXrqqadSRKRFixa1eF10DNncQTYpCrncQS4pEtncQTbLtehUultuuSWWL18eQ4cOjWOPPTbmzJkTb7zxRpN5Q4YMaXIJvb59+8bGjRvLxr73ve/FuHHjonv37lFTUxP9+/ePRYsWxTvvvNPkmIcffniTsZEjR8bq1asjIuL111+PlFLU19dH//79y/6uvfbaiIh46623WvJ0y6SUyv7dvXv3WLRoUdTU1MSMGTNi2LBhce6558Y111wT/fr1K7sMYsP25Nlnn112jHPOOSciIp5//vkWr2dvx/z5z3/e4mM2aHiuu7sMIsUjmzvIJkUhlzvIJUUimzvIZrkWXa575syZceKJJ8bjjz8ezzzzTNx6660xb968WLhwYXz6059unNelS5c9LjAi4vvf/358+ctfjunTp8cVV1wRAwYMiC5dusTNN9/crC+R7azhy1+XX355nHLKKbucM2LEiBYft6amJiL+dp7pkCFDym4bPXp0LF++PF555ZXYuHFjjBo1Kqqrq+PSSy+Nurq6xnmDBg2Kl19+OQYOHFh2/wEDBjQeu6UGDRoUEdGqx2zQcN+DDz54n49B+5JN2aR45FIuKSbZlM3dafHvGB166KFx0UUXxUUXXRRvvfVWHH300XHjjTeWfZCa49FHH43hw4fHwoULy5pcQxve2WuvvdZk7NVXX41hw4ZFRMTw4cMj4m9Xodj5ihv748gjj4yIiFWrVsXYsWOb3F4qlWL06NGN/37yySdj+/btZWuYOHFiPPvss41fVmvw5ptvRkRE//79W7yuiRMnxre//e1Yt25d2fj+HLPBqlWr4oADDoiRI0fu8zFof7JZTjYpArksJ5cUhWyWk82/afapdNu2bWuyJThgwIAYNGhQ4xUtWqKhhf99616yZMlut+F+9KMflb1oS5cujSVLljR+gAcMGBCTJ0+O++67L/74xz82uf+GDRvK/t3cyxtOnDgxDjzwwPjVr36117nvv/9+1NfXx6GHHlq2JThz5syIiPjOd75TNn/BggXRtWvXmDx58l6PvbPTTz89qqqq4rvf/W7ZpRIXLFgQEREnn3xyi4/Z4IUXXojRo0dHnz599vkYtB/ZlE2KRy7lkmKSTdnck2bvGL377rsxZMiQOPPMM2P8+PHRq1evWLx4cfzyl7+M+fPnt3ixp512WixcuDDOOOOMOPXUU2PVqlVx7733xqhRo+K9995rMn/EiBFxwgknxIUXXhibN2+OO+64I2pq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slmuRcXoggsuiHvuuSdmzJgRd999d1x++eVRXV0dK1asKJu3cePGmDp1aowfPz7mz58fRx55ZHzjG9+Ip556qnHOpk2bYsGCBTF58uSYN29ezJkzJzZs2BCnnHJKvPTSS00e+8EHH4w777wzLr744rjqqqti+fLlcdJJJ8X69esb57z88svx0Y9+NFasWBFXXnllzJ8/P3r27BnTp0+Pxx9/vOx4U6ZMiSlTpuz1Ob/wwguxZcuWOProo8vGN2/eHBHR5A3q0aNH4/0aLF68OHr37h3r1q2LI444Inr16hW9e/eOCy+8MD744IO9rmFXFi9eHBERVVVVMWnSpOjZs2f06NEjZs2aFX/+85/36ZgNJk6cGMuXL49Nmzbt13FoP7K5g2xSFHK5g1xSJLK5g2zupCXbS3369EkXX3zxHufU1dWliEgPPvhg49jmzZvTIYcckmbMmNE4tnXr1rR58+ay+27cuDENHDgwnXfeeY1jq1atShGRqqur09q1axvHlyxZkiIiXXrppY1jU6ZMSWPHjk0ffPBB49j27dvT8ccfnw4//PCyx6qtrU21tbV7fc4LFixIEZF+85vflI0/9thjKSLSQw89VDZ+7733pohIY8aMaRwbN25c6tGjR+rRo0eaPXt2euyxx9Ls2bNTRKRZs2btdQ27Mm3atBQRqaamJn3+859Pjz76aKqvr09du3ZNxx9/fNq+ffsu77e3rceUUvrBD36QIiItWbJkn9ZG+5PNHWSTopDLHeSSIpHNHWSzXIuKUW1tbZo0aVJat27dbufU1dWlXr16NXki06ZNSxMmTNjlfbZt25befvvttGHDhnTqqaemo446qvG2hg/S2Wef3eR+xx13XDriiCNSSim9/fbbqVQqpeuvvz5t2LCh7G/u3LkpIso+iM01b968Xd73/fffT7W1tWngwIHpscceS6tXr04PP/xwqqmpSV27dk2HHXZY49zhw4eniEgXXHBB2THOP//8FBHp1VdfbfG6TjrppBQRaerUqWXjN998c4qI9Oyzz+7yfs35ID311FMpItKiRYtavC46hmzuIJsUhVzuIJcUiWzuIJvlWnQq3S233BLLly+PoUOHxrHHHhtz5syJN954o8m8IUOGNLmEXt++fWPjxo1lY9/73vdi3Lhx0b1796ipqYn+/fvHokWL4p133mlyzMMPP7zJ2MiRI2P16tUREfH6669HSinq6+ujf//+ZX/XXnttRES89dZbLXm6ZVJKZf/u3r17LFq0KGpqamLGjBkxbNiwOPfcc+Oaa66Jfv36lV0GsWF78uyzzy47xjnnnBMREc8//3yL17O3Y/785z9v8TEbNDzX3V0GkeKRzR1kk6KQyx3kkiKRzR1ks1yLLtc9c+bMOPHEE+Pxxx+PZ555Jm699daYN29eLFy4MD796U83zuvSpcseFxgR8f3vfz++/OUvx/Tp0+OKK66IAQMGRJcuXeLmm29u1pfIdtbw5a/LL788TjnllF3OGTFiRIuPW1NTExF/O890yJAhZbeNHj06li9fHq+88kps3LgxRo0aFdXV1XHppZdGXV1d47xBgwbFyy+/HAMHDiy7/4ABAxqP3VKDBg2KiGjVYzZouO/BBx+8z8egfcmmbFI8cimXFJNsyubutPh3jA499NC46KKL4qKLLoq33norjj766LjxxhvLPkjN8eijj8bw4cNj4cKFZU2uoQ3v7LXXXmsy9uqrr8awYcMiImL48OER8berUOx8xY39ceSRR0ZExKpVq2Ls2LFNbi+VSjF69OjGfz/55JOxffv2sjVMnDgxnn322cYvqzV48803IyKif//+LV7XxIkT49vf/nasW7eubHx/jtlg1apVccABB8TIkSP3+Ri0P9ksJ5sUgVyWk0uKQjbLyebfNPtUum3btjXZEhwwYEAMGjSo8YoWLdHQwv++dS9ZsmS323A/+tGPyl60pUuXxpIlSxo/wAMGDIjJkyfHfffdF3/84x+b3H/Dhg1l/27u5Q0nTpwYBx54YPzqV7/a69z3338/6uvr49BDDy3bEpw5c2ZERHznO98pm79gwYLo2rVrTJ48ea/H3tnpp58eVVVV8d3vfrfsUokLFiyIiIiTTz65xcds8MILL8To0aOjT58++3wM2o9syibFI5dySTHJpmzuSbN3jN59990YMmRInHnmmTF+/Pjo1atXLF68OH75y1/G/PnzW7zY0047LRYuXBhnnHFGnHrqqbFq1aq49957Y9SoUfHee+81mT9ixIg44YQT4sILL4zNmzfHHXfcETU1NfH1r3+9cc5dd90VJ5xwQowdOza+8pWvxPDhw2P9+vXx/PPPx9q1a2PZsmWNcxsubdhwTufudO/ePT71qU/F4sWL47rrriu7bebMmTFo0KAY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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import matplotlib.pyplot as plt\n", - "plt.figure(figsize=(10,10))\n", - "for i,m in enumerate(masks):\n", - " ax = plt.subplot(4,4,i+1)\n", - " ax.matshow(mask,cmap=plt.cm.Greys)\n", - " plt.axis('off')\n", - " plt.title(f'shape: {m.shape}')\n", - "\n", - "plt.tight_layout()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 89, - "metadata": {}, - "outputs": [], - "source": [ - "from functools import reduce\n", - "def max_common_intersection(mask_list):\n", - " min_x = np.min([m.shape[0] for m in mask_list])\n", - " min_y = np.min([m.shape[1] for m in mask_list])\n", - "\n", - " cropped_masks = []\n", - " for m in masks:\n", - " if m.shape[0]> min_x and m.shape[1]>min_y:\n", - " cropped_masks.append(m[(m.shape[0]-min_x)//2:-(m.shape[0]-min_x)//2,\n", - " (m.shape[1]-min_y)//2:-(m.shape[1]-min_y)//2])\n", - "\n", - " elif m.shape[0] == min_x and m.shape[1]>min_y:\n", - " cropped_masks.append(m[:,(m.shape[1]-min_y)//2:-(m.shape[1]-min_y)//2])\n", - "\n", - " elif m.shape[0]> min_x and m.shape[1]== min_y:\n", - " cropped_masks.append(m[(m.shape[0]-min_x)//2:-(m.shape[0]-min_x)//2,:])\n", - "\n", - " else:\n", - " cropped_masks.append(m)\n", - " \n", - " # performs elementwise logical and\n", - " intersection = reduce(lambda x, y: np.logical_and(x, y), cropped_masks)\n", - "\n", - "\n", - " return intersection" - ] - }, - { - "cell_type": "code", - "execution_count": 90, - "metadata": {}, - "outputs": [], - "source": [ - "cm = max_common_intersection(masks)" - ] - }, - { - "cell_type": "code", - "execution_count": 91, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 91, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plt.matshow(cm)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.9" - }, - "vscode": { - "interpreter": { - "hash": "a004f9109620e037dd6eb32a5065768d5476b766f6a5e98b9519dfa4bc5bb4ce" - } - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/vsdi/pipeline.py b/vsdi/pipeline.py deleted file mode 100644 index a1ad191..0000000 --- a/vsdi/pipeline.py +++ /dev/null @@ -1,166 +0,0 @@ -import loaders -import args - -import glob -import numpy as np -import pandas as pd -from scipy import io -from sklearn.pipeline import Pipeline -from sklearn.decomposition import PCA -from sklearn.preprocessing import StandardScaler -import matplotlib.pyplot as plt - -import vsdi_preprocessing -import vsdi_visualization -import loaders - -#################################### - -##################################### -############### MAIN ################ -##################################### - -# Define paths -path = '/home/danteam/Documents/BScThesis' -data = f'{path}/data' -reports = f'{path}/reports' -figures = f'{reports}/figures' - -# Get arguments from command line -parameters = args.getArgs() -subject = parameters.subject -day = parameters.day -session = parameters.session - -def save_vsdi(): - vsdi1 = io.loadmat(glob.glob(f'{data}/ATC_Data_preprocessed/A0{subject}/Day1/vsdi_ATC{session}.mat')[0])['vsdi_data'] - vsdi3 = io.loadmat(glob.glob(f'{data}/ATC_Data_preprocessed/A0{subject}/Day3/vsdi_ATC{session}.mat')[0])['vsdi_data'] - vsdi5 = io.loadmat(glob.glob(f'{data}/ATC_Data_preprocessed/A0{subject}/Day5/vsdi_ATC{session}.mat')[0])['vsdi_data'] - vsdi7 = io.loadmat(glob.glob(f'{data}/ATC_Data_preprocessed/A0{subject}/Day7/vsdi_ATC{session}.mat')[0])['vsdi_data'] - - vsdi1 = vsdi1[:,:,0:29999] - vsdi3 = vsdi3[:,:,0:29999] - vsdi5 = vsdi5[:,:,0:29999] - vsdi7 = vsdi7[:,:,0:29999] - - vsdi = np.concatenate((vsdi1, vsdi3, vsdi5, vsdi7), axis = 2) - - del(vsdi1) - del(vsdi3) - del(vsdi5) - del(vsdi7) - - # Outliers correction - vsdi_clean = vsdi_preprocessing.clean_outliers(vsdi, nsigma=5) - - # Hemodynamics correction - vsdi_clean = vsdi_preprocessing.clean_hemodynamic_pca(vsdi_clean, bimodal_th = 0.6, verbose = True) - - del(vsdi) - - ## Mask to select just subject cortex - r = np.loadtxt(f'{data}/Patterns/mask_A0{subject}.csv', delimiter=',', dtype='bool') - - X = vsdi_clean.transpose(2, 0, 1) - X = X[:,r] - - del(vsdi_clean) - - pipe = Pipeline([ - ('scaler', StandardScaler()), - ('pca', PCA(n_components=10)) - ]) - - out = pipe.fit(X) - - f = out.named_steps['pca'].components_ - factor_scores = pipe.named_steps['pca'].transform(X) - - np.savetxt(f'{data}/Patterns/SubjectA0{subject}_timecourse_part1.csv', factor_scores, delimiter=",") - np.savetxt(f'{data}/Patterns/SubjectA0{subject}_fingerprint_part1.csv', f, delimiter=",") - - return 0 - -def save_behav(): - atc1 = io.loadmat(f'{data}/ATC_Data_preprocessed/A0{subject}/Day1/ATC{session}.mat') - atc3 = io.loadmat(f'{data}/ATC_Data_preprocessed/A0{subject}/Day3/ATC{session}.mat') - atc5 = io.loadmat(f'{data}/ATC_Data_preprocessed/A0{subject}/Day5/ATC{session}.mat') - atc7 = io.loadmat(f'{data}/ATC_Data_preprocessed/A0{subject}/Day7/ATC{session}.mat') - b_data1 = loaders.extract_behavioural_data(atc1) - b_data3 = loaders.extract_behavioural_data(atc3) - b_data5 = loaders.extract_behavioural_data(atc5) - b_data7 = loaders.extract_behavioural_data(atc7) - - del(atc1) - del(atc3) - del(atc5) - del(atc7) - - d1 = vsdi_preprocessing.design_matrix(b_data1) - d3 = vsdi_preprocessing.design_matrix(b_data3) - d5 = vsdi_preprocessing.design_matrix(b_data5) - d7 = vsdi_preprocessing.design_matrix(b_data7) - - d1 = d1[0:29999,:] - d3 = d3[0:29999,:] - d5 = d5[0:29999,:] - d7 = d7[0:29999,:] - - np.savetxt(f'{data}/Patterns/SubjectA0{subject}_d1_part{session}.csv', d1, delimiter=",") - np.savetxt(f'{data}/Patterns/SubjectA0{subject}_d3_part{session}.csv', d3, delimiter=",") - np.savetxt(f'{data}/Patterns/SubjectA0{subject}_d5_part{session}.csv', d5, delimiter=",") - np.savetxt(f'{data}/Patterns/SubjectA0{subject}_d7_part{session}.csv', d7, delimiter=",") - - return 0 - -def mask_norm(masks, threshold=0.5): - mask_mean = np.mean(masks, axis=0) - mask_mean[mask_mean > threshold] = 1 - mask_mean[mask_mean <= threshold] = 0 - - return mask_mean - -def save_mask(): - r1 = io.loadmat(f'{data}/ATC_Data_preprocessed/A0{subject}/Day1/vsdi_mask.mat')['mask'].astype('bool') - np.savetxt(f'{data}/Patterns/raw_mask_{subject}_day1.csv', r1, delimiter=",") - r3 = io.loadmat(f'{data}/ATC_Data_preprocessed/A0{subject}/Day3/vsdi_mask.mat')['mask'].astype('bool') - np.savetxt(f'{data}/Patterns/raw_mask_{subject}_day3.csv', r3, delimiter=",") - r5 = io.loadmat(f'{data}/ATC_Data_preprocessed/A0{subject}/Day5/vsdi_mask.mat')['mask'].astype('bool') - np.savetxt(f'{data}/Patterns/raw_mask_{subject}_day5.csv', r5, delimiter=",") - r7 = io.loadmat(f'{data}/ATC_Data_preprocessed/A0{subject}/Day7/vsdi_mask.mat')['mask'].astype('bool') - np.savetxt(f'{data}/Patterns/raw_mask_{subject}_day7.csv', r7, delimiter=",") - - del(r1) - del(r3) - del(r5) - del(r7) - - r1 = np.loadtxt(f'{data}/Patterns/raw_mask_{subject}_day1.csv', delimiter=",") - r3 = np.loadtxt(f'{data}/Patterns/raw_mask_{subject}_day3.csv', delimiter=",") - r5 = np.loadtxt(f'{data}/Patterns/raw_mask_{subject}_day5.csv', delimiter=",") - r7 = np.loadtxt(f'{data}/Patterns/raw_mask_{subject}_day7.csv', delimiter=",") - - print(r1.shape, r3.shape, r5.shape, r7.shape) - - masks = np.stack([r1, r3, r5, r7]) - mask_mean = mask_norm(masks) - - np.savetxt(f'/home/danteam/Documents/BScThesis/data/Patterns/mask_A0{subject}.csv', mask_mean.astype(int), fmt='%i', delimiter=",") - - return 0 - - -def main(): - # print(f'Saving Mask A0{subject} part {session}') - # save_mask() - print(f'Saving VSDI subject A0{subject} part {session}') - save_vsdi() - print(f'Saving Design matrices A0{subject} part {session}') - save_behav() - - return 0 - - - -if __name__ == '__main__': - main() \ No newline at end of file diff --git a/vsdi/vsdi.py b/vsdi/vsdi.py index abda7e0..da865b3 100644 --- a/vsdi/vsdi.py +++ b/vsdi/vsdi.py @@ -1,164 +1,200 @@ -########################################################## -######################## PACKAGES ######################## -########################################################## -import matplotlib.pyplot as plt -import numpy as np -from scipy import stats -from scipy.stats import norm -from sklearn.decomposition import PCA -import seaborn as sns -sns.set_theme(context='notebook', - style='white', - font_scale=1.5, - rc = {'axes.spines.top':False,'axes.spines.right':False, - 'image.cmap':plt.cm.jet}) - -########################################################## -####################### VSDI CLASS ####################### -########################################################## - -class VSDI: - def __init__(self, vsdi, raw_mask): - """ - Constructor for VSDI class - """ - self.vsdi = self.correct_outliers(vsdi) - self.raw_mask = raw_mask - self.X = self.vsdi.transpose(2,0,1) # reshape in time x image format - self.T,self.h,self.w = self.X.shape # saves time, height and width for future use - self.X = self.X[:,self.raw_mask] # select only cortex pixels, returns a flattened image +from pathlib import Path +from scipy.io import loadmat +import h5py - def time_course(self, start_time=0, end_time=600, framerate=50): - """ - Plot time course of a single PC - """ - plt.figure(figsize=(10, 5)) - t = np.linspace(start_time, end_time, int((end_time - start_time) * framerate - 1)) - plt.plot(t, self.vsdi) - plt.xlabel('Time (s)') - plt.ylabel('PC activation (a.u.)') - plt.show() - - def create_frame(self, t): - """ - Create a frame of the VSDI data - """ - plt.figure(figsize=(10, 10)) - plt.imshow(self.vsdi[:, :, t], cmap=plt.cm.inferno) +# from loaders import * +# from pipeline_vsdi.preprocessing.utils import * - def pca(self, n_components=50): - """ - Perform PCA on the VSDI data - """ - pca = PCA(n_components=n_components) - pca.fit(self.X) +class DataLoader: + """ + Handling VSDI data full dataset using HDF5 files - return pca - - def pca_projection(self, pca, num_pc): - """ - Plot the projection of the data onto the first 10 PCs - """ - PCs = pca.components_[:num_pc].T - Y = self.X @ PCs # compute the PC timecourse, by projecting the original data on each component - return Y + Parameters + ---------- + filepath : str + Path to the HDF5 file to be loaded. + datapath : str + Path to the directory containing the VSI data files. + """ + def __init__(self, filepath, datapath): + """Initialize the DataLoader.""" + self.filepath = filepath + self.datapath = Path(datapath) - def cumulative_explained_variance(self, pca): + def __enter__(self): """ - Plot cumulative explained variance - """ - evr = pca.explained_variance_ratio_ - c_evr = np.cumsum(evr) - plt.figure(figsize=(6, 6)) - plt.axhline(0.9, linestyle='--', label='90% explained variance') - plt.plot(range(1, len(c_evr) + 1), c_evr) - plt.legend() - plt.xlabel('# of components') - plt.ylabel('EVR') - - def fingerprint(self, pca, num_pc = 10): - """ - Plot topographic organzation of the weights of these ten components - """ - PCs = pca.components_[:num_pc] - plt.figure(figsize=(10, 5)) - for i, pc in enumerate(PCs): - plt.subplot(2, 5, i + 1) - plt.title(f'PC {i + 1}') - reshaped_pc = np.full((self.h, self.w), np.nan) - reshaped_pc[np.where(self.raw_mask)] = pc - plt.imshow(reshaped_pc, aspect='auto', cmap=plt.cm.jet) - plt.axis('off') - - def first_last_subsets(self, arr): - """ - Get first and last frame of each subset + Enter method for the DataLoader context manager. + + Returns + ------- + self : DataLoader + The DataLoader instance. """ - subsets = [] - start = 0 - end = 0 - while end < len(arr): - while end + 1 < len(arr) and arr[end + 1] - arr[start] == end - start + 1: - end += 1 - subsets.append((arr[start], arr[end])) - start = end = end + 1 - return np.array(subsets) - - def correct_outliers(self, vsdi, nsigma=4): + self.file = h5py.File(self.filepath, 'a') + return self + + def __exit__(self, type, value, traceback): """ - Correct outliers in VSDI data + Exit method for the DataLoader context manager. + + Parameters + ---------- + type : type + The type of the exception, if an exception occurred. + value : exception or None + The exception that occurred, if any. + traceback : traceback or None + The traceback object associated with the exception, if any. + """ + self.file.close() + + def load_data(self, animals, days, sessions): """ - # Array with average value of all frames in vsdi - mean_vsdi = np.mean(vsdi, axis=(0,1)) - std_vsdi = vsdi.std() + Load VSI data into the HDF5 file. - # Get index of outliers from vsdi presenting average activity higher than 4 sigma - outliers = np.argwhere((mean_vsdi > nsigma*std_vsdi) | (mean_vsdi < -nsigma*std_vsdi)).ravel() + Parameters + ---------- + animals : list + List of animal names. + days : list + List of day names. + sessions : list + List of session names. + """ + total_animals = len(animals) + total_days = len(days) + total_sessions = len(sessions) - # Get first and last frame of each subset - outliers_subsets = self.first_last_subsets(arr = outliers) - - # Set outlier frames to the mean between the previous and next frame - for i in range(len(outliers_subsets)): - start = outliers_subsets[i][0] - end = outliers_subsets[i][1] - if start == 0: - vsdi[:,:,start:end+1] = np.tile(vsdi[:,:,end+1][:, :, np.newaxis], (1, 1, end - start + 1)) - elif end == len(mean_vsdi)-1: - vsdi[:,:,start:end+1] = np.tile(vsdi[:,:,start-1][:, :, np.newaxis], (1, 1, end - start + 1)) - else: - average = np.divide(np.add(vsdi[:,:,start-1][:, :, np.newaxis], vsdi[:,:,end+1][:, :, np.newaxis]), 2) - vsdi[:,:,start:end+1] = average - return vsdi + for animal in animals: + animal_group = self.file.require_group(animal) - def bimodality_test(self, distribution): - """ - Test for bimodality using moving average to smooth the histogram - and get the x-axis location of the highest point in the histogram + for day in days: + day_group = animal_group.require_group(day) + + # Load mask file for each day + mask = loadmat(self.datapath.joinpath(f'{animal}/{day}/vsdi_mask.mat'))['mask'] + if 'mask' in day_group: + del day_group['mask'] + day_group.create_dataset('mask', data=mask) + + for session in sessions: + session_group = day_group.require_group(session) + + # Load matlab behavioural file + atc = loadmat(self.datapath.joinpath(f'{animal}/{day}/{session}.mat')) + + # Extract dictionary + b_data = loaders.extract_behavioural_data(atc) + # Create ndarray design matrix + X_matrix = make_design_matrix(b_data, event_sequences) + + if 'behavioral' in session_group: + del session_group['behavioral'] + session_group.create_dataset('behavioral', data=X_matrix) + + # Load VSDI + vsdi = loadmat(self.datapath.joinpath(f'{animal}/{day}/vsdi_{session}.mat'))['vsdi_data'] + + if 'vsdi' in session_group: + del session_group['vsdi'] + session_group.create_dataset('vsdi', data=vsdi) + + # Extract LFP data + lfp = loaders.extract_lfp_data(atc) + + if 'lfp' in session_group: + del session_group['lfp'] + session_group.create_dataset('lfp', data=lfp) + + def clean_vsdi(self, animal=None, day=None, session=None, nsigma=3): """ - # Create a histogram - n, bins, patches = plt.hist(distribution, bins=1000) - # Define the window size for the moving average - window_size = 5 - # Create the moving average kernel - kernel = np.ones(window_size) / window_size - # Convolve the histogram data with the moving average kernel - smoothed = np.convolve(n, kernel, mode='same') - bins_adjusted = bins[:-1] - - # Find the x-axis location of the highest point in the histogram - x_max = bins_adjusted[np.argmax(smoothed)] + Clean VSDI data by removing outliers. + + Parameters + ---------- + animal : str, optional + Animal name. + day : str, optional + Day name. + session : str, optional + Session name. + nsigma : int, optional + Number of standard deviations for outlier removal. + """ + def clean(vsdi, mask): + # Normalize vsdi + vsdi_norm = normalize_vsdi(vsdi, mask) + # Clean outliers + vsdi_clean = clean_outliers(vsdi_norm, nsigma) + # Clean outliers by mean interpolation + return vsdi_clean + + def apply_clean(group, mask): + if isinstance(group, h5py.Dataset): + # Assuming 'vsdi', 'animal', 'day', 'session' are keys, not attributes + if group.name.split('/')[-1] == 'vsdi': + vsdi_data = group[...] + vsdi_data_cleaned = clean(vsdi_data, mask) + # Create a new dataset for cleaned VSDI data + if 'vsdi_clean' in group.parent: + del group.parent['vsdi_clean'] + group.parent.create_dataset('vsdi_clean', data=vsdi_data_cleaned) + else: + for key in group: + apply_clean(group[key], mask) - return x_max - - def bimodal_components(self, Y, threshold=1): + if animal is not None and day is not None and session is not None: + mask = self.file[f"{animal}/{day}"]['mask'][...] + group = self.file[f"{animal}/{day}/{session}"] + apply_clean(group, mask) + elif animal is not None and day is not None: + mask = self.file[f"{animal}/{day}"]['mask'][...] + group = self.file[f"{animal}/{day}"] + apply_clean(group, mask) + elif animal is not None: + for day in self.file[animal].keys(): + mask = self.file[f"{animal}/{day}"]['mask'][...] + group = self.file[animal][day] + apply_clean(group, mask) + else: + for animal in self.file.keys(): + for day in self.file[animal].keys(): + mask = self.file[f"{animal}/{day}"]['mask'][...] + group = self.file[animal][day] + apply_clean(group, mask) + + def get_data(self, animal=None, day=None, session=None, type=None): """ - Get bimodal components + Get data from the HDF5 file. + + Parameters + ---------- + animal : str, optional + Animal name. + day : str or list, optional + Day name or list of day names. + session : str, optional + Session name. + type : str, optional + Type of data. + + Returns + ------- + result : list + List of tuples containing the group name and data array. """ - bimodal_components = [] - for i in range(Y.shape[1]): - x_max = self.bimodality_test(Y[:,i]) - if abs(x_max) > threshold: - bimodal_components.append([i, x_max]) + days = [day] if isinstance(day, str) else day + + def search(group): + result = [] + for key in group: + if isinstance(group[key], h5py.Group): + result.extend(search(group[key])) + elif ((animal is None or group.name.split('/')[1] == animal) and + (days is None or group.name.split('/')[2] in days) and + (session is None or group.name.split('/')[3] == session) and + (type is None or key == type)): + result.append((group.name.split('/')[1:], group[key][...])) + return result - return bimodal_components \ No newline at end of file + return search(self.file) diff --git a/vsdi/vsdi_preprocessing.py b/vsdi/vsdi_preprocessing.py deleted file mode 100644 index 10a6ddc..0000000 --- a/vsdi/vsdi_preprocessing.py +++ /dev/null @@ -1,383 +0,0 @@ -########################################################## -######################## PACKAGES ######################## -########################################################## -import numpy as np -from sklearn.decomposition import PCA, FastICA -from sklearn.preprocessing import StandardScaler -from sklearn.pipeline import Pipeline -import scipy.stats as stats -import statsmodels.api as sm - - -########################################################## - -def peak_distance(component, smooth_window_size, hist_nbins): - # Create a histogram - n, bins = np.histogram(component, bins=hist_nbins) - # Define the window size for the moving average - window_size = smooth_window_size - # Create the moving average kernel - kernel = np.ones(window_size) / window_size - # Convolve the histogram data with the moving average kernel - smoothed = np.convolve(n, kernel, mode='same') - bins_adjusted = bins[:-1] - # Find the x-axis location of the highest point in the histogram - x_max = bins_adjusted[np.argmax(smoothed)] - - return x_max - - -def check_bimodal(components, th=1.0, smooth_window_size=5, hist_nbins=1000): - """ - Test for bimodality using moving average to smooth the histogram - and get the x-axis location of the highest point in the histogram - - Parameters - ---------- - components : numpy ndarray (components, time) - Timecourse of a single component - threshold : float - Threshold for bimodal distribution identification (distance from peak to zero) - - Returns - ------- - bimodal_components : list - List of components that are bimodal (1 if bimodal, 0 if not) - """ - # Initialize bimodal_components list - bimodal_components = np.zeros(components.shape[0]) - for i in range(components.shape[0]): - # Get peak distance - x_max = peak_distance(components[i], smooth_window_size, hist_nbins) - # Check if peak distance is above threshold - if abs(x_max) > th: - bimodal_components[i] = 1 - - return bimodal_components - - -def clean_hemodynamic_pca(vsdi, n_components=50, bimodal_th=1, - smooth_window=5, hist_nbins=1000, verbose=False): - """ - Clean hemodynamic noise from vsdi data - - Parameters - ---------- - vsdi : numpy array - vsdi data in format (time, pixels_y, pixels_X) - n_components : int - Number of components to keep after PCA - bimodal_th : float - Threshold for bimodal distribution identification - smooth_window : int - Window size for smoothing the histogram of timecourse distribution - hist_nbins : int - Number of bins for histogram of timecourse distribution - - Returns - ------- - clean_vsdi : numpy array in the same format as vsdi input - vsdi data with hemodynamic noise removed - """ - # reshape vsdi data to (time, pixels) - vsdi = vsdi.transpose(2, 0, 1) - # store original shape - vsdi_shape = vsdi.shape - # flatten 2d pixels to array - vsdi = vsdi.reshape(vsdi.shape[0], vsdi.shape[1]*vsdi.shape[2]) - - # put out-of-mask values to zero - - # run PCA - pca = PCA(n_components=n_components) - # fit PCA to vsdi data and project it to the new space - timecourses = pca.fit_transform(vsdi) - - # get bimodal components indexes - bad_components = check_bimodal(timecourses.T, th=bimodal_th, - smooth_window_size=smooth_window, - hist_nbins=hist_nbins) - - if verbose: - with open('log.txt', 'a') as f: - # Print explained variance ratio - f.write( - f'{sum(pca.explained_variance_ratio_[np.where(bad_components)]):.4f} ') - # Print number of components - f.write(f'{sum(bad_components):.0f}\n') - - # get clean timecourses and components - good_timecourses = timecourses[:, np.logical_not(bad_components)] - good_components = pca.components_[np.logical_not(bad_components)] - - # reconstruct vsdi data - clean_vsdi = good_timecourses @ good_components - clean_vsdi = clean_vsdi.reshape( - vsdi_shape[0], vsdi_shape[1], vsdi_shape[2]) - clean_vsdi = clean_vsdi.transpose(1, 2, 0) - - return clean_vsdi - - -def clean_hemodynamics(vsdi, n_components=50, bimodal_th=0.8, ica_max_iter=200, - smooth_window=5, hist_nbins=1000, verbose=False): - """ - Clean hemodynamic noise from vsdi data - - Parameters - ---------- - vsdi : numpy array - vsdi data in format (time, pixels_y, pixels_X) - n_components : int - Number of components to keep after PCA - bimodal_th : float - Threshold for bimodal distribution identification - smooth_window : int - Window size for smoothing the histogram of timecourse distribution - hist_nbins : int - Number of bins for histogram of timecourse distribution - - Returns - ------- - clean_vsdi : numpy array in the same format as vsdi input - vsdi data with hemodynamic noise removed - """ - # reshape vsdi data to (time, pixels) - X = vsdi.transpose(2, 0, 1) - # store original shape - vsdi_shape = vsdi.shape - # flatten 2d pixels to array - X = X.reshape(vsdi.shape[0], vsdi.shape[1]*vsdi.shape[2]) - - # Create a pipeline with PCA and ICA - pipe = Pipeline([ - ('pca', PCA(n_components=n_components)), - ('ica', FastICA(n_components=n_components, max_iter=ica_max_iter, - random_state=88, whiten='unit-variance')) - ]) - - # Fit the pipeline to vsdi data - timecourses = pipe.fit_transform(X) - - # get bimodal components indexes - bad_components = check_bimodal(timecourses.T, th=bimodal_th, - smooth_window_size=smooth_window, - hist_nbins=hist_nbins) - - if verbose: - with open('log.txt', 'a') as f: - # Print number of components - f.write(f'{sum(bad_components):.0f}\n') - - # get clean timecourses and components - good_timecourses = timecourses[:, np.logical_not(bad_components)] - good_components = pipe.named_steps['ica'].components_[ - np.logical_not(bad_components)] - - # reconstruct vsdi data - clean_vsdi = good_components @ pipe.named_steps['pca'].components_ - clean_vsdi = good_timecourses @ clean_vsdi - clean_vsdi = clean_vsdi.reshape( - vsdi_shape[0], vsdi_shape[1], vsdi_shape[2]) - - return clean_vsdi - - -def find_outliers_old(vsdi, mean_vsdi, std_vsdi, nsigma=4): - # Get index of outliers from vsdi presenting average activity higher than 4 sigma - outliers = np.argwhere((mean_vsdi > nsigma*std_vsdi) - | (mean_vsdi < -nsigma*std_vsdi)).ravel() - - subsets = [] - start = 0 - end = 0 - - # Iterate over array - while end < len(outliers): - # Get first and last frame of each subset - while end + 1 < len(outliers) and outliers[end + 1] - outliers[start] == end - start + 1: - end += 1 - # Save first and last frame of each outlier subset - subsets.append((outliers[start], outliers[end])) - start = end = end + 1 - - return np.array(subsets) - - -def find_outliers(vsdi, nsigma=6): - mean_vsdi = np.mean(vsdi, axis=(0, 1)) - # How many standard deviations away a value is from the mean - zscore = stats.zscore(mean_vsdi, axis=0, ddof=0, nan_policy='propagate') - # Get index of outliers from vsdi presenting average activity higher than 4 sigma - outliers = np.argwhere((zscore > nsigma) | (zscore < -nsigma)).ravel() - - subsets = [] - start = 0 - end = 0 - - # Iterate over array - while end < len(outliers): - # Get first and last frame of each subset - while end + 1 < len(outliers) and outliers[end + 1] - outliers[start] == end - start + 1: - end += 1 - # Save first and last frame of each outlier subset - subsets.append((outliers[start], outliers[end])) - start = end = end + 1 - - return np.array(subsets) - - -def clean_outliers(vsdi, nsigma=6): - """ - Correct outliers in VSDI data - - Parameters - ---------- - vsdi : numpy ndarray - vsdi data in format (h, w, time) - nsigma : float - Number of standard deviations to consider an outlier - - Returns - ------- - vsdi : numpy ndarray - vsdi data with outliers corrected - """ - vsdi = vsdi.copy() - # Get first and last frame of each subset - outliers_subsets = find_outliers(vsdi, nsigma) - - # Set outlier frames to the mean between the previous and next frame - for i in range(len(outliers_subsets)): - start = outliers_subsets[i][0] - end = outliers_subsets[i][1] - if start == 0: - vsdi[:, :, start:end+1] = np.tile(vsdi[:, :, end+1] - [:, :, np.newaxis], (1, 1, end - start + 1)) - elif end == vsdi.shape[2]-1: - vsdi[:, :, start:end+1] = np.tile(vsdi[:, :, start-1] - [:, :, np.newaxis], (1, 1, end - start + 1)) - else: - average = np.divide(np.add( - vsdi[:, :, (start-1)][:, :, np.newaxis], vsdi[:, :, (end+1)][:, :, np.newaxis]), 2) - vsdi[:, :, start:end+1] = average - return vsdi - - -def design_matrix(b_data): - # Design matrix - # Returns a matrix of size (time, 6) with the following columns: - # 0: CS+ (2s) - # 1: CS+ trace (1s) - # 2: CS- (2s) - # 3: CS- trace (1s) - # 4: Reward (1s) - # 5: Lick - - fps = 50 - - Lick = b_data['Lick'] - CSp = b_data['CSp'] - CSn = b_data['CSn'] - frames = b_data['frames'] - - length = len(frames) - X = np.zeros((length, 6)) - - # Iterate over lick events - for i in range(len(Lick)): - frame = np.argmin(np.abs(frames - Lick[i])) - X[frame:frame+4, 5] = 1 - - # Iterate over CSp events - for i in range(len(CSp)): - frame = np.argmin(np.abs(frames - CSp[i])) - X[frame:frame + (fps * 2), 0] = 1 - frame += (fps * 2) + 1 - X[frame:frame + (fps * 1), 1] = 1 - frame += (fps * 1) + 1 - X[frame:frame + (fps * 1), 4] = 1 - - # Iterate over CSn events - for i in range(len(CSn)): - frame = np.argmin(np.abs(frames - CSn[i])) - X[frame:frame + (fps * 2), 2] = 1 - frame += (fps * 2) + 1 - X[frame:frame + (fps * 1), 3] = 1 - - return X - - -def pca(vsdi, raw_mask=None, n_comp=10, normalize=True): - # reshape vsdi data to (time, pixels) - X = vsdi.transpose(2, 0, 1) - # store original shape - # vsdi_shape = vsdi.shape - if raw_mask is not None: - # put out-of-mask values to zero - X = X[:, raw_mask] - else: - # flatten 2d pixels to array - X = X.reshape(vsdi.shape[0], vsdi.shape[1]*vsdi.shape[2]) - - # Create a pipeline with PCA - pipe = Pipeline([ - ('scaler', StandardScaler()), - ('pca', PCA(n_components=10)) - ]) - - # Fit the pipeline to vsdi data - out = pipe.fit(X) - fingerprints = out.named_steps['pca'].components_ - timecourses = fingerprints @ X.T - - return fingerprints, timecourses - - -def pca_ica(vsdi, raw_mask, n_comp=50, ica_max_iter=200): - # reshape vsdi data to (time, pixels) - X = vsdi.transpose(2, 0, 1) - # store original shape - # vsdi_shape = vsdi.shape - if raw_mask is not None: - # put out-of-mask values to zero - X = X[:, raw_mask] - else: - # flatten 2d pixels to array - X = X.reshape(vsdi.shape[0], vsdi.shape[1]*vsdi.shape[2]) - - # Create a pipeline with PCA and ICA - pipe = Pipeline([ - ('scaler', StandardScaler()), - ('pca', PCA(n_components=n_comp)), - ('ica', FastICA(n_components=n_comp, max_iter=ica_max_iter, - random_state=1, whiten='unit-variance')) - ]) - - out = pipe.fit(X) - fingerprints = out.named_steps["ica"].components_ @ out.named_steps["pca"].components_ - timecourses = fingerprints @ X.T - - return fingerprints, timecourses - - -def glm(Y, X): - # Fit Gaussian GLMs - X = sm.add_constant(X) - model = sm.GLM(Y, X, family=sm.families.Gaussian()) - results = model.fit() - - return results - - -def merge_masks(masks, threshold=0.5): - """ - Merge masks by voting majority / logical OR - - Input: masks (n_masks, h, w) - Output: mask_mean (h, w) - """ - mask_mean = np.mean(masks, axis=0) - mask_mean[mask_mean > threshold] = 1 - mask_mean[mask_mean <= threshold] = 0 - return mask_mean diff --git a/vsdi/vsdi_visualization.py b/vsdi/vsdi_visualization.py deleted file mode 100644 index 961686d..0000000 --- a/vsdi/vsdi_visualization.py +++ /dev/null @@ -1,170 +0,0 @@ -########################################################## -######################## PACKAGES ######################## -########################################################## -import matplotlib.pyplot as plt -import numpy as np -import seaborn as sns -from scipy.stats import sem -from scipy.ndimage import gaussian_filter1d -sns.set_theme(context='notebook', - style='white', - font_scale=1.5, - rc = {'axes.spines.top':False,'axes.spines.right':False, - 'image.cmap':plt.cm.jet}) - -########################################################## - -def plot_timecourse_histograms(timecourses, nbins_rule = 'freedman-diaconis'): - """ - Plot the histogram of the timecourses of the first 10 PCs - - Parameters - ---------- - timecourses : numpy.ndarray (n_timepoints, n_components) - Timecourses of the first 10 PCs - num_bins : int - Number of bins for the histogram - """ - plt.figure(figsize=(15, 25)) - - for i, tc in enumerate(timecourses.T): - # Freedman-Diaconis rulex - if nbins_rule == 'freedman-diaconis': - iqr = np.quantile(tc, 0.75) - np.quantile(tc, 0.25) - bin_width = (2 * iqr) / (len(tc) ** (1 / 3)) - nbins = int(np.ceil((tc.max() - tc.min()) / bin_width)) - - # Plot histogram - plt.subplot(5, 2, i+1) - plt.title(f'PC {i+1}') - plt.hist(tc, bins=nbins) - plt.xlim(-2*np.std(tc), 2*np.std(tc)) - -def plot_timecourses(timecourses): - """ - Plot the timecourses of the first 10 PCs - - Parameters - ---------- - timecourses : numpy.ndarray (n_timepoints, n_components) - Timecourses of the first 10 PCs - """ - start_time = 0 - end_time = 600 - # framerate = 50 - t = np.linspace(start_time,end_time,timecourses.shape[0]) - - plt.figure(figsize=(15, 25)) - for i, tc in enumerate(timecourses.T): - plt.subplot(5, 2, i+1) - plt.plot(t, tc) - plt.title(f'PC {i+1}') - -def plot_fingerprints(PCs, raw_mask): - """ - Plot the topographic organization of the weights of the first 10 PCs - - Parameters - ---------- - PCs : numpy ndarray - PCs matrix (n_components, n_pixels) - raw_mask : ndarray - Mask of the brain cortex - """ - plt.figure(figsize=(10,5)) - for i, pc in enumerate(PCs): - plt.subplot(2,5,i+1) - plt.title(f'PC {i+1}') - reshaped_pc = np.full((raw_mask.shape[0], raw_mask.shape[1]), np.nan) - reshaped_pc[np.where(raw_mask)] = pc - plt.imshow(reshaped_pc, aspect='auto', cmap=plt.cm.jet) - plt.axis('off') - -def create_frame(vsdi, t): - # VSDI - Should be already masked - plt.imshow(vsdi[:,:,t], cmap=plt.cm.jet) - plt.axis('off') - -def fingerprint_gif(vsdi, to, tf, step): - plt.figure(figsize=(20,15)) - for i, t in enumerate(range(to, tf, step)): - plt.subplot(1, step, i+1) - create_frame(vsdi, t) - -def plot_betas(results): - # Get the beta coefficients and their names - coefficients = results.params - names = ['Intercept'] + ["CS+ Onset", "CS+", "CS- Onset", "CS-", "Reward", "Lick"] - colors = ['#3C3C3C', '#1E70AA', '#8BBEE2', '#C11910', '#FFB3AF', 'green','#832F95'] - - # Plot the beta coefficients - plt.figure(figsize=(2, 3)) - plt.rc('xtick',labelsize=9) - plt.rc('ytick',labelsize=9) - plt.bar(names, coefficients, color=colors) - plt.xticks(ticks=range(len(names)), labels=names, rotation=-90) - # plt.show() - -def convert_pvalue_to_asterisks(pvalue): - if pvalue <= 0.0001: - return "****" - elif pvalue <= 0.001: - return "***" - elif pvalue <= 0.01: - return "**" - elif pvalue <= 0.05: - return "*" - return "" - -def timecourse_around(t, d, to, tf, feature, comp): - """ - Plot the timecourse of a given feature around a given timepoint - - Parameters - ---------- - t : numpy.ndarray (n_components, n_timepoints) - Timecourses of the first 10 PCs - d : numpy.ndarray (n_timepoints, n_features) - Design matrix - to : int - Start timepoint of interest - tf : int - Final timepoint - feature : int - Feature of interest in the following order: - ["CS+ Onset", "CS+", "CS- Onset", "CS-", "Reward", "Lick"] - comp : int - Principal component to plot - """ - - names = ["CS+", "CS+ Onset", "CS-", "CS- Onset", "Reward", "Lick"] - colors = ['#1E70AA', '#8BBEE2', '#C11910', '#FFB3AF', 'green', '#832F95'] - frame_rate = 50 - start_time = to - end_time = tf - peri_Y = [] # empty list for peri-lick timecourses - - for i, j in enumerate(d[:,feature]): - try: - if (j == 1) and d[(i-1),feature] == 0: - peri_Y.append(t[:,(i+(frame_rate*start_time)):(i+(frame_rate*end_time))]) # saves the slice of Y - except: - pass - - peri_Y = np.asarray(peri_Y) - mean_Y = np.mean(peri_Y, axis=0) # average over licks - error = sem(peri_Y, axis=0) # compute sem over licks - - y = mean_Y[comp-1,:] - err = error[comp-1,:] - - y = gaussian_filter1d(y,2) - err = gaussian_filter1d(err,2) - - t = np.linspace(start_time, end_time, int((end_time-start_time)*frame_rate)) - - plt.plot(t, y, color = colors[feature]) - plt.fill_between(t, y-err, y+err, alpha=0.2, color=colors[feature], cmap="Blues") - plt.xticks(np.arange(start_time, end_time+1, 1.0)) - plt.axvline(x=0,linestyle='--', color = "black", label=f'{names[feature]}') - plt.legend(prop={'size': 6}) From 07c8b4b1f459e8ad5941020808e9eebdc9fcd6c6 Mon Sep 17 00:00:00 2001 From: dabadav Date: Tue, 13 Jun 2023 15:48:45 +0200 Subject: [PATCH 08/67] Changed README --- preprocessing/utils.py | 1 - 1 file changed, 1 deletion(-) diff --git a/preprocessing/utils.py b/preprocessing/utils.py index 42a6fe0..d925933 100644 --- a/preprocessing/utils.py +++ b/preprocessing/utils.py @@ -10,7 +10,6 @@ # Data management import numpy as np -import pandas as pd from scipy.stats import sem from scipy.ndimage import gaussian_filter1d import statsmodels.api as sm From f6cfa9b1e743e7a564cafc2d4732c40ed8787d38 Mon Sep 17 00:00:00 2001 From: dabadav Date: Tue, 13 Jun 2023 15:49:34 +0200 Subject: [PATCH 09/67] Changed README --- README.md | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/README.md b/README.md index 22733d1..8a95ec0 100644 --- a/README.md +++ b/README.md @@ -10,3 +10,59 @@ Preprocessing tools for voltage sensitive dye imaging data - vsdi will contain classes for handling sessions and full datasets - preprocessing contains functionality to clean and reshape data - dim_reduction contains functionality to reduce the dimensionality of the data with different models + +# Pipeline VSDI + +This repository provides preprocessing tools for Voltage Sensitive Dye Imaging (VSDI) data. The project structure includes modules for handling sessions, full datasets, preprocessing of data, and dimensionality reduction. + +## Structure + +- **vsdi** - Contains classes for handling sessions and full datasets. +- **preprocessing** - Contains functionality to clean and reshape data. +- **dim_reduction** - Contains functionality to reduce the dimensionality of the data with different models. + +## Installation + +### Prerequisites + +- Python 3.7 or higher +- [Poetry](https://python-poetry.org/docs/#installation) Python packaging and dependency management tool. + +### Steps + +#### 1. Clone the repository + +```bash +git clone https://github.com//pipeline-vsdi.git +cd pipeline-vsdi +``` + +Replace `` with your GitHub username or the username of the repository owner. + +#### 2. Install the package using Poetry + +Ensure you're in the `pipeline-vsdi` directory (or the directory where you cloned your repository) and run: + +```bash +poetry install +``` + +This command installs all the dependencies specified in the `pyproject.toml` file in a new virtual environment. If you want to use the virtual environment for other tasks, you can activate it using: + +```bash +poetry shell +``` + +After this, you should have all the necessary dependencies installed and be able to use the functionality provided by the Pipeline VSDI. + +## Usage + +After installation, you can import and use the tools in the Python interpreter or your scripts like: + +```python +from vsdi import Session +from preprocessing import clean_data +from dim_reduction import reduce_dimension + +# Use the tools as per your requirement. +``` \ No newline at end of file From 0099f0bc21793c461d677214965673c2c354d377 Mon Sep 17 00:00:00 2001 From: dabadav Date: Tue, 13 Jun 2023 15:50:02 +0200 Subject: [PATCH 10/67] Changed README --- README.md | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/README.md b/README.md index 8a95ec0..3d22b61 100644 --- a/README.md +++ b/README.md @@ -7,16 +7,6 @@ Preprocessing tools for voltage sensitive dye imaging data ## Structure -- vsdi will contain classes for handling sessions and full datasets -- preprocessing contains functionality to clean and reshape data -- dim_reduction contains functionality to reduce the dimensionality of the data with different models - -# Pipeline VSDI - -This repository provides preprocessing tools for Voltage Sensitive Dye Imaging (VSDI) data. The project structure includes modules for handling sessions, full datasets, preprocessing of data, and dimensionality reduction. - -## Structure - - **vsdi** - Contains classes for handling sessions and full datasets. - **preprocessing** - Contains functionality to clean and reshape data. - **dim_reduction** - Contains functionality to reduce the dimensionality of the data with different models. From 098a66ad7333e826d8d6391749ab5b0c7355a07d Mon Sep 17 00:00:00 2001 From: dabadav Date: Tue, 13 Jun 2023 16:31:55 +0200 Subject: [PATCH 11/67] Changed README --- docs/dim_reduction.rst | 14 ++---------- docs/index.rst | 7 ++---- docs/modules.rst | 4 ++-- docs/preprocessing.rst | 15 ++---------- docs/visualization.rst | 7 ++---- docs/vsdi.rst | 22 +++++------------- vsdi/vsdi.py | 52 +++++++++++++++++++++--------------------- 7 files changed, 42 insertions(+), 79 deletions(-) diff --git a/docs/dim_reduction.rst b/docs/dim_reduction.rst index 6555989..ff1691b 100644 --- a/docs/dim_reduction.rst +++ b/docs/dim_reduction.rst @@ -1,8 +1,5 @@ -dim\_reduction package -====================== - -Submodules ----------- +Dimensionality Reduction +======================== dim\_reduction.VAE module ------------------------- @@ -12,10 +9,3 @@ dim\_reduction.VAE module :undoc-members: :show-inheritance: -Module contents ---------------- - -.. automodule:: dim_reduction - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/index.rst b/docs/index.rst index 4bc48b9..fec4ebe 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -6,14 +6,11 @@ VSDI Pipeline ========================================= +Preprocessing tools for voltage sensitive dye imaging data + .. toctree:: :maxdepth: 2 :caption: Contents: modules -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` diff --git a/docs/modules.rst b/docs/modules.rst index 1346b77..6dcf6d2 100644 --- a/docs/modules.rst +++ b/docs/modules.rst @@ -1,5 +1,5 @@ -pipeline_vsdi -============= +Pipeline Modules +================ .. toctree:: :maxdepth: 4 diff --git a/docs/preprocessing.rst b/docs/preprocessing.rst index 9b547f6..2c27bb6 100644 --- a/docs/preprocessing.rst +++ b/docs/preprocessing.rst @@ -1,8 +1,5 @@ -preprocessing package -===================== - -Submodules ----------- +Preprocessing Tools +=================== preprocessing.clustering module ------------------------------- @@ -27,11 +24,3 @@ preprocessing.vsdi\_preprocessing module :members: :undoc-members: :show-inheritance: - -Module contents ---------------- - -.. automodule:: preprocessing - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/visualization.rst b/docs/visualization.rst index 4d6af51..e0bb26c 100644 --- a/docs/visualization.rst +++ b/docs/visualization.rst @@ -1,8 +1,5 @@ -visualization package -===================== - -Submodules ----------- +Visualization Tools +=================== visualization.vsdi\_visualization module ---------------------------------------- diff --git a/docs/vsdi.rst b/docs/vsdi.rst index 9b9fb28..effe1c3 100644 --- a/docs/vsdi.rst +++ b/docs/vsdi.rst @@ -1,16 +1,5 @@ -vsdi package -============ - -Submodules ----------- - -vsdi.loaders module -------------------- - -.. automodule:: vsdi.loaders - :members: - :undoc-members: - :show-inheritance: +Data Handling +============= vsdi.vsdi module ---------------- @@ -20,10 +9,11 @@ vsdi.vsdi module :undoc-members: :show-inheritance: -Module contents ---------------- +vsdi.loaders module +------------------- -.. automodule:: vsdi +.. automodule:: vsdi.loaders :members: :undoc-members: :show-inheritance: + diff --git a/vsdi/vsdi.py b/vsdi/vsdi.py index da865b3..6478e51 100644 --- a/vsdi/vsdi.py +++ b/vsdi/vsdi.py @@ -1,4 +1,22 @@ -from pathlib import Path +""" +This module provides a `DataLoader` class for handling VSDI (Voltage-Sensitive Dye Imaging) data stored in HDF5 files. + +Dependencies +------------ +- numpy +- scipy +- h5py +- loaders (imported but not defined within this file) +- pipeline_vsdi.preprocessing.utils (imported but not defined within this file) + +Usage +----- +1. Create a `DataLoader` instance by providing the path to the HDF5 file and the directory containing the VSI data files. +2. Use the `load_data` method to load VSI data into the HDF5 file. +3. Use the `clean_vsdi` method to clean VSDI data by removing outliers. +4. Use the `get_data` method to retrieve data from the HDF5 file. +""" + from scipy.io import loadmat import h5py @@ -13,13 +31,10 @@ class DataLoader: ---------- filepath : str Path to the HDF5 file to be loaded. - datapath : str - Path to the directory containing the VSI data files. """ - def __init__(self, filepath, datapath): + def __init__(self, filepath): """Initialize the DataLoader.""" self.filepath = filepath - self.datapath = Path(datapath) def __enter__(self): """ @@ -34,21 +49,10 @@ def __enter__(self): return self def __exit__(self, type, value, traceback): - """ - Exit method for the DataLoader context manager. - - Parameters - ---------- - type : type - The type of the exception, if an exception occurred. - value : exception or None - The exception that occurred, if any. - traceback : traceback or None - The traceback object associated with the exception, if any. - """ + """Exit method for the DataLoader context manager.""" self.file.close() - def load_data(self, animals, days, sessions): + def load_data(self, datapath, animals, days, sessions): """ Load VSI data into the HDF5 file. @@ -60,11 +64,7 @@ def load_data(self, animals, days, sessions): List of day names. sessions : list List of session names. - """ - total_animals = len(animals) - total_days = len(days) - total_sessions = len(sessions) - + """ for animal in animals: animal_group = self.file.require_group(animal) @@ -72,7 +72,7 @@ def load_data(self, animals, days, sessions): day_group = animal_group.require_group(day) # Load mask file for each day - mask = loadmat(self.datapath.joinpath(f'{animal}/{day}/vsdi_mask.mat'))['mask'] + mask = loadmat(datapath.joinpath(f'{animal}/{day}/vsdi_mask.mat'))['mask'] if 'mask' in day_group: del day_group['mask'] day_group.create_dataset('mask', data=mask) @@ -81,7 +81,7 @@ def load_data(self, animals, days, sessions): session_group = day_group.require_group(session) # Load matlab behavioural file - atc = loadmat(self.datapath.joinpath(f'{animal}/{day}/{session}.mat')) + atc = loadmat(datapath.joinpath(f'{animal}/{day}/{session}.mat')) # Extract dictionary b_data = loaders.extract_behavioural_data(atc) @@ -93,7 +93,7 @@ def load_data(self, animals, days, sessions): session_group.create_dataset('behavioral', data=X_matrix) # Load VSDI - vsdi = loadmat(self.datapath.joinpath(f'{animal}/{day}/vsdi_{session}.mat'))['vsdi_data'] + vsdi = loadmat(datapath.joinpath(f'{animal}/{day}/vsdi_{session}.mat'))['vsdi_data'] if 'vsdi' in session_group: del session_group['vsdi'] From 9807e6ab1b3432bff36cf38c866ca6c4b27f8428 Mon Sep 17 00:00:00 2001 From: dabadav Date: Tue, 13 Jun 2023 16:32:47 +0200 Subject: [PATCH 12/67] Changed README --- README.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 3d22b61..f05efc4 100644 --- a/README.md +++ b/README.md @@ -23,15 +23,13 @@ Preprocessing tools for voltage sensitive dye imaging data #### 1. Clone the repository ```bash -git clone https://github.com//pipeline-vsdi.git -cd pipeline-vsdi +git clone https://github.com/dabadav/pipeline_vsdi.git +cd pipeline_vsdi ``` -Replace `` with your GitHub username or the username of the repository owner. - #### 2. Install the package using Poetry -Ensure you're in the `pipeline-vsdi` directory (or the directory where you cloned your repository) and run: +Ensure you're in the `pipeline_vsdi` directory (or the directory where you cloned your repository) and run: ```bash poetry install From 9d027bd096851476d444ad293dc3148c31ddc122 Mon Sep 17 00:00:00 2001 From: dabadav Date: Tue, 13 Jun 2023 16:45:16 +0200 Subject: [PATCH 13/67] Changed README --- poetry.lock | 145 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 poetry.lock diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..1381b74 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,145 @@ +# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. + +[[package]] +name = "joblib" +version = "1.2.0" +description = "Lightweight pipelining with Python functions" +optional = false +python-versions = ">=3.7" +files = [ + {file = "joblib-1.2.0-py3-none-any.whl", hash = "sha256:091138ed78f800342968c523bdde947e7a305b8594b910a0fea2ab83c3c6d385"}, + {file = "joblib-1.2.0.tar.gz", hash = "sha256:e1cee4a79e4af22881164f218d4311f60074197fb707e082e803b61f6d137018"}, +] + +[[package]] +name = "numpy" +version = "1.24.3" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "numpy-1.24.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3c1104d3c036fb81ab923f507536daedc718d0ad5a8707c6061cdfd6d184e570"}, + {file = "numpy-1.24.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:202de8f38fc4a45a3eea4b63e2f376e5f2dc64ef0fa692838e31a808520efaf7"}, + {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8535303847b89aa6b0f00aa1dc62867b5a32923e4d1681a35b5eef2d9591a463"}, + {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d926b52ba1367f9acb76b0df6ed21f0b16a1ad87c6720a1121674e5cf63e2b6"}, + {file = "numpy-1.24.3-cp310-cp310-win32.whl", hash = "sha256:f21c442fdd2805e91799fbe044a7b999b8571bb0ab0f7850d0cb9641a687092b"}, + {file = "numpy-1.24.3-cp310-cp310-win_amd64.whl", hash = "sha256:ab5f23af8c16022663a652d3b25dcdc272ac3f83c3af4c02eb8b824e6b3ab9d7"}, + {file = "numpy-1.24.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9a7721ec204d3a237225db3e194c25268faf92e19338a35f3a224469cb6039a3"}, + {file = "numpy-1.24.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d6cc757de514c00b24ae8cf5c876af2a7c3df189028d68c0cb4eaa9cd5afc2bf"}, + {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76e3f4e85fc5d4fd311f6e9b794d0c00e7002ec122be271f2019d63376f1d385"}, + {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1d3c026f57ceaad42f8231305d4653d5f05dc6332a730ae5c0bea3513de0950"}, + {file = "numpy-1.24.3-cp311-cp311-win32.whl", hash = "sha256:c91c4afd8abc3908e00a44b2672718905b8611503f7ff87390cc0ac3423fb096"}, + {file = "numpy-1.24.3-cp311-cp311-win_amd64.whl", hash = "sha256:5342cf6aad47943286afa6f1609cad9b4266a05e7f2ec408e2cf7aea7ff69d80"}, + {file = "numpy-1.24.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7776ea65423ca6a15255ba1872d82d207bd1e09f6d0894ee4a64678dd2204078"}, + {file = "numpy-1.24.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ae8d0be48d1b6ed82588934aaaa179875e7dc4f3d84da18d7eae6eb3f06c242c"}, + {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecde0f8adef7dfdec993fd54b0f78183051b6580f606111a6d789cd14c61ea0c"}, + {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4749e053a29364d3452c034827102ee100986903263e89884922ef01a0a6fd2f"}, + {file = "numpy-1.24.3-cp38-cp38-win32.whl", hash = "sha256:d933fabd8f6a319e8530d0de4fcc2e6a61917e0b0c271fded460032db42a0fe4"}, + {file = "numpy-1.24.3-cp38-cp38-win_amd64.whl", hash = "sha256:56e48aec79ae238f6e4395886b5eaed058abb7231fb3361ddd7bfdf4eed54289"}, + {file = "numpy-1.24.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4719d5aefb5189f50887773699eaf94e7d1e02bf36c1a9d353d9f46703758ca4"}, + {file = "numpy-1.24.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ec87a7084caa559c36e0a2309e4ecb1baa03b687201d0a847c8b0ed476a7187"}, + {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea8282b9bcfe2b5e7d491d0bf7f3e2da29700cec05b49e64d6246923329f2b02"}, + {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210461d87fb02a84ef243cac5e814aad2b7f4be953b32cb53327bb49fd77fbb4"}, + {file = "numpy-1.24.3-cp39-cp39-win32.whl", hash = "sha256:784c6da1a07818491b0ffd63c6bbe5a33deaa0e25a20e1b3ea20cf0e43f8046c"}, + {file = "numpy-1.24.3-cp39-cp39-win_amd64.whl", hash = "sha256:d5036197ecae68d7f491fcdb4df90082b0d4960ca6599ba2659957aafced7c17"}, + {file = "numpy-1.24.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:352ee00c7f8387b44d19f4cada524586f07379c0d49270f87233983bc5087ca0"}, + {file = "numpy-1.24.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7d6acc2e7524c9955e5c903160aa4ea083736fde7e91276b0e5d98e6332812"}, + {file = "numpy-1.24.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:35400e6a8d102fd07c71ed7dcadd9eb62ee9a6e84ec159bd48c28235bbb0f8e4"}, + {file = "numpy-1.24.3.tar.gz", hash = "sha256:ab344f1bf21f140adab8e47fdbc7c35a477dc01408791f8ba00d018dd0bc5155"}, +] + +[[package]] +name = "scikit-learn" +version = "1.2.2" +description = "A set of python modules for machine learning and data mining" +optional = false +python-versions = ">=3.8" +files = [ + {file = "scikit-learn-1.2.2.tar.gz", hash = "sha256:8429aea30ec24e7a8c7ed8a3fa6213adf3814a6efbea09e16e0a0c71e1a1a3d7"}, + {file = "scikit_learn-1.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99cc01184e347de485bf253d19fcb3b1a3fb0ee4cea5ee3c43ec0cc429b6d29f"}, + {file = "scikit_learn-1.2.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:e6e574db9914afcb4e11ade84fab084536a895ca60aadea3041e85b8ac963edb"}, + {file = "scikit_learn-1.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fe83b676f407f00afa388dd1fdd49e5c6612e551ed84f3b1b182858f09e987d"}, + {file = "scikit_learn-1.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e2642baa0ad1e8f8188917423dd73994bf25429f8893ddbe115be3ca3183584"}, + {file = "scikit_learn-1.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:ad66c3848c0a1ec13464b2a95d0a484fd5b02ce74268eaa7e0c697b904f31d6c"}, + {file = "scikit_learn-1.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dfeaf8be72117eb61a164ea6fc8afb6dfe08c6f90365bde2dc16456e4bc8e45f"}, + {file = "scikit_learn-1.2.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:fe0aa1a7029ed3e1dcbf4a5bc675aa3b1bc468d9012ecf6c6f081251ca47f590"}, + {file = "scikit_learn-1.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:065e9673e24e0dc5113e2dd2b4ca30c9d8aa2fa90f4c0597241c93b63130d233"}, + {file = "scikit_learn-1.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf036ea7ef66115e0d49655f16febfa547886deba20149555a41d28f56fd6d3c"}, + {file = "scikit_learn-1.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:8b0670d4224a3c2d596fd572fb4fa673b2a0ccfb07152688ebd2ea0b8c61025c"}, + {file = "scikit_learn-1.2.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9c710ff9f9936ba8a3b74a455ccf0dcf59b230caa1e9ba0223773c490cab1e51"}, + {file = "scikit_learn-1.2.2-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:2dd3ffd3950e3d6c0c0ef9033a9b9b32d910c61bd06cb8206303fb4514b88a49"}, + {file = "scikit_learn-1.2.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44b47a305190c28dd8dd73fc9445f802b6ea716669cfc22ab1eb97b335d238b1"}, + {file = "scikit_learn-1.2.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:953236889928d104c2ef14027539f5f2609a47ebf716b8cbe4437e85dce42744"}, + {file = "scikit_learn-1.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:7f69313884e8eb311460cc2f28676d5e400bd929841a2c8eb8742ae78ebf7c20"}, + {file = "scikit_learn-1.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8156db41e1c39c69aa2d8599ab7577af53e9e5e7a57b0504e116cc73c39138dd"}, + {file = "scikit_learn-1.2.2-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:fe175ee1dab589d2e1033657c5b6bec92a8a3b69103e3dd361b58014729975c3"}, + {file = "scikit_learn-1.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d5312d9674bed14f73773d2acf15a3272639b981e60b72c9b190a0cffed5bad"}, + {file = "scikit_learn-1.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea061bf0283bf9a9f36ea3c5d3231ba2176221bbd430abd2603b1c3b2ed85c89"}, + {file = "scikit_learn-1.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:6477eed40dbce190f9f9e9d0d37e020815825b300121307942ec2110302b66a3"}, +] + +[package.dependencies] +joblib = ">=1.1.1" +numpy = ">=1.17.3" +scipy = ">=1.3.2" +threadpoolctl = ">=2.0.0" + +[package.extras] +benchmark = ["matplotlib (>=3.1.3)", "memory-profiler (>=0.57.0)", "pandas (>=1.0.5)"] +docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.1.3)", "memory-profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "plotly (>=5.10.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)", "sphinx (>=4.0.1)", "sphinx-gallery (>=0.7.0)", "sphinx-prompt (>=1.3.0)", "sphinxext-opengraph (>=0.4.2)"] +examples = ["matplotlib (>=3.1.3)", "pandas (>=1.0.5)", "plotly (>=5.10.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)"] +tests = ["black (>=22.3.0)", "flake8 (>=3.8.2)", "matplotlib (>=3.1.3)", "mypy (>=0.961)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pytest (>=5.3.1)", "pytest-cov (>=2.9.0)", "scikit-image (>=0.16.2)"] + +[[package]] +name = "scipy" +version = "1.9.3" +description = "Fundamental algorithms for scientific computing in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "scipy-1.9.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1884b66a54887e21addf9c16fb588720a8309a57b2e258ae1c7986d4444d3bc0"}, + {file = "scipy-1.9.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:83b89e9586c62e787f5012e8475fbb12185bafb996a03257e9675cd73d3736dd"}, + {file = "scipy-1.9.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a72d885fa44247f92743fc20732ae55564ff2a519e8302fb7e18717c5355a8b"}, + {file = "scipy-1.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d01e1dd7b15bd2449c8bfc6b7cc67d630700ed655654f0dfcf121600bad205c9"}, + {file = "scipy-1.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:68239b6aa6f9c593da8be1509a05cb7f9efe98b80f43a5861cd24c7557e98523"}, + {file = "scipy-1.9.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b41bc822679ad1c9a5f023bc93f6d0543129ca0f37c1ce294dd9d386f0a21096"}, + {file = "scipy-1.9.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:90453d2b93ea82a9f434e4e1cba043e779ff67b92f7a0e85d05d286a3625df3c"}, + {file = "scipy-1.9.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83c06e62a390a9167da60bedd4575a14c1f58ca9dfde59830fc42e5197283dab"}, + {file = "scipy-1.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abaf921531b5aeaafced90157db505e10345e45038c39e5d9b6c7922d68085cb"}, + {file = "scipy-1.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:06d2e1b4c491dc7d8eacea139a1b0b295f74e1a1a0f704c375028f8320d16e31"}, + {file = "scipy-1.9.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5a04cd7d0d3eff6ea4719371cbc44df31411862b9646db617c99718ff68d4840"}, + {file = "scipy-1.9.3-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:545c83ffb518094d8c9d83cce216c0c32f8c04aaf28b92cc8283eda0685162d5"}, + {file = "scipy-1.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d54222d7a3ba6022fdf5773931b5d7c56efe41ede7f7128c7b1637700409108"}, + {file = "scipy-1.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cff3a5295234037e39500d35316a4c5794739433528310e117b8a9a0c76d20fc"}, + {file = "scipy-1.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:2318bef588acc7a574f5bfdff9c172d0b1bf2c8143d9582e05f878e580a3781e"}, + {file = "scipy-1.9.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d644a64e174c16cb4b2e41dfea6af722053e83d066da7343f333a54dae9bc31c"}, + {file = "scipy-1.9.3-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:da8245491d73ed0a994ed9c2e380fd058ce2fa8a18da204681f2fe1f57f98f95"}, + {file = "scipy-1.9.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4db5b30849606a95dcf519763dd3ab6fe9bd91df49eba517359e450a7d80ce2e"}, + {file = "scipy-1.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c68db6b290cbd4049012990d7fe71a2abd9ffbe82c0056ebe0f01df8be5436b0"}, + {file = "scipy-1.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:5b88e6d91ad9d59478fafe92a7c757d00c59e3bdc3331be8ada76a4f8d683f58"}, + {file = "scipy-1.9.3.tar.gz", hash = "sha256:fbc5c05c85c1a02be77b1ff591087c83bc44579c6d2bd9fb798bb64ea5e1a027"}, +] + +[package.dependencies] +numpy = ">=1.18.5,<1.26.0" + +[package.extras] +dev = ["flake8", "mypy", "pycodestyle", "typing_extensions"] +doc = ["matplotlib (>2)", "numpydoc", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-panels (>=0.5.2)", "sphinx-tabs"] +test = ["asv", "gmpy2", "mpmath", "pytest", "pytest-cov", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] + +[[package]] +name = "threadpoolctl" +version = "3.1.0" +description = "threadpoolctl" +optional = false +python-versions = ">=3.6" +files = [ + {file = "threadpoolctl-3.1.0-py3-none-any.whl", hash = "sha256:8b99adda265feb6773280df41eece7b2e6561b772d21ffd52e372f999024907b"}, + {file = "threadpoolctl-3.1.0.tar.gz", hash = "sha256:a335baacfaa4400ae1f0d8e3a58d6674d2f8828e3716bb2802c44955ad391380"}, +] + +[metadata] +lock-version = "2.0" +python-versions = "^3.11" +content-hash = "7dc7befc202186445aad47d4dd0cd1a874fc86430255210d0552e3f3f1beaa09" From c5df20774dcd0b387d6f7ae6144013fef8ad9508 Mon Sep 17 00:00:00 2001 From: dabadav Date: Tue, 13 Jun 2023 16:46:39 +0200 Subject: [PATCH 14/67] Changed README --- pyproject.toml | 2 -- 1 file changed, 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 707805c..b4511b0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,8 +8,6 @@ readme = "README.md" [tool.poetry.dependencies] python = "^3.11" -scikit-learn = "^1.2.2" -numpy = "^1.24.3" [build-system] From 3395dbc414ad208ddd139523a45875bb83237af8 Mon Sep 17 00:00:00 2001 From: dabadav Date: Tue, 13 Jun 2023 16:47:15 +0200 Subject: [PATCH 15/67] Changed README --- poetry.lock | 145 ---------------------------------------------------- 1 file changed, 145 deletions(-) delete mode 100644 poetry.lock diff --git a/poetry.lock b/poetry.lock deleted file mode 100644 index 1381b74..0000000 --- a/poetry.lock +++ /dev/null @@ -1,145 +0,0 @@ -# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. - -[[package]] -name = "joblib" -version = "1.2.0" -description = "Lightweight pipelining with Python functions" -optional = false -python-versions = ">=3.7" -files = [ - {file = "joblib-1.2.0-py3-none-any.whl", hash = "sha256:091138ed78f800342968c523bdde947e7a305b8594b910a0fea2ab83c3c6d385"}, - {file = "joblib-1.2.0.tar.gz", hash = "sha256:e1cee4a79e4af22881164f218d4311f60074197fb707e082e803b61f6d137018"}, -] - -[[package]] -name = "numpy" -version = "1.24.3" -description = "Fundamental package for array computing in Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "numpy-1.24.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3c1104d3c036fb81ab923f507536daedc718d0ad5a8707c6061cdfd6d184e570"}, - {file = "numpy-1.24.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:202de8f38fc4a45a3eea4b63e2f376e5f2dc64ef0fa692838e31a808520efaf7"}, - {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8535303847b89aa6b0f00aa1dc62867b5a32923e4d1681a35b5eef2d9591a463"}, - {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d926b52ba1367f9acb76b0df6ed21f0b16a1ad87c6720a1121674e5cf63e2b6"}, - {file = "numpy-1.24.3-cp310-cp310-win32.whl", hash = "sha256:f21c442fdd2805e91799fbe044a7b999b8571bb0ab0f7850d0cb9641a687092b"}, - {file = "numpy-1.24.3-cp310-cp310-win_amd64.whl", hash = "sha256:ab5f23af8c16022663a652d3b25dcdc272ac3f83c3af4c02eb8b824e6b3ab9d7"}, - {file = "numpy-1.24.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9a7721ec204d3a237225db3e194c25268faf92e19338a35f3a224469cb6039a3"}, - {file = "numpy-1.24.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d6cc757de514c00b24ae8cf5c876af2a7c3df189028d68c0cb4eaa9cd5afc2bf"}, - {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76e3f4e85fc5d4fd311f6e9b794d0c00e7002ec122be271f2019d63376f1d385"}, - {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1d3c026f57ceaad42f8231305d4653d5f05dc6332a730ae5c0bea3513de0950"}, - {file = "numpy-1.24.3-cp311-cp311-win32.whl", hash = "sha256:c91c4afd8abc3908e00a44b2672718905b8611503f7ff87390cc0ac3423fb096"}, - {file = "numpy-1.24.3-cp311-cp311-win_amd64.whl", hash = "sha256:5342cf6aad47943286afa6f1609cad9b4266a05e7f2ec408e2cf7aea7ff69d80"}, - {file = "numpy-1.24.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7776ea65423ca6a15255ba1872d82d207bd1e09f6d0894ee4a64678dd2204078"}, - {file = "numpy-1.24.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ae8d0be48d1b6ed82588934aaaa179875e7dc4f3d84da18d7eae6eb3f06c242c"}, - {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecde0f8adef7dfdec993fd54b0f78183051b6580f606111a6d789cd14c61ea0c"}, - {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4749e053a29364d3452c034827102ee100986903263e89884922ef01a0a6fd2f"}, - {file = "numpy-1.24.3-cp38-cp38-win32.whl", hash = "sha256:d933fabd8f6a319e8530d0de4fcc2e6a61917e0b0c271fded460032db42a0fe4"}, - {file = "numpy-1.24.3-cp38-cp38-win_amd64.whl", hash = "sha256:56e48aec79ae238f6e4395886b5eaed058abb7231fb3361ddd7bfdf4eed54289"}, - {file = "numpy-1.24.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4719d5aefb5189f50887773699eaf94e7d1e02bf36c1a9d353d9f46703758ca4"}, - {file = "numpy-1.24.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ec87a7084caa559c36e0a2309e4ecb1baa03b687201d0a847c8b0ed476a7187"}, - {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea8282b9bcfe2b5e7d491d0bf7f3e2da29700cec05b49e64d6246923329f2b02"}, - {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210461d87fb02a84ef243cac5e814aad2b7f4be953b32cb53327bb49fd77fbb4"}, - {file = "numpy-1.24.3-cp39-cp39-win32.whl", hash = "sha256:784c6da1a07818491b0ffd63c6bbe5a33deaa0e25a20e1b3ea20cf0e43f8046c"}, - {file = "numpy-1.24.3-cp39-cp39-win_amd64.whl", hash = "sha256:d5036197ecae68d7f491fcdb4df90082b0d4960ca6599ba2659957aafced7c17"}, - {file = "numpy-1.24.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:352ee00c7f8387b44d19f4cada524586f07379c0d49270f87233983bc5087ca0"}, - {file = "numpy-1.24.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7d6acc2e7524c9955e5c903160aa4ea083736fde7e91276b0e5d98e6332812"}, - {file = "numpy-1.24.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:35400e6a8d102fd07c71ed7dcadd9eb62ee9a6e84ec159bd48c28235bbb0f8e4"}, - {file = "numpy-1.24.3.tar.gz", hash = "sha256:ab344f1bf21f140adab8e47fdbc7c35a477dc01408791f8ba00d018dd0bc5155"}, -] - -[[package]] -name = "scikit-learn" -version = "1.2.2" -description = "A set of python modules for machine learning and data mining" -optional = false -python-versions = ">=3.8" -files = [ - {file = "scikit-learn-1.2.2.tar.gz", hash = "sha256:8429aea30ec24e7a8c7ed8a3fa6213adf3814a6efbea09e16e0a0c71e1a1a3d7"}, - {file = "scikit_learn-1.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99cc01184e347de485bf253d19fcb3b1a3fb0ee4cea5ee3c43ec0cc429b6d29f"}, - {file = "scikit_learn-1.2.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:e6e574db9914afcb4e11ade84fab084536a895ca60aadea3041e85b8ac963edb"}, - {file = "scikit_learn-1.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fe83b676f407f00afa388dd1fdd49e5c6612e551ed84f3b1b182858f09e987d"}, - {file = "scikit_learn-1.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e2642baa0ad1e8f8188917423dd73994bf25429f8893ddbe115be3ca3183584"}, - {file = "scikit_learn-1.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:ad66c3848c0a1ec13464b2a95d0a484fd5b02ce74268eaa7e0c697b904f31d6c"}, - {file = "scikit_learn-1.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dfeaf8be72117eb61a164ea6fc8afb6dfe08c6f90365bde2dc16456e4bc8e45f"}, - {file = "scikit_learn-1.2.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:fe0aa1a7029ed3e1dcbf4a5bc675aa3b1bc468d9012ecf6c6f081251ca47f590"}, - {file = "scikit_learn-1.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:065e9673e24e0dc5113e2dd2b4ca30c9d8aa2fa90f4c0597241c93b63130d233"}, - {file = "scikit_learn-1.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf036ea7ef66115e0d49655f16febfa547886deba20149555a41d28f56fd6d3c"}, - {file = "scikit_learn-1.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:8b0670d4224a3c2d596fd572fb4fa673b2a0ccfb07152688ebd2ea0b8c61025c"}, - {file = "scikit_learn-1.2.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9c710ff9f9936ba8a3b74a455ccf0dcf59b230caa1e9ba0223773c490cab1e51"}, - {file = "scikit_learn-1.2.2-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:2dd3ffd3950e3d6c0c0ef9033a9b9b32d910c61bd06cb8206303fb4514b88a49"}, - {file = "scikit_learn-1.2.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44b47a305190c28dd8dd73fc9445f802b6ea716669cfc22ab1eb97b335d238b1"}, - {file = "scikit_learn-1.2.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:953236889928d104c2ef14027539f5f2609a47ebf716b8cbe4437e85dce42744"}, - {file = "scikit_learn-1.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:7f69313884e8eb311460cc2f28676d5e400bd929841a2c8eb8742ae78ebf7c20"}, - {file = "scikit_learn-1.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8156db41e1c39c69aa2d8599ab7577af53e9e5e7a57b0504e116cc73c39138dd"}, - {file = "scikit_learn-1.2.2-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:fe175ee1dab589d2e1033657c5b6bec92a8a3b69103e3dd361b58014729975c3"}, - {file = "scikit_learn-1.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d5312d9674bed14f73773d2acf15a3272639b981e60b72c9b190a0cffed5bad"}, - {file = "scikit_learn-1.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea061bf0283bf9a9f36ea3c5d3231ba2176221bbd430abd2603b1c3b2ed85c89"}, - {file = "scikit_learn-1.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:6477eed40dbce190f9f9e9d0d37e020815825b300121307942ec2110302b66a3"}, -] - -[package.dependencies] -joblib = ">=1.1.1" -numpy = ">=1.17.3" -scipy = ">=1.3.2" -threadpoolctl = ">=2.0.0" - -[package.extras] -benchmark = ["matplotlib (>=3.1.3)", "memory-profiler (>=0.57.0)", "pandas (>=1.0.5)"] -docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.1.3)", "memory-profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "plotly (>=5.10.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)", "sphinx (>=4.0.1)", "sphinx-gallery (>=0.7.0)", "sphinx-prompt (>=1.3.0)", "sphinxext-opengraph (>=0.4.2)"] -examples = ["matplotlib (>=3.1.3)", "pandas (>=1.0.5)", "plotly (>=5.10.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)"] -tests = ["black (>=22.3.0)", "flake8 (>=3.8.2)", "matplotlib (>=3.1.3)", "mypy (>=0.961)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pytest (>=5.3.1)", "pytest-cov (>=2.9.0)", "scikit-image (>=0.16.2)"] - -[[package]] -name = "scipy" -version = "1.9.3" -description = "Fundamental algorithms for scientific computing in Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "scipy-1.9.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1884b66a54887e21addf9c16fb588720a8309a57b2e258ae1c7986d4444d3bc0"}, - {file = "scipy-1.9.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:83b89e9586c62e787f5012e8475fbb12185bafb996a03257e9675cd73d3736dd"}, - {file = "scipy-1.9.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a72d885fa44247f92743fc20732ae55564ff2a519e8302fb7e18717c5355a8b"}, - {file = "scipy-1.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d01e1dd7b15bd2449c8bfc6b7cc67d630700ed655654f0dfcf121600bad205c9"}, - {file = "scipy-1.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:68239b6aa6f9c593da8be1509a05cb7f9efe98b80f43a5861cd24c7557e98523"}, - {file = "scipy-1.9.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b41bc822679ad1c9a5f023bc93f6d0543129ca0f37c1ce294dd9d386f0a21096"}, - {file = "scipy-1.9.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:90453d2b93ea82a9f434e4e1cba043e779ff67b92f7a0e85d05d286a3625df3c"}, - {file = "scipy-1.9.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83c06e62a390a9167da60bedd4575a14c1f58ca9dfde59830fc42e5197283dab"}, - {file = "scipy-1.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abaf921531b5aeaafced90157db505e10345e45038c39e5d9b6c7922d68085cb"}, - {file = "scipy-1.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:06d2e1b4c491dc7d8eacea139a1b0b295f74e1a1a0f704c375028f8320d16e31"}, - {file = "scipy-1.9.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5a04cd7d0d3eff6ea4719371cbc44df31411862b9646db617c99718ff68d4840"}, - {file = "scipy-1.9.3-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:545c83ffb518094d8c9d83cce216c0c32f8c04aaf28b92cc8283eda0685162d5"}, - {file = "scipy-1.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d54222d7a3ba6022fdf5773931b5d7c56efe41ede7f7128c7b1637700409108"}, - {file = "scipy-1.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cff3a5295234037e39500d35316a4c5794739433528310e117b8a9a0c76d20fc"}, - {file = "scipy-1.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:2318bef588acc7a574f5bfdff9c172d0b1bf2c8143d9582e05f878e580a3781e"}, - {file = "scipy-1.9.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d644a64e174c16cb4b2e41dfea6af722053e83d066da7343f333a54dae9bc31c"}, - {file = "scipy-1.9.3-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:da8245491d73ed0a994ed9c2e380fd058ce2fa8a18da204681f2fe1f57f98f95"}, - {file = "scipy-1.9.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4db5b30849606a95dcf519763dd3ab6fe9bd91df49eba517359e450a7d80ce2e"}, - {file = "scipy-1.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c68db6b290cbd4049012990d7fe71a2abd9ffbe82c0056ebe0f01df8be5436b0"}, - {file = "scipy-1.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:5b88e6d91ad9d59478fafe92a7c757d00c59e3bdc3331be8ada76a4f8d683f58"}, - {file = "scipy-1.9.3.tar.gz", hash = "sha256:fbc5c05c85c1a02be77b1ff591087c83bc44579c6d2bd9fb798bb64ea5e1a027"}, -] - -[package.dependencies] -numpy = ">=1.18.5,<1.26.0" - -[package.extras] -dev = ["flake8", "mypy", "pycodestyle", "typing_extensions"] -doc = ["matplotlib (>2)", "numpydoc", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-panels (>=0.5.2)", "sphinx-tabs"] -test = ["asv", "gmpy2", "mpmath", "pytest", "pytest-cov", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] - -[[package]] -name = "threadpoolctl" -version = "3.1.0" -description = "threadpoolctl" -optional = false -python-versions = ">=3.6" -files = [ - {file = "threadpoolctl-3.1.0-py3-none-any.whl", hash = "sha256:8b99adda265feb6773280df41eece7b2e6561b772d21ffd52e372f999024907b"}, - {file = "threadpoolctl-3.1.0.tar.gz", hash = "sha256:a335baacfaa4400ae1f0d8e3a58d6674d2f8828e3716bb2802c44955ad391380"}, -] - -[metadata] -lock-version = "2.0" -python-versions = "^3.11" -content-hash = "7dc7befc202186445aad47d4dd0cd1a874fc86430255210d0552e3f3f1beaa09" From 570073bbcf70637f5586cd1767df3038349e4885 Mon Sep 17 00:00:00 2001 From: dabadav Date: Tue, 13 Jun 2023 16:52:17 +0200 Subject: [PATCH 16/67] Fix Dependencies poetry --- poetry.lock | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++ pyproject.toml | 4 ++- 2 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 poetry.lock diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..7f58177 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,79 @@ +# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. + +[[package]] +name = "numpy" +version = "1.24.3" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "numpy-1.24.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3c1104d3c036fb81ab923f507536daedc718d0ad5a8707c6061cdfd6d184e570"}, + {file = "numpy-1.24.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:202de8f38fc4a45a3eea4b63e2f376e5f2dc64ef0fa692838e31a808520efaf7"}, + {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8535303847b89aa6b0f00aa1dc62867b5a32923e4d1681a35b5eef2d9591a463"}, + {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d926b52ba1367f9acb76b0df6ed21f0b16a1ad87c6720a1121674e5cf63e2b6"}, + {file = "numpy-1.24.3-cp310-cp310-win32.whl", hash = "sha256:f21c442fdd2805e91799fbe044a7b999b8571bb0ab0f7850d0cb9641a687092b"}, + {file = "numpy-1.24.3-cp310-cp310-win_amd64.whl", hash = "sha256:ab5f23af8c16022663a652d3b25dcdc272ac3f83c3af4c02eb8b824e6b3ab9d7"}, + {file = "numpy-1.24.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9a7721ec204d3a237225db3e194c25268faf92e19338a35f3a224469cb6039a3"}, + {file = "numpy-1.24.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d6cc757de514c00b24ae8cf5c876af2a7c3df189028d68c0cb4eaa9cd5afc2bf"}, + {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76e3f4e85fc5d4fd311f6e9b794d0c00e7002ec122be271f2019d63376f1d385"}, + {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1d3c026f57ceaad42f8231305d4653d5f05dc6332a730ae5c0bea3513de0950"}, + {file = "numpy-1.24.3-cp311-cp311-win32.whl", hash = "sha256:c91c4afd8abc3908e00a44b2672718905b8611503f7ff87390cc0ac3423fb096"}, + {file = "numpy-1.24.3-cp311-cp311-win_amd64.whl", hash = "sha256:5342cf6aad47943286afa6f1609cad9b4266a05e7f2ec408e2cf7aea7ff69d80"}, + {file = "numpy-1.24.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7776ea65423ca6a15255ba1872d82d207bd1e09f6d0894ee4a64678dd2204078"}, + {file = "numpy-1.24.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ae8d0be48d1b6ed82588934aaaa179875e7dc4f3d84da18d7eae6eb3f06c242c"}, + {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecde0f8adef7dfdec993fd54b0f78183051b6580f606111a6d789cd14c61ea0c"}, + {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4749e053a29364d3452c034827102ee100986903263e89884922ef01a0a6fd2f"}, + {file = "numpy-1.24.3-cp38-cp38-win32.whl", hash = "sha256:d933fabd8f6a319e8530d0de4fcc2e6a61917e0b0c271fded460032db42a0fe4"}, + {file = "numpy-1.24.3-cp38-cp38-win_amd64.whl", hash = "sha256:56e48aec79ae238f6e4395886b5eaed058abb7231fb3361ddd7bfdf4eed54289"}, + {file = "numpy-1.24.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4719d5aefb5189f50887773699eaf94e7d1e02bf36c1a9d353d9f46703758ca4"}, + {file = "numpy-1.24.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ec87a7084caa559c36e0a2309e4ecb1baa03b687201d0a847c8b0ed476a7187"}, + {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea8282b9bcfe2b5e7d491d0bf7f3e2da29700cec05b49e64d6246923329f2b02"}, + {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210461d87fb02a84ef243cac5e814aad2b7f4be953b32cb53327bb49fd77fbb4"}, + {file = "numpy-1.24.3-cp39-cp39-win32.whl", hash = "sha256:784c6da1a07818491b0ffd63c6bbe5a33deaa0e25a20e1b3ea20cf0e43f8046c"}, + {file = "numpy-1.24.3-cp39-cp39-win_amd64.whl", hash = "sha256:d5036197ecae68d7f491fcdb4df90082b0d4960ca6599ba2659957aafced7c17"}, + {file = "numpy-1.24.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:352ee00c7f8387b44d19f4cada524586f07379c0d49270f87233983bc5087ca0"}, + {file = "numpy-1.24.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7d6acc2e7524c9955e5c903160aa4ea083736fde7e91276b0e5d98e6332812"}, + {file = "numpy-1.24.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:35400e6a8d102fd07c71ed7dcadd9eb62ee9a6e84ec159bd48c28235bbb0f8e4"}, + {file = "numpy-1.24.3.tar.gz", hash = "sha256:ab344f1bf21f140adab8e47fdbc7c35a477dc01408791f8ba00d018dd0bc5155"}, +] + +[[package]] +name = "scipy" +version = "1.11.0rc1" +description = "Fundamental algorithms for scientific computing in Python" +optional = false +python-versions = "<3.13,>=3.9" +files = [ + {file = "scipy-1.11.0rc1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:af1d5b71b21f1afc0de0d166a16038587c498b691f8243e5749792f2617fd651"}, + {file = "scipy-1.11.0rc1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:73df607643dc8c17228d2bc540473d3dbd09243402d873ec0c3e9b4b1906a27c"}, + {file = "scipy-1.11.0rc1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79b199b9f5b7b1fe7f187dd2922f5ba062ccbbeec82cf2a19cd763325d6b2fe3"}, + {file = "scipy-1.11.0rc1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57f1d0ccbbf8905eda3bf454c9db49679d266e1a7c16038f5d6a630bff7ebb58"}, + {file = "scipy-1.11.0rc1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:eb1514f6cfb843bf9656b8dbb62310a52773154a1f01cad389253f96b67786ab"}, + {file = "scipy-1.11.0rc1-cp310-cp310-win_amd64.whl", hash = "sha256:f80d63babab3297f551b03d152f5b0cbf1505b7d4551c23f63b72e7379373e2c"}, + {file = "scipy-1.11.0rc1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5aa15f2fb3198c1bd2ece26f60961e1c655126b5c041c901f5c5fc2349e32ece"}, + {file = "scipy-1.11.0rc1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:88d0623211e5e54032850e69a9d3d0953f8e66b277a3fde7a0774f7636e75cdd"}, + {file = "scipy-1.11.0rc1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe2126c03b53bac3fd0c8738e25363d07643cbca48553c5603c9a546fb060807"}, + {file = "scipy-1.11.0rc1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25ca2bdb8c6b26f52412ce90d090b4d5a8c7ee5747f8c6ac1c9f587dfaa95b08"}, + {file = "scipy-1.11.0rc1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:83ac6f81fa280f6345b43abf420edba28ea018b2465644363c876b6f5b3341d6"}, + {file = "scipy-1.11.0rc1-cp311-cp311-win_amd64.whl", hash = "sha256:7e253e5bb847cc960fc3c4b87540992f080f9adfcb1fcc665d53824bff002313"}, + {file = "scipy-1.11.0rc1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ba6a6ddf6b0fed76560b5124f570473135bfd66cfd77655cb859dfdb334d4bc0"}, + {file = "scipy-1.11.0rc1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:031b9e45972f370ef9f9b5e1d9879b8cc339ea3637a9a1ea83d4dd53b1bfa3ce"}, + {file = "scipy-1.11.0rc1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82d3ae9098e05be8f2b0092dff62f73694afb82677df57fa1b3531d3fd318929"}, + {file = "scipy-1.11.0rc1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c74ce6155c495e9939569842064e994d72b352bc6cfcfa319753d94dffd16c6"}, + {file = "scipy-1.11.0rc1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3194b3ff1c5f0b7592e814307702f25f00ab457c6d553b609fc3237e48b6a42b"}, + {file = "scipy-1.11.0rc1-cp39-cp39-win_amd64.whl", hash = "sha256:353c993b9caf969182f113729375e2b5573bee77fad7b8afa7ea494dc6bb90b7"}, + {file = "scipy-1.11.0rc1.tar.gz", hash = "sha256:312420789955c875a0126c0f1f949a14c1b2e4807d0a3aff6ebe598d5760e051"}, +] + +[package.dependencies] +numpy = ">=1.21.6,<1.28.0" + +[package.extras] +dev = ["click", "cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] +doc = ["jupytext", "matplotlib (>2)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] +test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] + +[metadata] +lock-version = "2.0" +python-versions = ">=3.9,<3.13" +content-hash = "f51b55a0b5036b010c4d455d00a324e18a2e1467b9db0c1e31aaf97a4ce071d7" diff --git a/pyproject.toml b/pyproject.toml index b4511b0..b982481 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,9 @@ license = "MIT" readme = "README.md" [tool.poetry.dependencies] -python = "^3.11" +python = ">=3.9,<3.13" +scipy = "^1.10.1" +numpy = "^1.24.3" [build-system] From 9171d6e9f351706614f6baedeb70ca4ec30f9f67 Mon Sep 17 00:00:00 2001 From: dabadav Date: Tue, 13 Jun 2023 17:19:22 +0200 Subject: [PATCH 17/67] Fix Dependencies poetry --- __init__.py => pipeline_vsdi/__init__.py | 0 .../dim_reduction}/VAE.py | 0 .../dim_reduction}/__init__.py | 0 .../dim_reduction}/linear_dim_red.py | 0 .../preprocessing}/__init__.py | 0 .../preprocessing}/behavior.py | 0 .../preprocessing}/clustering.py | 0 .../preprocessing}/utils.py | 0 .../preprocessing}/vsdi_preprocessing.py | 0 .../visualization}/__init__.py | 0 .../visualization}/vsdi_visualization.py | 0 {vsdi => pipeline_vsdi/vsdi}/__init__.py | 0 {vsdi => pipeline_vsdi/vsdi}/loaders.py | 0 {vsdi => pipeline_vsdi/vsdi}/vsdi.py | 0 poetry.lock | 79 ------------------- pyproject.toml | 3 +- 16 files changed, 1 insertion(+), 81 deletions(-) rename __init__.py => pipeline_vsdi/__init__.py (100%) rename {dim_reduction => pipeline_vsdi/dim_reduction}/VAE.py (100%) rename {dim_reduction => pipeline_vsdi/dim_reduction}/__init__.py (100%) rename {dim_reduction => pipeline_vsdi/dim_reduction}/linear_dim_red.py (100%) rename {preprocessing => pipeline_vsdi/preprocessing}/__init__.py (100%) rename {preprocessing => pipeline_vsdi/preprocessing}/behavior.py (100%) rename {preprocessing => pipeline_vsdi/preprocessing}/clustering.py (100%) rename {preprocessing => pipeline_vsdi/preprocessing}/utils.py (100%) rename {preprocessing => pipeline_vsdi/preprocessing}/vsdi_preprocessing.py (100%) rename {visualization => pipeline_vsdi/visualization}/__init__.py (100%) rename {visualization => pipeline_vsdi/visualization}/vsdi_visualization.py (100%) rename {vsdi => pipeline_vsdi/vsdi}/__init__.py (100%) rename {vsdi => pipeline_vsdi/vsdi}/loaders.py (100%) rename {vsdi => pipeline_vsdi/vsdi}/vsdi.py (100%) delete mode 100644 poetry.lock diff --git a/__init__.py b/pipeline_vsdi/__init__.py similarity index 100% rename from __init__.py rename to pipeline_vsdi/__init__.py diff --git a/dim_reduction/VAE.py b/pipeline_vsdi/dim_reduction/VAE.py similarity index 100% rename from dim_reduction/VAE.py rename to pipeline_vsdi/dim_reduction/VAE.py diff --git a/dim_reduction/__init__.py b/pipeline_vsdi/dim_reduction/__init__.py similarity index 100% rename from dim_reduction/__init__.py rename to pipeline_vsdi/dim_reduction/__init__.py diff --git a/dim_reduction/linear_dim_red.py b/pipeline_vsdi/dim_reduction/linear_dim_red.py similarity index 100% rename from dim_reduction/linear_dim_red.py rename to pipeline_vsdi/dim_reduction/linear_dim_red.py diff --git a/preprocessing/__init__.py b/pipeline_vsdi/preprocessing/__init__.py similarity index 100% rename from preprocessing/__init__.py rename to pipeline_vsdi/preprocessing/__init__.py diff --git a/preprocessing/behavior.py b/pipeline_vsdi/preprocessing/behavior.py similarity index 100% rename from preprocessing/behavior.py rename to pipeline_vsdi/preprocessing/behavior.py diff --git a/preprocessing/clustering.py b/pipeline_vsdi/preprocessing/clustering.py similarity index 100% rename from preprocessing/clustering.py rename to pipeline_vsdi/preprocessing/clustering.py diff --git a/preprocessing/utils.py b/pipeline_vsdi/preprocessing/utils.py similarity index 100% rename from preprocessing/utils.py rename to pipeline_vsdi/preprocessing/utils.py diff --git a/preprocessing/vsdi_preprocessing.py b/pipeline_vsdi/preprocessing/vsdi_preprocessing.py similarity index 100% rename from preprocessing/vsdi_preprocessing.py rename to pipeline_vsdi/preprocessing/vsdi_preprocessing.py diff --git a/visualization/__init__.py b/pipeline_vsdi/visualization/__init__.py similarity index 100% rename from visualization/__init__.py rename to pipeline_vsdi/visualization/__init__.py diff --git a/visualization/vsdi_visualization.py b/pipeline_vsdi/visualization/vsdi_visualization.py similarity index 100% rename from visualization/vsdi_visualization.py rename to pipeline_vsdi/visualization/vsdi_visualization.py diff --git a/vsdi/__init__.py b/pipeline_vsdi/vsdi/__init__.py similarity index 100% rename from vsdi/__init__.py rename to pipeline_vsdi/vsdi/__init__.py diff --git a/vsdi/loaders.py b/pipeline_vsdi/vsdi/loaders.py similarity index 100% rename from vsdi/loaders.py rename to pipeline_vsdi/vsdi/loaders.py diff --git a/vsdi/vsdi.py b/pipeline_vsdi/vsdi/vsdi.py similarity index 100% rename from vsdi/vsdi.py rename to pipeline_vsdi/vsdi/vsdi.py diff --git a/poetry.lock b/poetry.lock deleted file mode 100644 index 7f58177..0000000 --- a/poetry.lock +++ /dev/null @@ -1,79 +0,0 @@ -# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. - -[[package]] -name = "numpy" -version = "1.24.3" -description = "Fundamental package for array computing in Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "numpy-1.24.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3c1104d3c036fb81ab923f507536daedc718d0ad5a8707c6061cdfd6d184e570"}, - {file = "numpy-1.24.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:202de8f38fc4a45a3eea4b63e2f376e5f2dc64ef0fa692838e31a808520efaf7"}, - {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8535303847b89aa6b0f00aa1dc62867b5a32923e4d1681a35b5eef2d9591a463"}, - {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d926b52ba1367f9acb76b0df6ed21f0b16a1ad87c6720a1121674e5cf63e2b6"}, - {file = "numpy-1.24.3-cp310-cp310-win32.whl", hash = "sha256:f21c442fdd2805e91799fbe044a7b999b8571bb0ab0f7850d0cb9641a687092b"}, - {file = "numpy-1.24.3-cp310-cp310-win_amd64.whl", hash = "sha256:ab5f23af8c16022663a652d3b25dcdc272ac3f83c3af4c02eb8b824e6b3ab9d7"}, - {file = "numpy-1.24.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9a7721ec204d3a237225db3e194c25268faf92e19338a35f3a224469cb6039a3"}, - {file = "numpy-1.24.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d6cc757de514c00b24ae8cf5c876af2a7c3df189028d68c0cb4eaa9cd5afc2bf"}, - {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76e3f4e85fc5d4fd311f6e9b794d0c00e7002ec122be271f2019d63376f1d385"}, - {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1d3c026f57ceaad42f8231305d4653d5f05dc6332a730ae5c0bea3513de0950"}, - {file = "numpy-1.24.3-cp311-cp311-win32.whl", hash = "sha256:c91c4afd8abc3908e00a44b2672718905b8611503f7ff87390cc0ac3423fb096"}, - {file = "numpy-1.24.3-cp311-cp311-win_amd64.whl", hash = "sha256:5342cf6aad47943286afa6f1609cad9b4266a05e7f2ec408e2cf7aea7ff69d80"}, - {file = "numpy-1.24.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7776ea65423ca6a15255ba1872d82d207bd1e09f6d0894ee4a64678dd2204078"}, - {file = "numpy-1.24.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ae8d0be48d1b6ed82588934aaaa179875e7dc4f3d84da18d7eae6eb3f06c242c"}, - {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecde0f8adef7dfdec993fd54b0f78183051b6580f606111a6d789cd14c61ea0c"}, - {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4749e053a29364d3452c034827102ee100986903263e89884922ef01a0a6fd2f"}, - {file = "numpy-1.24.3-cp38-cp38-win32.whl", hash = "sha256:d933fabd8f6a319e8530d0de4fcc2e6a61917e0b0c271fded460032db42a0fe4"}, - {file = "numpy-1.24.3-cp38-cp38-win_amd64.whl", hash = "sha256:56e48aec79ae238f6e4395886b5eaed058abb7231fb3361ddd7bfdf4eed54289"}, - {file = "numpy-1.24.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4719d5aefb5189f50887773699eaf94e7d1e02bf36c1a9d353d9f46703758ca4"}, - {file = "numpy-1.24.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ec87a7084caa559c36e0a2309e4ecb1baa03b687201d0a847c8b0ed476a7187"}, - {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea8282b9bcfe2b5e7d491d0bf7f3e2da29700cec05b49e64d6246923329f2b02"}, - {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210461d87fb02a84ef243cac5e814aad2b7f4be953b32cb53327bb49fd77fbb4"}, - {file = "numpy-1.24.3-cp39-cp39-win32.whl", hash = "sha256:784c6da1a07818491b0ffd63c6bbe5a33deaa0e25a20e1b3ea20cf0e43f8046c"}, - {file = "numpy-1.24.3-cp39-cp39-win_amd64.whl", hash = "sha256:d5036197ecae68d7f491fcdb4df90082b0d4960ca6599ba2659957aafced7c17"}, - {file = "numpy-1.24.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:352ee00c7f8387b44d19f4cada524586f07379c0d49270f87233983bc5087ca0"}, - {file = "numpy-1.24.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7d6acc2e7524c9955e5c903160aa4ea083736fde7e91276b0e5d98e6332812"}, - {file = "numpy-1.24.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:35400e6a8d102fd07c71ed7dcadd9eb62ee9a6e84ec159bd48c28235bbb0f8e4"}, - {file = "numpy-1.24.3.tar.gz", hash = "sha256:ab344f1bf21f140adab8e47fdbc7c35a477dc01408791f8ba00d018dd0bc5155"}, -] - -[[package]] -name = "scipy" -version = "1.11.0rc1" -description = "Fundamental algorithms for scientific computing in Python" -optional = false -python-versions = "<3.13,>=3.9" -files = [ - {file = "scipy-1.11.0rc1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:af1d5b71b21f1afc0de0d166a16038587c498b691f8243e5749792f2617fd651"}, - {file = "scipy-1.11.0rc1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:73df607643dc8c17228d2bc540473d3dbd09243402d873ec0c3e9b4b1906a27c"}, - {file = "scipy-1.11.0rc1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79b199b9f5b7b1fe7f187dd2922f5ba062ccbbeec82cf2a19cd763325d6b2fe3"}, - {file = "scipy-1.11.0rc1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57f1d0ccbbf8905eda3bf454c9db49679d266e1a7c16038f5d6a630bff7ebb58"}, - {file = "scipy-1.11.0rc1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:eb1514f6cfb843bf9656b8dbb62310a52773154a1f01cad389253f96b67786ab"}, - {file = "scipy-1.11.0rc1-cp310-cp310-win_amd64.whl", hash = "sha256:f80d63babab3297f551b03d152f5b0cbf1505b7d4551c23f63b72e7379373e2c"}, - {file = "scipy-1.11.0rc1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5aa15f2fb3198c1bd2ece26f60961e1c655126b5c041c901f5c5fc2349e32ece"}, - {file = "scipy-1.11.0rc1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:88d0623211e5e54032850e69a9d3d0953f8e66b277a3fde7a0774f7636e75cdd"}, - {file = "scipy-1.11.0rc1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe2126c03b53bac3fd0c8738e25363d07643cbca48553c5603c9a546fb060807"}, - {file = "scipy-1.11.0rc1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25ca2bdb8c6b26f52412ce90d090b4d5a8c7ee5747f8c6ac1c9f587dfaa95b08"}, - {file = "scipy-1.11.0rc1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:83ac6f81fa280f6345b43abf420edba28ea018b2465644363c876b6f5b3341d6"}, - {file = "scipy-1.11.0rc1-cp311-cp311-win_amd64.whl", hash = "sha256:7e253e5bb847cc960fc3c4b87540992f080f9adfcb1fcc665d53824bff002313"}, - {file = "scipy-1.11.0rc1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ba6a6ddf6b0fed76560b5124f570473135bfd66cfd77655cb859dfdb334d4bc0"}, - {file = "scipy-1.11.0rc1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:031b9e45972f370ef9f9b5e1d9879b8cc339ea3637a9a1ea83d4dd53b1bfa3ce"}, - {file = "scipy-1.11.0rc1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82d3ae9098e05be8f2b0092dff62f73694afb82677df57fa1b3531d3fd318929"}, - {file = "scipy-1.11.0rc1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c74ce6155c495e9939569842064e994d72b352bc6cfcfa319753d94dffd16c6"}, - {file = "scipy-1.11.0rc1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3194b3ff1c5f0b7592e814307702f25f00ab457c6d553b609fc3237e48b6a42b"}, - {file = "scipy-1.11.0rc1-cp39-cp39-win_amd64.whl", hash = "sha256:353c993b9caf969182f113729375e2b5573bee77fad7b8afa7ea494dc6bb90b7"}, - {file = "scipy-1.11.0rc1.tar.gz", hash = "sha256:312420789955c875a0126c0f1f949a14c1b2e4807d0a3aff6ebe598d5760e051"}, -] - -[package.dependencies] -numpy = ">=1.21.6,<1.28.0" - -[package.extras] -dev = ["click", "cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] -doc = ["jupytext", "matplotlib (>2)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] -test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] - -[metadata] -lock-version = "2.0" -python-versions = ">=3.9,<3.13" -content-hash = "f51b55a0b5036b010c4d455d00a324e18a2e1467b9db0c1e31aaf97a4ce071d7" diff --git a/pyproject.toml b/pyproject.toml index b982481..3d34799 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,5 +1,5 @@ [tool.poetry] -name = "vsdi pipeline" +name = "pipeline_vsdi" version = "1.0.0" description = "Preprocessing tools for voltage sensitive dye imaging data" authors = ["NeuroNetMem"] @@ -11,7 +11,6 @@ python = ">=3.9,<3.13" scipy = "^1.10.1" numpy = "^1.24.3" - [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" From 37733fdd59457edfe9951913e8fb685efafc4cfa Mon Sep 17 00:00:00 2001 From: dabadav Date: Tue, 13 Jun 2023 17:36:30 +0200 Subject: [PATCH 18/67] Fix Dependencies poetry --- docs/conf.py | 2 +- pipeline_vsdi/preprocessing/utils.py | 161 +----------------- .../preprocessing/vsdi_preprocessing.py | 1 - 3 files changed, 4 insertions(+), 160 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 2fbebad..b993e95 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -8,7 +8,7 @@ import os import sys -sys.path.insert(0, os.path.abspath("..")) +sys.path.insert(0, os.path.abspath("../pipeline_vsdi")) project = 'VSDI Pipeline' copyright = '2023, NeuroNetMem' diff --git a/pipeline_vsdi/preprocessing/utils.py b/pipeline_vsdi/preprocessing/utils.py index d925933..f25a312 100644 --- a/pipeline_vsdi/preprocessing/utils.py +++ b/pipeline_vsdi/preprocessing/utils.py @@ -40,162 +40,6 @@ import warnings from sklearn.exceptions import ConvergenceWarning - -############ -## BEHAV ### -############ - -def make_design_matrix(b_data, event_sequences, fps=50): - """ - Generates a design matrix based on the provided event sequences. - - The design matrix contains rows corresponding to frames and columns corresponding to events. Each column index in the output matrix represents an event in the event sequences. The number of columns in the design matrix equals the maximum column index specified in the event sequences plus one. - - Parameters - ---------- - event_sequences : dict - A dictionary where keys are event names and values are lists of tuples. Each tuple contains the name of an event, the duration of the event in seconds, and the column index in the output matrix. - - Returns - ------- - matrix : ndarray - Design matrix where each row corresponds to a frame and each column corresponds to an event. - - Examples - -------- - >>> event_sequences = { - ... 'Lick': [('Lick', 1, 5)], - ... 'CSp': [('CS+', 2, 0), ('CS+ Trace', 1, 1), ('Reward', 1, 4)], - ... 'CSn': [('CS-', 2, 2), ('CS- Trace', 1, 3)], - ... } - >>> design_matrix(event_sequences) - # Output: - # matrix with columns: - # 0: CS+ (2s) - # 1: CS+ trace (1s) - # 2: CS- (2s) - # 3: CS- trace (1s) - # 4: Reward (1s) - # 5: Lick - """ - frames = b_data['frames'] - length = len(frames) - n_columns = max(col for seq in event_sequences.values() for _, _, col in seq) + 1 - X = np.zeros((length, n_columns)) - - for event, sequence in event_sequences.items(): - event_data = b_data[event] - - for i in range(len(event_data)): - - frame = np.argmin(np.abs(frames - event_data[i])) - - for event_name, duration, column in sequence: - duration_unit = fps * duration if fps * duration != 0 else 1 # extreme case for licks - X[frame:(frame + int(duration_unit)), column] = 1 - frame += fps * duration - - return X - -def subsets(Set): - """ - Find start index of subsets (series of consecutive numbers) - """ - subsets = [] - start = 0 - end = 0 - - # Iterate over array - while end < len(Set): - - # Get first and last frame of each subset - while end + 1 < len(Set) and Set[end + 1] - Set[start] == end - start + 1: - end += 1 - - # Save first and last frame of each outlier subset - subsets.append(Set[start]) - start = end = end + 1 - - return np.array(subsets) - -def get_trials(feature): - """ - Find index of start of trial based on design matrix vector - """ - # Find the indices where feature is 1 - feature_trials = subsets(np.where(feature == 1)[0]) - - return feature_trials - -def compute_lick_rate(data, trial_onsets, fps): - - lick_rates = [] - - for i in range(len(trial_onsets)): - - trial_start = trial_onsets[i] - # Baseline -1 s before CS presentation - baseline_licks = np.sum(data[(trial_start-fps):trial_start]) - # Number of licks in trace period - trace_licks = np.sum(data[trial_start+(2*fps):trial_start+(3*fps)]) - # Corrected lick rate - lick_rate = trace_licks - baseline_licks - - lick_rates.append(lick_rate) - - return lick_rates - -def compute_and_add_lick_rate(df, fps): - """ - Lick Rate (Hz) per frame using X dataframe version - """ - # Group by 'Animal', 'Day', 'Session' and apply rolling window calculation - df['Lick Rate (Hz)'] = df.groupby(['Animal', 'Day', 'Session'])['Lick'].transform(lambda x: x.rolling(fps, min_periods=1).sum()) - return df - -def store_indices(animals, days, sessions, outpath): - """ - Store cumulative index (based on X matrix length) for each session, day, and animal, - as well as trial indices for CS+ and CS- trials in a nested dictionary structure. - - :param animals: List of animal names - :param days: List of days - :param sessions: List of sessions - :param outpath: Path to the output directory - :return: A nested dictionary containing the cumulative indices and trial indices - """ - # Initialize an empty dictionary - X = {animal: {day: {} for day in days} for animal in animals} - - # Iterate over all animals, days, and sessions - for animal in animals: - for day in days: - # Initialize the cumulative count - cumulative_count = 0 - - for session in sessions: - # Load design matrix - X_matrix = np.loadtxt(outpath.joinpath(f"X_{animal}_{day}_{session}.csv"), delimiter=",") - - # Here we are assuming 'CS+' info is in column 0 and 'CS-' info is in column 2 - trial_types = ['CS+', 'CS-'] - for trial_type, column in zip(trial_types, [0, 2]): - feature = X_matrix[:, column] - trial_indices = get_trials(feature) - - # Store the trial indices in the nested dictionary - if session not in X[animal][day]: - X[animal][day][session] = {} - X[animal][day][session][trial_type] = trial_indices - - # Update the cumulative count - cumulative_count += len(X_matrix) - - # Store the cumulative count in the nested dictionary - X[animal][day][session]['Cumulative Index'] = cumulative_count - - return X - ############ ### VSDI ### ############ @@ -429,7 +273,6 @@ def split_data(data, labels, axis=-1, attr=1): # Output: # {'Day1': [array([0, 1, ..., 29998, 29999]), array([30000, 30001, ..., 59998, 59999])]} """ - # Start index for slicing start = 0 # Partitioned data dictionary @@ -454,7 +297,9 @@ def split_data(data, labels, axis=-1, attr=1): return partitioned_data -### DECODING +################ +### DECODING ### +################ def train_SVM_day(t_csp_day, t_csn_day, time_bin_size, n_splits=5, n_shuffles=100, n_iter=1000, tol=1e-4): # concatenate the two ndarrays diff --git a/pipeline_vsdi/preprocessing/vsdi_preprocessing.py b/pipeline_vsdi/preprocessing/vsdi_preprocessing.py index 7ad86b9..e0edf3c 100644 --- a/pipeline_vsdi/preprocessing/vsdi_preprocessing.py +++ b/pipeline_vsdi/preprocessing/vsdi_preprocessing.py @@ -25,7 +25,6 @@ def peak_distance(component, smooth_window_size, hist_nbins): return x_max - def check_bimodal(components, th=1.0, smooth_window_size=5, hist_nbins=1000): """ Test for bimodality using moving average to smooth the histogram From 1b85e02bd64d0949d82ea6b4f5e050bc8be804c6 Mon Sep 17 00:00:00 2001 From: dabadav Date: Tue, 13 Jun 2023 17:38:43 +0200 Subject: [PATCH 19/67] Fix Dependencies poetry --- poetry.lock | 110 +++++++++++++++++++++++++++++++++++++++++++++++++ pyproject.toml | 1 + 2 files changed, 111 insertions(+) create mode 100644 poetry.lock diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..474c55b --- /dev/null +++ b/poetry.lock @@ -0,0 +1,110 @@ +# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "numpy" +version = "1.24.3" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "numpy-1.24.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3c1104d3c036fb81ab923f507536daedc718d0ad5a8707c6061cdfd6d184e570"}, + {file = "numpy-1.24.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:202de8f38fc4a45a3eea4b63e2f376e5f2dc64ef0fa692838e31a808520efaf7"}, + {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8535303847b89aa6b0f00aa1dc62867b5a32923e4d1681a35b5eef2d9591a463"}, + {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d926b52ba1367f9acb76b0df6ed21f0b16a1ad87c6720a1121674e5cf63e2b6"}, + {file = "numpy-1.24.3-cp310-cp310-win32.whl", hash = "sha256:f21c442fdd2805e91799fbe044a7b999b8571bb0ab0f7850d0cb9641a687092b"}, + {file = "numpy-1.24.3-cp310-cp310-win_amd64.whl", hash = "sha256:ab5f23af8c16022663a652d3b25dcdc272ac3f83c3af4c02eb8b824e6b3ab9d7"}, + {file = "numpy-1.24.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9a7721ec204d3a237225db3e194c25268faf92e19338a35f3a224469cb6039a3"}, + {file = "numpy-1.24.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d6cc757de514c00b24ae8cf5c876af2a7c3df189028d68c0cb4eaa9cd5afc2bf"}, + {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76e3f4e85fc5d4fd311f6e9b794d0c00e7002ec122be271f2019d63376f1d385"}, + {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1d3c026f57ceaad42f8231305d4653d5f05dc6332a730ae5c0bea3513de0950"}, + {file = "numpy-1.24.3-cp311-cp311-win32.whl", hash = "sha256:c91c4afd8abc3908e00a44b2672718905b8611503f7ff87390cc0ac3423fb096"}, + {file = "numpy-1.24.3-cp311-cp311-win_amd64.whl", hash = "sha256:5342cf6aad47943286afa6f1609cad9b4266a05e7f2ec408e2cf7aea7ff69d80"}, + {file = "numpy-1.24.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7776ea65423ca6a15255ba1872d82d207bd1e09f6d0894ee4a64678dd2204078"}, + {file = "numpy-1.24.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ae8d0be48d1b6ed82588934aaaa179875e7dc4f3d84da18d7eae6eb3f06c242c"}, + {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecde0f8adef7dfdec993fd54b0f78183051b6580f606111a6d789cd14c61ea0c"}, + {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4749e053a29364d3452c034827102ee100986903263e89884922ef01a0a6fd2f"}, + {file = "numpy-1.24.3-cp38-cp38-win32.whl", hash = "sha256:d933fabd8f6a319e8530d0de4fcc2e6a61917e0b0c271fded460032db42a0fe4"}, + {file = "numpy-1.24.3-cp38-cp38-win_amd64.whl", hash = "sha256:56e48aec79ae238f6e4395886b5eaed058abb7231fb3361ddd7bfdf4eed54289"}, + {file = "numpy-1.24.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4719d5aefb5189f50887773699eaf94e7d1e02bf36c1a9d353d9f46703758ca4"}, + {file = "numpy-1.24.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ec87a7084caa559c36e0a2309e4ecb1baa03b687201d0a847c8b0ed476a7187"}, + {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea8282b9bcfe2b5e7d491d0bf7f3e2da29700cec05b49e64d6246923329f2b02"}, + {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210461d87fb02a84ef243cac5e814aad2b7f4be953b32cb53327bb49fd77fbb4"}, + {file = "numpy-1.24.3-cp39-cp39-win32.whl", hash = "sha256:784c6da1a07818491b0ffd63c6bbe5a33deaa0e25a20e1b3ea20cf0e43f8046c"}, + {file = "numpy-1.24.3-cp39-cp39-win_amd64.whl", hash = "sha256:d5036197ecae68d7f491fcdb4df90082b0d4960ca6599ba2659957aafced7c17"}, + {file = "numpy-1.24.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:352ee00c7f8387b44d19f4cada524586f07379c0d49270f87233983bc5087ca0"}, + {file = "numpy-1.24.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7d6acc2e7524c9955e5c903160aa4ea083736fde7e91276b0e5d98e6332812"}, + {file = "numpy-1.24.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:35400e6a8d102fd07c71ed7dcadd9eb62ee9a6e84ec159bd48c28235bbb0f8e4"}, + {file = "numpy-1.24.3.tar.gz", hash = "sha256:ab344f1bf21f140adab8e47fdbc7c35a477dc01408791f8ba00d018dd0bc5155"}, +] + +[[package]] +name = "scipy" +version = "1.11.0rc1" +description = "Fundamental algorithms for scientific computing in Python" +optional = false +python-versions = "<3.13,>=3.9" +files = [ + {file = "scipy-1.11.0rc1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:af1d5b71b21f1afc0de0d166a16038587c498b691f8243e5749792f2617fd651"}, + {file = "scipy-1.11.0rc1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:73df607643dc8c17228d2bc540473d3dbd09243402d873ec0c3e9b4b1906a27c"}, + {file = "scipy-1.11.0rc1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79b199b9f5b7b1fe7f187dd2922f5ba062ccbbeec82cf2a19cd763325d6b2fe3"}, + {file = "scipy-1.11.0rc1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57f1d0ccbbf8905eda3bf454c9db49679d266e1a7c16038f5d6a630bff7ebb58"}, + {file = "scipy-1.11.0rc1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:eb1514f6cfb843bf9656b8dbb62310a52773154a1f01cad389253f96b67786ab"}, + {file = "scipy-1.11.0rc1-cp310-cp310-win_amd64.whl", hash = "sha256:f80d63babab3297f551b03d152f5b0cbf1505b7d4551c23f63b72e7379373e2c"}, + {file = "scipy-1.11.0rc1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5aa15f2fb3198c1bd2ece26f60961e1c655126b5c041c901f5c5fc2349e32ece"}, + {file = "scipy-1.11.0rc1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:88d0623211e5e54032850e69a9d3d0953f8e66b277a3fde7a0774f7636e75cdd"}, + {file = "scipy-1.11.0rc1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe2126c03b53bac3fd0c8738e25363d07643cbca48553c5603c9a546fb060807"}, + {file = "scipy-1.11.0rc1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25ca2bdb8c6b26f52412ce90d090b4d5a8c7ee5747f8c6ac1c9f587dfaa95b08"}, + {file = "scipy-1.11.0rc1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:83ac6f81fa280f6345b43abf420edba28ea018b2465644363c876b6f5b3341d6"}, + {file = "scipy-1.11.0rc1-cp311-cp311-win_amd64.whl", hash = "sha256:7e253e5bb847cc960fc3c4b87540992f080f9adfcb1fcc665d53824bff002313"}, + {file = "scipy-1.11.0rc1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ba6a6ddf6b0fed76560b5124f570473135bfd66cfd77655cb859dfdb334d4bc0"}, + {file = "scipy-1.11.0rc1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:031b9e45972f370ef9f9b5e1d9879b8cc339ea3637a9a1ea83d4dd53b1bfa3ce"}, + {file = "scipy-1.11.0rc1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82d3ae9098e05be8f2b0092dff62f73694afb82677df57fa1b3531d3fd318929"}, + {file = "scipy-1.11.0rc1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c74ce6155c495e9939569842064e994d72b352bc6cfcfa319753d94dffd16c6"}, + {file = "scipy-1.11.0rc1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3194b3ff1c5f0b7592e814307702f25f00ab457c6d553b609fc3237e48b6a42b"}, + {file = "scipy-1.11.0rc1-cp39-cp39-win_amd64.whl", hash = "sha256:353c993b9caf969182f113729375e2b5573bee77fad7b8afa7ea494dc6bb90b7"}, + {file = "scipy-1.11.0rc1.tar.gz", hash = "sha256:312420789955c875a0126c0f1f949a14c1b2e4807d0a3aff6ebe598d5760e051"}, +] + +[package.dependencies] +numpy = ">=1.21.6,<1.28.0" + +[package.extras] +dev = ["click", "cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] +doc = ["jupytext", "matplotlib (>2)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] +test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] + +[[package]] +name = "tqdm" +version = "4.65.0" +description = "Fast, Extensible Progress Meter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tqdm-4.65.0-py3-none-any.whl", hash = "sha256:c4f53a17fe37e132815abceec022631be8ffe1b9381c2e6e30aa70edc99e9671"}, + {file = "tqdm-4.65.0.tar.gz", hash = "sha256:1871fb68a86b8fb3b59ca4cdd3dcccbc7e6d613eeed31f4c332531977b89beb5"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["py-make (>=0.1.0)", "twine", "wheel"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + +[metadata] +lock-version = "2.0" +python-versions = ">=3.9,<3.13" +content-hash = "8f1674be61b4dec6b975713e9150ce48d24cd4c4e8d788123b6ad3e8e7eff564" diff --git a/pyproject.toml b/pyproject.toml index 3d34799..d9fce00 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,6 +10,7 @@ readme = "README.md" python = ">=3.9,<3.13" scipy = "^1.10.1" numpy = "^1.24.3" +tqdm = "^4.65.0" [build-system] requires = ["poetry-core"] From 847a1259b482215eb6905a3776ed54edd56a2e05 Mon Sep 17 00:00:00 2001 From: dabadav Date: Tue, 13 Jun 2023 17:39:57 +0200 Subject: [PATCH 20/67] Fix Dependencies poetry --- poetry.lock | 190 ++++++++++++++++++++++++++++++++++++++++++++++++- pyproject.toml | 1 + 2 files changed, 190 insertions(+), 1 deletion(-) diff --git a/poetry.lock b/poetry.lock index 474c55b..737c034 100644 --- a/poetry.lock +++ b/poetry.lock @@ -48,6 +48,127 @@ files = [ {file = "numpy-1.24.3.tar.gz", hash = "sha256:ab344f1bf21f140adab8e47fdbc7c35a477dc01408791f8ba00d018dd0bc5155"}, ] +[[package]] +name = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] + +[[package]] +name = "pandas" +version = "2.0.2" +description = "Powerful data structures for data analysis, time series, and statistics" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pandas-2.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ebb9f1c22ddb828e7fd017ea265a59d80461d5a79154b49a4207bd17514d122"}, + {file = "pandas-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1eb09a242184092f424b2edd06eb2b99d06dc07eeddff9929e8667d4ed44e181"}, + {file = "pandas-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7319b6e68de14e6209460f72a8d1ef13c09fb3d3ef6c37c1e65b35d50b5c145"}, + {file = "pandas-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd46bde7309088481b1cf9c58e3f0e204b9ff9e3244f441accd220dd3365ce7c"}, + {file = "pandas-2.0.2-cp310-cp310-win32.whl", hash = "sha256:51a93d422fbb1bd04b67639ba4b5368dffc26923f3ea32a275d2cc450f1d1c86"}, + {file = "pandas-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:66d00300f188fa5de73f92d5725ced162488f6dc6ad4cecfe4144ca29debe3b8"}, + {file = "pandas-2.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:02755de164da6827764ceb3bbc5f64b35cb12394b1024fdf88704d0fa06e0e2f"}, + {file = "pandas-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0a1e0576611641acde15c2322228d138258f236d14b749ad9af498ab69089e2d"}, + {file = "pandas-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6b5f14cd24a2ed06e14255ff40fe2ea0cfaef79a8dd68069b7ace74bd6acbba"}, + {file = "pandas-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50e451932b3011b61d2961b4185382c92cc8c6ee4658dcd4f320687bb2d000ee"}, + {file = "pandas-2.0.2-cp311-cp311-win32.whl", hash = "sha256:7b21cb72958fc49ad757685db1919021d99650d7aaba676576c9e88d3889d456"}, + {file = "pandas-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:c4af689352c4fe3d75b2834933ee9d0ccdbf5d7a8a7264f0ce9524e877820c08"}, + {file = "pandas-2.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:69167693cb8f9b3fc060956a5d0a0a8dbfed5f980d9fd2c306fb5b9c855c814c"}, + {file = "pandas-2.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:30a89d0fec4263ccbf96f68592fd668939481854d2ff9da709d32a047689393b"}, + {file = "pandas-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a18e5c72b989ff0f7197707ceddc99828320d0ca22ab50dd1b9e37db45b010c0"}, + {file = "pandas-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7376e13d28eb16752c398ca1d36ccfe52bf7e887067af9a0474de6331dd948d2"}, + {file = "pandas-2.0.2-cp38-cp38-win32.whl", hash = "sha256:6d6d10c2142d11d40d6e6c0a190b1f89f525bcf85564707e31b0a39e3b398e08"}, + {file = "pandas-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:e69140bc2d29a8556f55445c15f5794490852af3de0f609a24003ef174528b79"}, + {file = "pandas-2.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b42b120458636a981077cfcfa8568c031b3e8709701315e2bfa866324a83efa8"}, + {file = "pandas-2.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f908a77cbeef9bbd646bd4b81214cbef9ac3dda4181d5092a4aa9797d1bc7774"}, + {file = "pandas-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:713f2f70abcdade1ddd68fc91577cb090b3544b07ceba78a12f799355a13ee44"}, + {file = "pandas-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf3f0c361a4270185baa89ec7ab92ecaa355fe783791457077473f974f654df5"}, + {file = "pandas-2.0.2-cp39-cp39-win32.whl", hash = "sha256:598e9020d85a8cdbaa1815eb325a91cfff2bb2b23c1442549b8a3668e36f0f77"}, + {file = "pandas-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:77550c8909ebc23e56a89f91b40ad01b50c42cfbfab49b3393694a50549295ea"}, + {file = "pandas-2.0.2.tar.gz", hash = "sha256:dd5476b6c3fe410ee95926873f377b856dbc4e81a9c605a0dc05aaccc6a7c6c6"}, +] + +[package.dependencies] +numpy = [ + {version = ">=1.20.3", markers = "python_version < \"3.10\""}, + {version = ">=1.21.0", markers = "python_version >= \"3.10\""}, + {version = ">=1.23.2", markers = "python_version >= \"3.11\""}, +] +python-dateutil = ">=2.8.2" +pytz = ">=2020.1" +tzdata = ">=2022.1" + +[package.extras] +all = ["PyQt5 (>=5.15.1)", "SQLAlchemy (>=1.4.16)", "beautifulsoup4 (>=4.9.3)", "bottleneck (>=1.3.2)", "brotlipy (>=0.7.0)", "fastparquet (>=0.6.3)", "fsspec (>=2021.07.0)", "gcsfs (>=2021.07.0)", "html5lib (>=1.1)", "hypothesis (>=6.34.2)", "jinja2 (>=3.0.0)", "lxml (>=4.6.3)", "matplotlib (>=3.6.1)", "numba (>=0.53.1)", "numexpr (>=2.7.3)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pandas-gbq (>=0.15.0)", "psycopg2 (>=2.8.6)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.2)", "pytest (>=7.0.0)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)", "python-snappy (>=0.6.0)", "pyxlsb (>=1.0.8)", "qtpy (>=2.2.0)", "s3fs (>=2021.08.0)", "scipy (>=1.7.1)", "tables (>=3.6.1)", "tabulate (>=0.8.9)", "xarray (>=0.21.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)", "zstandard (>=0.15.2)"] +aws = ["s3fs (>=2021.08.0)"] +clipboard = ["PyQt5 (>=5.15.1)", "qtpy (>=2.2.0)"] +compression = ["brotlipy (>=0.7.0)", "python-snappy (>=0.6.0)", "zstandard (>=0.15.2)"] +computation = ["scipy (>=1.7.1)", "xarray (>=0.21.0)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pyxlsb (>=1.0.8)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)"] +feather = ["pyarrow (>=7.0.0)"] +fss = ["fsspec (>=2021.07.0)"] +gcp = ["gcsfs (>=2021.07.0)", "pandas-gbq (>=0.15.0)"] +hdf5 = ["tables (>=3.6.1)"] +html = ["beautifulsoup4 (>=4.9.3)", "html5lib (>=1.1)", "lxml (>=4.6.3)"] +mysql = ["SQLAlchemy (>=1.4.16)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.0.0)", "tabulate (>=0.8.9)"] +parquet = ["pyarrow (>=7.0.0)"] +performance = ["bottleneck (>=1.3.2)", "numba (>=0.53.1)", "numexpr (>=2.7.1)"] +plot = ["matplotlib (>=3.6.1)"] +postgresql = ["SQLAlchemy (>=1.4.16)", "psycopg2 (>=2.8.6)"] +spss = ["pyreadstat (>=1.1.2)"] +sql-other = ["SQLAlchemy (>=1.4.16)"] +test = ["hypothesis (>=6.34.2)", "pytest (>=7.0.0)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.6.3)"] + +[[package]] +name = "patsy" +version = "0.5.3" +description = "A Python package for describing statistical models and for building design matrices." +optional = false +python-versions = "*" +files = [ + {file = "patsy-0.5.3-py2.py3-none-any.whl", hash = "sha256:7eb5349754ed6aa982af81f636479b1b8db9d5b1a6e957a6016ec0534b5c86b7"}, + {file = "patsy-0.5.3.tar.gz", hash = "sha256:bdc18001875e319bc91c812c1eb6a10be4bb13cb81eb763f466179dca3b67277"}, +] + +[package.dependencies] +numpy = ">=1.4" +six = "*" + +[package.extras] +test = ["pytest", "pytest-cov", "scipy"] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "pytz" +version = "2023.3" +description = "World timezone definitions, modern and historical" +optional = false +python-versions = "*" +files = [ + {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"}, + {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, +] + [[package]] name = "scipy" version = "1.11.0rc1" @@ -84,6 +205,62 @@ dev = ["click", "cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyl doc = ["jupytext", "matplotlib (>2)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "statsmodels" +version = "0.14.0" +description = "Statistical computations and models for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "statsmodels-0.14.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:16bfe0c96a53b20fa19067e3b6bd2f1d39e30d4891ea0d7bc20734a0ae95942d"}, + {file = "statsmodels-0.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5a6a0a1a06ff79be8aa89c8494b33903442859add133f0dda1daf37c3c71682e"}, + {file = "statsmodels-0.14.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77b3cd3a5268ef966a0a08582c591bd29c09c88b4566c892a7c087935234f285"}, + {file = "statsmodels-0.14.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c64ebe9cf376cba0c31aed138e15ed179a1d128612dd241cdf299d159e5e882"}, + {file = "statsmodels-0.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:fb471f757fc45102a87e5d86e87dc2c8c78b34ad4f203679a46520f1d863b9da"}, + {file = "statsmodels-0.14.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:582f9e41092e342aaa04920d17cc3f97240e3ee198672f194719b5a3d08657d6"}, + {file = "statsmodels-0.14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7ebe885ccaa64b4bc5ad49ac781c246e7a594b491f08ab4cfd5aa456c363a6f6"}, + {file = "statsmodels-0.14.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b587ee5d23369a0e881da6e37f78371dce4238cf7638a455db4b633a1a1c62d6"}, + {file = "statsmodels-0.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ef7fa4813c7a73b0d8a0c830250f021c102c71c95e9fe0d6877bcfb56d38b8c"}, + {file = "statsmodels-0.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:a6ad7b8aadccd4e4dd7f315a07bef1bca41d194eeaf4ec600d20dea02d242fce"}, + {file = "statsmodels-0.14.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3757542c95247e4ab025291a740efa5da91dc11a05990c033d40fce31c450dc9"}, + {file = "statsmodels-0.14.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:de489e3ed315bdba55c9d1554a2e89faa65d212e365ab81bc323fa52681fc60e"}, + {file = "statsmodels-0.14.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76e290f4718177bffa8823a780f3b882d56dd64ad1c18cfb4bc8b5558f3f5757"}, + {file = "statsmodels-0.14.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71054f9dbcead56def14e3c9db6f66f943110fdfb19713caf0eb0f08c1ec03fd"}, + {file = "statsmodels-0.14.0-cp38-cp38-win_amd64.whl", hash = "sha256:d7fda067837df94e0a614d93d3a38fb6868958d37f7f50afe2a534524f2660cb"}, + {file = "statsmodels-0.14.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1c7724ad573af26139a98393ae64bc318d1b19762b13442d96c7a3e793f495c3"}, + {file = "statsmodels-0.14.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3b0a135f3bfdeec987e36e3b3b4c53e0bb87a8d91464d2fcc4d169d176f46fdb"}, + {file = "statsmodels-0.14.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce28eb1c397dba437ec39b9ab18f2101806f388c7a0cf9cdfd8f09294ad1c799"}, + {file = "statsmodels-0.14.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68b1c768dd94cc5ba8398121a632b673c625491aa7ed627b82cb4c880a25563f"}, + {file = "statsmodels-0.14.0-cp39-cp39-win_amd64.whl", hash = "sha256:8d1e3e10dfbfcd58119ba5a4d3c7d519182b970a2aebaf0b6f539f55ae16058d"}, + {file = "statsmodels-0.14.0.tar.gz", hash = "sha256:6875c7d689e966d948f15eb816ab5616f4928706b180cf470fd5907ab6f647a4"}, +] + +[package.dependencies] +numpy = [ + {version = ">=1.18", markers = "python_version != \"3.10\" or platform_system != \"Windows\" or platform_python_implementation == \"PyPy\""}, + {version = ">=1.22.3", markers = "python_version == \"3.10\" and platform_system == \"Windows\" and platform_python_implementation != \"PyPy\""}, +] +packaging = ">=21.3" +pandas = ">=1.0" +patsy = ">=0.5.2" +scipy = ">=1.4,<1.9.2 || >1.9.2" + +[package.extras] +build = ["cython (>=0.29.26)"] +develop = ["colorama", "cython (>=0.29.26)", "cython (>=0.29.28,<3.0.0)", "flake8", "isort", "joblib", "matplotlib (>=3)", "oldest-supported-numpy (>=2022.4.18)", "pytest (>=7.0.1,<7.1.0)", "pytest-randomly", "pytest-xdist", "pywinpty", "setuptools-scm[toml] (>=7.0.0,<7.1.0)"] +docs = ["ipykernel", "jupyter-client", "matplotlib", "nbconvert", "nbformat", "numpydoc", "pandas-datareader", "sphinx"] + [[package]] name = "tqdm" version = "4.65.0" @@ -104,7 +281,18 @@ notebook = ["ipywidgets (>=6)"] slack = ["slack-sdk"] telegram = ["requests"] +[[package]] +name = "tzdata" +version = "2023.3" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2023.3-py2.py3-none-any.whl", hash = "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda"}, + {file = "tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"}, +] + [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.13" -content-hash = "8f1674be61b4dec6b975713e9150ce48d24cd4c4e8d788123b6ad3e8e7eff564" +content-hash = "254d94c64ebe07d6596f44a4a36ed5e3992a9db653ff2223b1f74dc096c899aa" diff --git a/pyproject.toml b/pyproject.toml index d9fce00..d6758b2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,6 +11,7 @@ python = ">=3.9,<3.13" scipy = "^1.10.1" numpy = "^1.24.3" tqdm = "^4.65.0" +statsmodels = "^0.14.0" [build-system] requires = ["poetry-core"] From a4b45e2dfdadff18d951ebda063ab18ba3adcbaa Mon Sep 17 00:00:00 2001 From: dabadav Date: Tue, 13 Jun 2023 17:41:01 +0200 Subject: [PATCH 21/67] Fix Dependencies poetry --- poetry.lock | 66 +++++++++++++++++++++++++++++++++++++++++++++++++- pyproject.toml | 1 + 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/poetry.lock b/poetry.lock index 737c034..40eeabd 100644 --- a/poetry.lock +++ b/poetry.lock @@ -11,6 +11,17 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +[[package]] +name = "joblib" +version = "1.2.0" +description = "Lightweight pipelining with Python functions" +optional = false +python-versions = ">=3.7" +files = [ + {file = "joblib-1.2.0-py3-none-any.whl", hash = "sha256:091138ed78f800342968c523bdde947e7a305b8594b910a0fea2ab83c3c6d385"}, + {file = "joblib-1.2.0.tar.gz", hash = "sha256:e1cee4a79e4af22881164f218d4311f60074197fb707e082e803b61f6d137018"}, +] + [[package]] name = "numpy" version = "1.24.3" @@ -169,6 +180,48 @@ files = [ {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, ] +[[package]] +name = "scikit-learn" +version = "1.2.2" +description = "A set of python modules for machine learning and data mining" +optional = false +python-versions = ">=3.8" +files = [ + {file = "scikit-learn-1.2.2.tar.gz", hash = "sha256:8429aea30ec24e7a8c7ed8a3fa6213adf3814a6efbea09e16e0a0c71e1a1a3d7"}, + {file = "scikit_learn-1.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99cc01184e347de485bf253d19fcb3b1a3fb0ee4cea5ee3c43ec0cc429b6d29f"}, + {file = "scikit_learn-1.2.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:e6e574db9914afcb4e11ade84fab084536a895ca60aadea3041e85b8ac963edb"}, + {file = "scikit_learn-1.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fe83b676f407f00afa388dd1fdd49e5c6612e551ed84f3b1b182858f09e987d"}, + {file = "scikit_learn-1.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e2642baa0ad1e8f8188917423dd73994bf25429f8893ddbe115be3ca3183584"}, + {file = "scikit_learn-1.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:ad66c3848c0a1ec13464b2a95d0a484fd5b02ce74268eaa7e0c697b904f31d6c"}, + {file = "scikit_learn-1.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dfeaf8be72117eb61a164ea6fc8afb6dfe08c6f90365bde2dc16456e4bc8e45f"}, + {file = "scikit_learn-1.2.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:fe0aa1a7029ed3e1dcbf4a5bc675aa3b1bc468d9012ecf6c6f081251ca47f590"}, + {file = "scikit_learn-1.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:065e9673e24e0dc5113e2dd2b4ca30c9d8aa2fa90f4c0597241c93b63130d233"}, + {file = "scikit_learn-1.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf036ea7ef66115e0d49655f16febfa547886deba20149555a41d28f56fd6d3c"}, + {file = "scikit_learn-1.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:8b0670d4224a3c2d596fd572fb4fa673b2a0ccfb07152688ebd2ea0b8c61025c"}, + {file = "scikit_learn-1.2.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9c710ff9f9936ba8a3b74a455ccf0dcf59b230caa1e9ba0223773c490cab1e51"}, + {file = "scikit_learn-1.2.2-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:2dd3ffd3950e3d6c0c0ef9033a9b9b32d910c61bd06cb8206303fb4514b88a49"}, + {file = "scikit_learn-1.2.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44b47a305190c28dd8dd73fc9445f802b6ea716669cfc22ab1eb97b335d238b1"}, + {file = "scikit_learn-1.2.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:953236889928d104c2ef14027539f5f2609a47ebf716b8cbe4437e85dce42744"}, + {file = "scikit_learn-1.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:7f69313884e8eb311460cc2f28676d5e400bd929841a2c8eb8742ae78ebf7c20"}, + {file = "scikit_learn-1.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8156db41e1c39c69aa2d8599ab7577af53e9e5e7a57b0504e116cc73c39138dd"}, + {file = "scikit_learn-1.2.2-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:fe175ee1dab589d2e1033657c5b6bec92a8a3b69103e3dd361b58014729975c3"}, + {file = "scikit_learn-1.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d5312d9674bed14f73773d2acf15a3272639b981e60b72c9b190a0cffed5bad"}, + {file = "scikit_learn-1.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea061bf0283bf9a9f36ea3c5d3231ba2176221bbd430abd2603b1c3b2ed85c89"}, + {file = "scikit_learn-1.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:6477eed40dbce190f9f9e9d0d37e020815825b300121307942ec2110302b66a3"}, +] + +[package.dependencies] +joblib = ">=1.1.1" +numpy = ">=1.17.3" +scipy = ">=1.3.2" +threadpoolctl = ">=2.0.0" + +[package.extras] +benchmark = ["matplotlib (>=3.1.3)", "memory-profiler (>=0.57.0)", "pandas (>=1.0.5)"] +docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.1.3)", "memory-profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "plotly (>=5.10.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)", "sphinx (>=4.0.1)", "sphinx-gallery (>=0.7.0)", "sphinx-prompt (>=1.3.0)", "sphinxext-opengraph (>=0.4.2)"] +examples = ["matplotlib (>=3.1.3)", "pandas (>=1.0.5)", "plotly (>=5.10.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)"] +tests = ["black (>=22.3.0)", "flake8 (>=3.8.2)", "matplotlib (>=3.1.3)", "mypy (>=0.961)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pytest (>=5.3.1)", "pytest-cov (>=2.9.0)", "scikit-image (>=0.16.2)"] + [[package]] name = "scipy" version = "1.11.0rc1" @@ -261,6 +314,17 @@ build = ["cython (>=0.29.26)"] develop = ["colorama", "cython (>=0.29.26)", "cython (>=0.29.28,<3.0.0)", "flake8", "isort", "joblib", "matplotlib (>=3)", "oldest-supported-numpy (>=2022.4.18)", "pytest (>=7.0.1,<7.1.0)", "pytest-randomly", "pytest-xdist", "pywinpty", "setuptools-scm[toml] (>=7.0.0,<7.1.0)"] docs = ["ipykernel", "jupyter-client", "matplotlib", "nbconvert", "nbformat", "numpydoc", "pandas-datareader", "sphinx"] +[[package]] +name = "threadpoolctl" +version = "3.1.0" +description = "threadpoolctl" +optional = false +python-versions = ">=3.6" +files = [ + {file = "threadpoolctl-3.1.0-py3-none-any.whl", hash = "sha256:8b99adda265feb6773280df41eece7b2e6561b772d21ffd52e372f999024907b"}, + {file = "threadpoolctl-3.1.0.tar.gz", hash = "sha256:a335baacfaa4400ae1f0d8e3a58d6674d2f8828e3716bb2802c44955ad391380"}, +] + [[package]] name = "tqdm" version = "4.65.0" @@ -295,4 +359,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.13" -content-hash = "254d94c64ebe07d6596f44a4a36ed5e3992a9db653ff2223b1f74dc096c899aa" +content-hash = "3bba5e09ddbed743b112a95a1954a13565f8d579767cefdb04436cf829c7a614" diff --git a/pyproject.toml b/pyproject.toml index d6758b2..ec48c95 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,6 +12,7 @@ scipy = "^1.10.1" numpy = "^1.24.3" tqdm = "^4.65.0" statsmodels = "^0.14.0" +scikit-learn = "^1.2.2" [build-system] requires = ["poetry-core"] From 925e81435a9243717915d632ab76a07a6a692135 Mon Sep 17 00:00:00 2001 From: dabadav Date: Tue, 13 Jun 2023 17:42:02 +0200 Subject: [PATCH 22/67] Fix Dependencies poetry --- poetry.lock | 29 ++++++++++++++++++++++++++++- pyproject.toml | 1 + 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/poetry.lock b/poetry.lock index 40eeabd..60bebd8 100644 --- a/poetry.lock +++ b/poetry.lock @@ -59,6 +59,33 @@ files = [ {file = "numpy-1.24.3.tar.gz", hash = "sha256:ab344f1bf21f140adab8e47fdbc7c35a477dc01408791f8ba00d018dd0bc5155"}, ] +[[package]] +name = "opencv-python" +version = "4.7.0.72" +description = "Wrapper package for OpenCV python bindings." +optional = false +python-versions = ">=3.6" +files = [ + {file = "opencv-python-4.7.0.72.tar.gz", hash = "sha256:3424794a711f33284581f3c1e4b071cfc827d02b99d6fd9a35391f517c453306"}, + {file = "opencv_python-4.7.0.72-cp37-abi3-macosx_10_16_x86_64.whl", hash = "sha256:d4f8880440c433a0025d78804dda6901d1e8e541a561dda66892d90290aef881"}, + {file = "opencv_python-4.7.0.72-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:7a297e7651e22eb17c265ddbbc80e2ba2a8ff4f4a1696a67c45e5f5798245842"}, + {file = "opencv_python-4.7.0.72-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd08343654c6b88c5a8c25bf425f8025aed2e3189b4d7306b5861d32affaf737"}, + {file = "opencv_python-4.7.0.72-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ebfc0a3a2f57716e709028b992e4de7fd8752105d7a768531c4f434043c6f9ff"}, + {file = "opencv_python-4.7.0.72-cp37-abi3-win32.whl", hash = "sha256:eda115797b114fc16ca6f182b91c5d984f0015c19bec3145e55d33d708e9bae1"}, + {file = "opencv_python-4.7.0.72-cp37-abi3-win_amd64.whl", hash = "sha256:812af57553ec1c6709060c63f6b7e9ad07ddc0f592f3ccc6d00c71e0fe0e6376"}, +] + +[package.dependencies] +numpy = [ + {version = ">=1.21.0", markers = "python_version <= \"3.9\" and platform_system == \"Darwin\" and platform_machine == \"arm64\""}, + {version = ">=1.21.2", markers = "python_version >= \"3.10\""}, + {version = ">=1.21.4", markers = "python_version >= \"3.10\" and platform_system == \"Darwin\""}, + {version = ">=1.22.0", markers = "python_version >= \"3.11\""}, + {version = ">=1.19.3", markers = "python_version >= \"3.6\" and platform_system == \"Linux\" and platform_machine == \"aarch64\" or python_version >= \"3.9\""}, + {version = ">=1.17.0", markers = "python_version >= \"3.7\""}, + {version = ">=1.17.3", markers = "python_version >= \"3.8\""}, +] + [[package]] name = "packaging" version = "23.1" @@ -359,4 +386,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.13" -content-hash = "3bba5e09ddbed743b112a95a1954a13565f8d579767cefdb04436cf829c7a614" +content-hash = "3792652653576f4aff69ee6b2239c9a45cefb3fa2df35d1d9306a20ad944baf4" diff --git a/pyproject.toml b/pyproject.toml index ec48c95..93e0bff 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,6 +13,7 @@ numpy = "^1.24.3" tqdm = "^4.65.0" statsmodels = "^0.14.0" scikit-learn = "^1.2.2" +opencv-python = "^4.7.0.72" [build-system] requires = ["poetry-core"] From c4817751b96b93b7f81052d8165bbe305d4902c9 Mon Sep 17 00:00:00 2001 From: dabadav Date: Tue, 13 Jun 2023 17:43:06 +0200 Subject: [PATCH 23/67] Fix Dependencies poetry --- poetry.lock | 430 ++++++++++++++++++++++++++++++++++++++++++++++++- pyproject.toml | 1 + 2 files changed, 430 insertions(+), 1 deletion(-) diff --git a/poetry.lock b/poetry.lock index 60bebd8..b0d5518 100644 --- a/poetry.lock +++ b/poetry.lock @@ -11,6 +11,166 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +[[package]] +name = "contourpy" +version = "1.0.7" +description = "Python library for calculating contours of 2D quadrilateral grids" +optional = false +python-versions = ">=3.8" +files = [ + {file = "contourpy-1.0.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:95c3acddf921944f241b6773b767f1cbce71d03307270e2d769fd584d5d1092d"}, + {file = "contourpy-1.0.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fc1464c97579da9f3ab16763c32e5c5d5bb5fa1ec7ce509a4ca6108b61b84fab"}, + {file = "contourpy-1.0.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8acf74b5d383414401926c1598ed77825cd530ac7b463ebc2e4f46638f56cce6"}, + {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c71fdd8f1c0f84ffd58fca37d00ca4ebaa9e502fb49825484da075ac0b0b803"}, + {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f99e9486bf1bb979d95d5cffed40689cb595abb2b841f2991fc894b3452290e8"}, + {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87f4d8941a9564cda3f7fa6a6cd9b32ec575830780677932abdec7bcb61717b0"}, + {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9e20e5a1908e18aaa60d9077a6d8753090e3f85ca25da6e25d30dc0a9e84c2c6"}, + {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a877ada905f7d69b2a31796c4b66e31a8068b37aa9b78832d41c82fc3e056ddd"}, + {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6381fa66866b0ea35e15d197fc06ac3840a9b2643a6475c8fff267db8b9f1e69"}, + {file = "contourpy-1.0.7-cp310-cp310-win32.whl", hash = "sha256:3c184ad2433635f216645fdf0493011a4667e8d46b34082f5a3de702b6ec42e3"}, + {file = "contourpy-1.0.7-cp310-cp310-win_amd64.whl", hash = "sha256:3caea6365b13119626ee996711ab63e0c9d7496f65641f4459c60a009a1f3e80"}, + {file = "contourpy-1.0.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ed33433fc3820263a6368e532f19ddb4c5990855e4886088ad84fd7c4e561c71"}, + {file = "contourpy-1.0.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:38e2e577f0f092b8e6774459317c05a69935a1755ecfb621c0a98f0e3c09c9a5"}, + {file = "contourpy-1.0.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ae90d5a8590e5310c32a7630b4b8618cef7563cebf649011da80874d0aa8f414"}, + {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:130230b7e49825c98edf0b428b7aa1125503d91732735ef897786fe5452b1ec2"}, + {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58569c491e7f7e874f11519ef46737cea1d6eda1b514e4eb5ac7dab6aa864d02"}, + {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54d43960d809c4c12508a60b66cb936e7ed57d51fb5e30b513934a4a23874fae"}, + {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:152fd8f730c31fd67fe0ffebe1df38ab6a669403da93df218801a893645c6ccc"}, + {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:9056c5310eb1daa33fc234ef39ebfb8c8e2533f088bbf0bc7350f70a29bde1ac"}, + {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a9d7587d2fdc820cc9177139b56795c39fb8560f540bba9ceea215f1f66e1566"}, + {file = "contourpy-1.0.7-cp311-cp311-win32.whl", hash = "sha256:4ee3ee247f795a69e53cd91d927146fb16c4e803c7ac86c84104940c7d2cabf0"}, + {file = "contourpy-1.0.7-cp311-cp311-win_amd64.whl", hash = "sha256:5caeacc68642e5f19d707471890f037a13007feba8427eb7f2a60811a1fc1350"}, + {file = "contourpy-1.0.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fd7dc0e6812b799a34f6d12fcb1000539098c249c8da54f3566c6a6461d0dbad"}, + {file = "contourpy-1.0.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0f9d350b639db6c2c233d92c7f213d94d2e444d8e8fc5ca44c9706cf72193772"}, + {file = "contourpy-1.0.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e96a08b62bb8de960d3a6afbc5ed8421bf1a2d9c85cc4ea73f4bc81b4910500f"}, + {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:031154ed61f7328ad7f97662e48660a150ef84ee1bc8876b6472af88bf5a9b98"}, + {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e9ebb4425fc1b658e13bace354c48a933b842d53c458f02c86f371cecbedecc"}, + {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efb8f6d08ca7998cf59eaf50c9d60717f29a1a0a09caa46460d33b2924839dbd"}, + {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6c180d89a28787e4b73b07e9b0e2dac7741261dbdca95f2b489c4f8f887dd810"}, + {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b8d587cc39057d0afd4166083d289bdeff221ac6d3ee5046aef2d480dc4b503c"}, + {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:769eef00437edf115e24d87f8926955f00f7704bede656ce605097584f9966dc"}, + {file = "contourpy-1.0.7-cp38-cp38-win32.whl", hash = "sha256:62398c80ef57589bdbe1eb8537127321c1abcfdf8c5f14f479dbbe27d0322e66"}, + {file = "contourpy-1.0.7-cp38-cp38-win_amd64.whl", hash = "sha256:57119b0116e3f408acbdccf9eb6ef19d7fe7baf0d1e9aaa5381489bc1aa56556"}, + {file = "contourpy-1.0.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:30676ca45084ee61e9c3da589042c24a57592e375d4b138bd84d8709893a1ba4"}, + {file = "contourpy-1.0.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e927b3868bd1e12acee7cc8f3747d815b4ab3e445a28d2e5373a7f4a6e76ba1"}, + {file = "contourpy-1.0.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:366a0cf0fc079af5204801786ad7a1c007714ee3909e364dbac1729f5b0849e5"}, + {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89ba9bb365446a22411f0673abf6ee1fea3b2cf47b37533b970904880ceb72f3"}, + {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:71b0bf0c30d432278793d2141362ac853859e87de0a7dee24a1cea35231f0d50"}, + {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7281244c99fd7c6f27c1c6bfafba878517b0b62925a09b586d88ce750a016d2"}, + {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b6d0f9e1d39dbfb3977f9dd79f156c86eb03e57a7face96f199e02b18e58d32a"}, + {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7f6979d20ee5693a1057ab53e043adffa1e7418d734c1532e2d9e915b08d8ec2"}, + {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5dd34c1ae752515318224cba7fc62b53130c45ac6a1040c8b7c1a223c46e8967"}, + {file = "contourpy-1.0.7-cp39-cp39-win32.whl", hash = "sha256:c5210e5d5117e9aec8c47d9156d1d3835570dd909a899171b9535cb4a3f32693"}, + {file = "contourpy-1.0.7-cp39-cp39-win_amd64.whl", hash = "sha256:60835badb5ed5f4e194a6f21c09283dd6e007664a86101431bf870d9e86266c4"}, + {file = "contourpy-1.0.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ce41676b3d0dd16dbcfabcc1dc46090aaf4688fd6e819ef343dbda5a57ef0161"}, + {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a011cf354107b47c58ea932d13b04d93c6d1d69b8b6dce885e642531f847566"}, + {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:31a55dccc8426e71817e3fe09b37d6d48ae40aae4ecbc8c7ad59d6893569c436"}, + {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69f8ff4db108815addd900a74df665e135dbbd6547a8a69333a68e1f6e368ac2"}, + {file = "contourpy-1.0.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efe99298ba37e37787f6a2ea868265465410822f7bea163edcc1bd3903354ea9"}, + {file = "contourpy-1.0.7-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a1e97b86f73715e8670ef45292d7cc033548266f07d54e2183ecb3c87598888f"}, + {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc331c13902d0f50845099434cd936d49d7a2ca76cb654b39691974cb1e4812d"}, + {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24847601071f740837aefb730e01bd169fbcaa610209779a78db7ebb6e6a7051"}, + {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abf298af1e7ad44eeb93501e40eb5a67abbf93b5d90e468d01fc0c4451971afa"}, + {file = "contourpy-1.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:64757f6460fc55d7e16ed4f1de193f362104285c667c112b50a804d482777edd"}, + {file = "contourpy-1.0.7.tar.gz", hash = "sha256:d8165a088d31798b59e91117d1f5fc3df8168d8b48c4acc10fc0df0d0bdbcc5e"}, +] + +[package.dependencies] +numpy = ">=1.16" + +[package.extras] +bokeh = ["bokeh", "chromedriver", "selenium"] +docs = ["furo", "sphinx-copybutton"] +mypy = ["contourpy[bokeh]", "docutils-stubs", "mypy (==0.991)", "types-Pillow"] +test = ["Pillow", "matplotlib", "pytest"] +test-no-images = ["pytest"] + +[[package]] +name = "cycler" +version = "0.11.0" +description = "Composable style cycles" +optional = false +python-versions = ">=3.6" +files = [ + {file = "cycler-0.11.0-py3-none-any.whl", hash = "sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3"}, + {file = "cycler-0.11.0.tar.gz", hash = "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f"}, +] + +[[package]] +name = "fonttools" +version = "4.40.0" +description = "Tools to manipulate font files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fonttools-4.40.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b802dcbf9bcff74672f292b2466f6589ab8736ce4dcf36f48eb994c2847c4b30"}, + {file = "fonttools-4.40.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7f6e3fa3da923063c286320e728ba2270e49c73386e3a711aa680f4b0747d692"}, + {file = "fonttools-4.40.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fdf60f8a5c6bcce7d024a33f7e4bc7921f5b74e8ea13bccd204f2c8b86f3470"}, + {file = "fonttools-4.40.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91784e21a1a085fac07c6a407564f4a77feb471b5954c9ee55a4f9165151f6c1"}, + {file = "fonttools-4.40.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:05171f3c546f64d78569f10adc0de72561882352cac39ec7439af12304d8d8c0"}, + {file = "fonttools-4.40.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7449e5e306f3a930a8944c85d0cbc8429cba13503372a1a40f23124d6fb09b58"}, + {file = "fonttools-4.40.0-cp310-cp310-win32.whl", hash = "sha256:bae8c13abbc2511e9a855d2142c0ab01178dd66b1a665798f357da0d06253e0d"}, + {file = "fonttools-4.40.0-cp310-cp310-win_amd64.whl", hash = "sha256:425b74a608427499b0e45e433c34ddc350820b6f25b7c8761963a08145157a66"}, + {file = "fonttools-4.40.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:00ab569b2a3e591e00425023ade87e8fef90380c1dde61be7691cb524ca5f743"}, + {file = "fonttools-4.40.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:18ea64ac43e94c9e0c23d7a9475f1026be0e25b10dda8f236fc956188761df97"}, + {file = "fonttools-4.40.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:022c4a16b412293e7f1ce21b8bab7a6f9d12c4ffdf171fdc67122baddb973069"}, + {file = "fonttools-4.40.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:530c5d35109f3e0cea2535742d6a3bc99c0786cf0cbd7bb2dc9212387f0d908c"}, + {file = "fonttools-4.40.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5e00334c66f4e83535384cb5339526d01d02d77f142c23b2f97bd6a4f585497a"}, + {file = "fonttools-4.40.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb52c10fda31159c22c7ed85074e05f8b97da8773ea461706c273e31bcbea836"}, + {file = "fonttools-4.40.0-cp311-cp311-win32.whl", hash = "sha256:6a8d71b9a5c884c72741868e845c0e563c5d83dcaf10bb0ceeec3b4b2eb14c67"}, + {file = "fonttools-4.40.0-cp311-cp311-win_amd64.whl", hash = "sha256:15abb3d055c1b2dff9ce376b6c3db10777cb74b37b52b78f61657634fd348a0d"}, + {file = "fonttools-4.40.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:14037c31138fbd21847ad5e5441dfdde003e0a8f3feb5812a1a21fd1c255ffbd"}, + {file = "fonttools-4.40.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:94c915f6716589f78bc00fbc14c5b8de65cfd11ee335d32504f1ef234524cb24"}, + {file = "fonttools-4.40.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37467cee0f32cada2ec08bc16c9c31f9b53ea54b2f5604bf25a1246b5f50593a"}, + {file = "fonttools-4.40.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56d4d85f5374b45b08d2f928517d1e313ea71b4847240398decd0ab3ebbca885"}, + {file = "fonttools-4.40.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8c4305b171b61040b1ee75d18f9baafe58bd3b798d1670078efe2c92436bfb63"}, + {file = "fonttools-4.40.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a954b90d1473c85a22ecf305761d9fd89da93bbd31dae86e7dea436ad2cb5dc9"}, + {file = "fonttools-4.40.0-cp38-cp38-win32.whl", hash = "sha256:1bc4c5b147be8dbc5df9cc8ac5e93ee914ad030fe2a201cc8f02f499db71011d"}, + {file = "fonttools-4.40.0-cp38-cp38-win_amd64.whl", hash = "sha256:8a917828dbfdb1cbe50cf40eeae6fbf9c41aef9e535649ed8f4982b2ef65c091"}, + {file = "fonttools-4.40.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:882983279bf39afe4e945109772c2ffad2be2c90983d6559af8b75c19845a80a"}, + {file = "fonttools-4.40.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c55f1b4109dbc3aeb496677b3e636d55ef46dc078c2a5e3f3db4e90f1c6d2907"}, + {file = "fonttools-4.40.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec468c022d09f1817c691cf884feb1030ef6f1e93e3ea6831b0d8144c06480d1"}, + {file = "fonttools-4.40.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d5adf4ba114f028fc3f5317a221fd8b0f4ef7a2e5524a2b1e0fd891b093791a"}, + {file = "fonttools-4.40.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:aa83b3f151bc63970f39b2b42a06097c5a22fd7ed9f7ba008e618de4503d3895"}, + {file = "fonttools-4.40.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:97d95b8301b62bdece1af943b88bcb3680fd385f88346a4a899ee145913b414a"}, + {file = "fonttools-4.40.0-cp39-cp39-win32.whl", hash = "sha256:1a003608400dd1cca3e089e8c94973c6b51a4fb1ef00ff6d7641617b9242e637"}, + {file = "fonttools-4.40.0-cp39-cp39-win_amd64.whl", hash = "sha256:7961575221e3da0841c75da53833272c520000d76f7f71274dbf43370f8a1065"}, + {file = "fonttools-4.40.0-py3-none-any.whl", hash = "sha256:200729d12461e2038700d31f0d49ad5a7b55855dec7525074979a06b46f88505"}, + {file = "fonttools-4.40.0.tar.gz", hash = "sha256:337b6e83d7ee73c40ea62407f2ce03b07c3459e213b6f332b94a69923b9e1cb9"}, +] + +[package.extras] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.0.0)", "xattr", "zopfli (>=0.1.4)"] +graphite = ["lz4 (>=1.7.4.2)"] +interpolatable = ["munkres", "scipy"] +lxml = ["lxml (>=4.0,<5)"] +pathops = ["skia-pathops (>=0.5.0)"] +plot = ["matplotlib"] +repacker = ["uharfbuzz (>=0.23.0)"] +symfont = ["sympy"] +type1 = ["xattr"] +ufo = ["fs (>=2.2.0,<3)"] +unicode = ["unicodedata2 (>=15.0.0)"] +woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] + +[[package]] +name = "importlib-resources" +version = "5.12.0" +description = "Read resources from Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "importlib_resources-5.12.0-py3-none-any.whl", hash = "sha256:7b1deeebbf351c7578e09bf2f63fa2ce8b5ffec296e0d349139d43cca061a81a"}, + {file = "importlib_resources-5.12.0.tar.gz", hash = "sha256:4be82589bf5c1d7999aedf2a45159d10cb3ca4f19b2271f8792bc8e6da7b22f6"}, +] + +[package.dependencies] +zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] + [[package]] name = "joblib" version = "1.2.0" @@ -22,6 +182,145 @@ files = [ {file = "joblib-1.2.0.tar.gz", hash = "sha256:e1cee4a79e4af22881164f218d4311f60074197fb707e082e803b61f6d137018"}, ] +[[package]] +name = "kiwisolver" +version = "1.4.4" +description = "A fast implementation of the Cassowary constraint solver" +optional = false +python-versions = ">=3.7" +files = [ + {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2f5e60fabb7343a836360c4f0919b8cd0d6dbf08ad2ca6b9cf90bf0c76a3c4f6"}, + {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:10ee06759482c78bdb864f4109886dff7b8a56529bc1609d4f1112b93fe6423c"}, + {file = "kiwisolver-1.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c79ebe8f3676a4c6630fd3f777f3cfecf9289666c84e775a67d1d358578dc2e3"}, + {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:abbe9fa13da955feb8202e215c4018f4bb57469b1b78c7a4c5c7b93001699938"}, + {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7577c1987baa3adc4b3c62c33bd1118c3ef5c8ddef36f0f2c950ae0b199e100d"}, + {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ad8285b01b0d4695102546b342b493b3ccc6781fc28c8c6a1bb63e95d22f09"}, + {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ed58b8acf29798b036d347791141767ccf65eee7f26bde03a71c944449e53de"}, + {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a68b62a02953b9841730db7797422f983935aeefceb1679f0fc85cbfbd311c32"}, + {file = "kiwisolver-1.4.4-cp310-cp310-win32.whl", hash = "sha256:e92a513161077b53447160b9bd8f522edfbed4bd9759e4c18ab05d7ef7e49408"}, + {file = "kiwisolver-1.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:3fe20f63c9ecee44560d0e7f116b3a747a5d7203376abeea292ab3152334d004"}, + {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ea21f66820452a3f5d1655f8704a60d66ba1191359b96541eaf457710a5fc6"}, + {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bc9db8a3efb3e403e4ecc6cd9489ea2bac94244f80c78e27c31dcc00d2790ac2"}, + {file = "kiwisolver-1.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d5b61785a9ce44e5a4b880272baa7cf6c8f48a5180c3e81c59553ba0cb0821ca"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c2dbb44c3f7e6c4d3487b31037b1bdbf424d97687c1747ce4ff2895795c9bf69"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6295ecd49304dcf3bfbfa45d9a081c96509e95f4b9d0eb7ee4ec0530c4a96514"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4bd472dbe5e136f96a4b18f295d159d7f26fd399136f5b17b08c4e5f498cd494"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf7d9fce9bcc4752ca4a1b80aabd38f6d19009ea5cbda0e0856983cf6d0023f5"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78d6601aed50c74e0ef02f4204da1816147a6d3fbdc8b3872d263338a9052c51"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:877272cf6b4b7e94c9614f9b10140e198d2186363728ed0f701c6eee1baec1da"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:db608a6757adabb32f1cfe6066e39b3706d8c3aa69bbc353a5b61edad36a5cb4"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5853eb494c71e267912275e5586fe281444eb5e722de4e131cddf9d442615626"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f0a1dbdb5ecbef0d34eb77e56fcb3e95bbd7e50835d9782a45df81cc46949750"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:283dffbf061a4ec60391d51e6155e372a1f7a4f5b15d59c8505339454f8989e4"}, + {file = "kiwisolver-1.4.4-cp311-cp311-win32.whl", hash = "sha256:d06adcfa62a4431d404c31216f0f8ac97397d799cd53800e9d3efc2fbb3cf14e"}, + {file = "kiwisolver-1.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:e7da3fec7408813a7cebc9e4ec55afed2d0fd65c4754bc376bf03498d4e92686"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:62ac9cc684da4cf1778d07a89bf5f81b35834cb96ca523d3a7fb32509380cbf6"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41dae968a94b1ef1897cb322b39360a0812661dba7c682aa45098eb8e193dbdf"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02f79693ec433cb4b5f51694e8477ae83b3205768a6fb48ffba60549080e295b"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d0611a0a2a518464c05ddd5a3a1a0e856ccc10e67079bb17f265ad19ab3c7597"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:db5283d90da4174865d520e7366801a93777201e91e79bacbac6e6927cbceede"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1041feb4cda8708ce73bb4dcb9ce1ccf49d553bf87c3954bdfa46f0c3f77252c"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-win32.whl", hash = "sha256:a553dadda40fef6bfa1456dc4be49b113aa92c2a9a9e8711e955618cd69622e3"}, + {file = "kiwisolver-1.4.4-cp37-cp37m-win_amd64.whl", hash = "sha256:03baab2d6b4a54ddbb43bba1a3a2d1627e82d205c5cf8f4c924dc49284b87166"}, + {file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:841293b17ad704d70c578f1f0013c890e219952169ce8a24ebc063eecf775454"}, + {file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f4f270de01dd3e129a72efad823da90cc4d6aafb64c410c9033aba70db9f1ff0"}, + {file = "kiwisolver-1.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f9f39e2f049db33a908319cf46624a569b36983c7c78318e9726a4cb8923b26c"}, + {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c97528e64cb9ebeff9701e7938653a9951922f2a38bd847787d4a8e498cc83ae"}, + {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d1573129aa0fd901076e2bfb4275a35f5b7aa60fbfb984499d661ec950320b0"}, + {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ad881edc7ccb9d65b0224f4e4d05a1e85cf62d73aab798943df6d48ab0cd79a1"}, + {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b428ef021242344340460fa4c9185d0b1f66fbdbfecc6c63eff4b7c29fad429d"}, + {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2e407cb4bd5a13984a6c2c0fe1845e4e41e96f183e5e5cd4d77a857d9693494c"}, + {file = "kiwisolver-1.4.4-cp38-cp38-win32.whl", hash = "sha256:75facbe9606748f43428fc91a43edb46c7ff68889b91fa31f53b58894503a191"}, + {file = "kiwisolver-1.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:5bce61af018b0cb2055e0e72e7d65290d822d3feee430b7b8203d8a855e78766"}, + {file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8c808594c88a025d4e322d5bb549282c93c8e1ba71b790f539567932722d7bd8"}, + {file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0a71d85ecdd570ded8ac3d1c0f480842f49a40beb423bb8014539a9f32a5897"}, + {file = "kiwisolver-1.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b533558eae785e33e8c148a8d9921692a9fe5aa516efbdff8606e7d87b9d5824"}, + {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:efda5fc8cc1c61e4f639b8067d118e742b812c930f708e6667a5ce0d13499e29"}, + {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7c43e1e1206cd421cd92e6b3280d4385d41d7166b3ed577ac20444b6995a445f"}, + {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc8d3bd6c72b2dd9decf16ce70e20abcb3274ba01b4e1c96031e0c4067d1e7cd"}, + {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ea39b0ccc4f5d803e3337dd46bcce60b702be4d86fd0b3d7531ef10fd99a1ac"}, + {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:968f44fdbf6dd757d12920d63b566eeb4d5b395fd2d00d29d7ef00a00582aac9"}, + {file = "kiwisolver-1.4.4-cp39-cp39-win32.whl", hash = "sha256:da7e547706e69e45d95e116e6939488d62174e033b763ab1496b4c29b76fabea"}, + {file = "kiwisolver-1.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:ba59c92039ec0a66103b1d5fe588fa546373587a7d68f5c96f743c3396afc04b"}, + {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:91672bacaa030f92fc2f43b620d7b337fd9a5af28b0d6ed3f77afc43c4a64b5a"}, + {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:787518a6789009c159453da4d6b683f468ef7a65bbde796bcea803ccf191058d"}, + {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da152d8cdcab0e56e4f45eb08b9aea6455845ec83172092f09b0e077ece2cf7a"}, + {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ecb1fa0db7bf4cff9dac752abb19505a233c7f16684c5826d1f11ebd9472b871"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:28bc5b299f48150b5f822ce68624e445040595a4ac3d59251703779836eceff9"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:81e38381b782cc7e1e46c4e14cd997ee6040768101aefc8fa3c24a4cc58e98f8"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2a66fdfb34e05b705620dd567f5a03f239a088d5a3f321e7b6ac3239d22aa286"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:872b8ca05c40d309ed13eb2e582cab0c5a05e81e987ab9c521bf05ad1d5cf5cb"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:70e7c2e7b750585569564e2e5ca9845acfaa5da56ac46df68414f29fea97be9f"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9f85003f5dfa867e86d53fac6f7e6f30c045673fa27b603c397753bebadc3008"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e307eb9bd99801f82789b44bb45e9f541961831c7311521b13a6c85afc09767"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1792d939ec70abe76f5054d3f36ed5656021dcad1322d1cc996d4e54165cef9"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6cb459eea32a4e2cf18ba5fcece2dbdf496384413bc1bae15583f19e567f3b2"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36dafec3d6d6088d34e2de6b85f9d8e2324eb734162fba59d2ba9ed7a2043d5b"}, + {file = "kiwisolver-1.4.4.tar.gz", hash = "sha256:d41997519fcba4a1e46eb4a2fe31bc12f0ff957b2b81bac28db24744f333e955"}, +] + +[[package]] +name = "matplotlib" +version = "3.7.1" +description = "Python plotting package" +optional = false +python-versions = ">=3.8" +files = [ + {file = "matplotlib-3.7.1-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:95cbc13c1fc6844ab8812a525bbc237fa1470863ff3dace7352e910519e194b1"}, + {file = "matplotlib-3.7.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:08308bae9e91aca1ec6fd6dda66237eef9f6294ddb17f0d0b3c863169bf82353"}, + {file = "matplotlib-3.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:544764ba51900da4639c0f983b323d288f94f65f4024dc40ecb1542d74dc0500"}, + {file = "matplotlib-3.7.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56d94989191de3fcc4e002f93f7f1be5da476385dde410ddafbb70686acf00ea"}, + {file = "matplotlib-3.7.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e99bc9e65901bb9a7ce5e7bb24af03675cbd7c70b30ac670aa263240635999a4"}, + {file = "matplotlib-3.7.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb7d248c34a341cd4c31a06fd34d64306624c8cd8d0def7abb08792a5abfd556"}, + {file = "matplotlib-3.7.1-cp310-cp310-win32.whl", hash = "sha256:ce463ce590f3825b52e9fe5c19a3c6a69fd7675a39d589e8b5fbe772272b3a24"}, + {file = "matplotlib-3.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:3d7bc90727351fb841e4d8ae620d2d86d8ed92b50473cd2b42ce9186104ecbba"}, + {file = "matplotlib-3.7.1-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:770a205966d641627fd5cf9d3cb4b6280a716522cd36b8b284a8eb1581310f61"}, + {file = "matplotlib-3.7.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f67bfdb83a8232cb7a92b869f9355d677bce24485c460b19d01970b64b2ed476"}, + {file = "matplotlib-3.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2bf092f9210e105f414a043b92af583c98f50050559616930d884387d0772aba"}, + {file = "matplotlib-3.7.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89768d84187f31717349c6bfadc0e0d8c321e8eb34522acec8a67b1236a66332"}, + {file = "matplotlib-3.7.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83111e6388dec67822e2534e13b243cc644c7494a4bb60584edbff91585a83c6"}, + {file = "matplotlib-3.7.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a867bf73a7eb808ef2afbca03bcdb785dae09595fbe550e1bab0cd023eba3de0"}, + {file = "matplotlib-3.7.1-cp311-cp311-win32.whl", hash = "sha256:fbdeeb58c0cf0595efe89c05c224e0a502d1aa6a8696e68a73c3efc6bc354304"}, + {file = "matplotlib-3.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:c0bd19c72ae53e6ab979f0ac6a3fafceb02d2ecafa023c5cca47acd934d10be7"}, + {file = "matplotlib-3.7.1-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:6eb88d87cb2c49af00d3bbc33a003f89fd9f78d318848da029383bfc08ecfbfb"}, + {file = "matplotlib-3.7.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:cf0e4f727534b7b1457898c4f4ae838af1ef87c359b76dcd5330fa31893a3ac7"}, + {file = "matplotlib-3.7.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:46a561d23b91f30bccfd25429c3c706afe7d73a5cc64ef2dfaf2b2ac47c1a5dc"}, + {file = "matplotlib-3.7.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8704726d33e9aa8a6d5215044b8d00804561971163563e6e6591f9dcf64340cc"}, + {file = "matplotlib-3.7.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4cf327e98ecf08fcbb82685acaf1939d3338548620ab8dfa02828706402c34de"}, + {file = "matplotlib-3.7.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:617f14ae9d53292ece33f45cba8503494ee199a75b44de7717964f70637a36aa"}, + {file = "matplotlib-3.7.1-cp38-cp38-win32.whl", hash = "sha256:7c9a4b2da6fac77bcc41b1ea95fadb314e92508bf5493ceff058e727e7ecf5b0"}, + {file = "matplotlib-3.7.1-cp38-cp38-win_amd64.whl", hash = "sha256:14645aad967684e92fc349493fa10c08a6da514b3d03a5931a1bac26e6792bd1"}, + {file = "matplotlib-3.7.1-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:81a6b377ea444336538638d31fdb39af6be1a043ca5e343fe18d0f17e098770b"}, + {file = "matplotlib-3.7.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:28506a03bd7f3fe59cd3cd4ceb2a8d8a2b1db41afede01f66c42561b9be7b4b7"}, + {file = "matplotlib-3.7.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8c587963b85ce41e0a8af53b9b2de8dddbf5ece4c34553f7bd9d066148dc719c"}, + {file = "matplotlib-3.7.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8bf26ade3ff0f27668989d98c8435ce9327d24cffb7f07d24ef609e33d582439"}, + {file = "matplotlib-3.7.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:def58098f96a05f90af7e92fd127d21a287068202aa43b2a93476170ebd99e87"}, + {file = "matplotlib-3.7.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f883a22a56a84dba3b588696a2b8a1ab0d2c3d41be53264115c71b0a942d8fdb"}, + {file = "matplotlib-3.7.1-cp39-cp39-win32.whl", hash = "sha256:4f99e1b234c30c1e9714610eb0c6d2f11809c9c78c984a613ae539ea2ad2eb4b"}, + {file = "matplotlib-3.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:3ba2af245e36990facf67fde840a760128ddd71210b2ab6406e640188d69d136"}, + {file = "matplotlib-3.7.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3032884084f541163f295db8a6536e0abb0db464008fadca6c98aaf84ccf4717"}, + {file = "matplotlib-3.7.1-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a2cb34336110e0ed8bb4f650e817eed61fa064acbefeb3591f1b33e3a84fd96"}, + {file = "matplotlib-3.7.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b867e2f952ed592237a1828f027d332d8ee219ad722345b79a001f49df0936eb"}, + {file = "matplotlib-3.7.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:57bfb8c8ea253be947ccb2bc2d1bb3862c2bccc662ad1b4626e1f5e004557042"}, + {file = "matplotlib-3.7.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:438196cdf5dc8d39b50a45cb6e3f6274edbcf2254f85fa9b895bf85851c3a613"}, + {file = "matplotlib-3.7.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:21e9cff1a58d42e74d01153360de92b326708fb205250150018a52c70f43c290"}, + {file = "matplotlib-3.7.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75d4725d70b7c03e082bbb8a34639ede17f333d7247f56caceb3801cb6ff703d"}, + {file = "matplotlib-3.7.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:97cc368a7268141afb5690760921765ed34867ffb9655dd325ed207af85c7529"}, + {file = "matplotlib-3.7.1.tar.gz", hash = "sha256:7b73305f25eab4541bd7ee0b96d87e53ae9c9f1823be5659b806cd85786fe882"}, +] + +[package.dependencies] +contourpy = ">=1.0.1" +cycler = ">=0.10" +fonttools = ">=4.22.0" +importlib-resources = {version = ">=3.2.0", markers = "python_version < \"3.10\""} +kiwisolver = ">=1.0.1" +numpy = ">=1.20" +packaging = ">=20.0" +pillow = ">=6.2.0" +pyparsing = ">=2.3.1" +python-dateutil = ">=2.7" + [[package]] name = "numpy" version = "1.24.3" @@ -182,6 +481,99 @@ six = "*" [package.extras] test = ["pytest", "pytest-cov", "scipy"] +[[package]] +name = "pillow" +version = "9.5.0" +description = "Python Imaging Library (Fork)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Pillow-9.5.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:ace6ca218308447b9077c14ea4ef381ba0b67ee78d64046b3f19cf4e1139ad16"}, + {file = "Pillow-9.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d3d403753c9d5adc04d4694d35cf0391f0f3d57c8e0030aac09d7678fa8030aa"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ba1b81ee69573fe7124881762bb4cd2e4b6ed9dd28c9c60a632902fe8db8b38"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe7e1c262d3392afcf5071df9afa574544f28eac825284596ac6db56e6d11062"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f36397bf3f7d7c6a3abdea815ecf6fd14e7fcd4418ab24bae01008d8d8ca15e"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:252a03f1bdddce077eff2354c3861bf437c892fb1832f75ce813ee94347aa9b5"}, + {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:85ec677246533e27770b0de5cf0f9d6e4ec0c212a1f89dfc941b64b21226009d"}, + {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b416f03d37d27290cb93597335a2f85ed446731200705b22bb927405320de903"}, + {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1781a624c229cb35a2ac31cc4a77e28cafc8900733a864870c49bfeedacd106a"}, + {file = "Pillow-9.5.0-cp310-cp310-win32.whl", hash = "sha256:8507eda3cd0608a1f94f58c64817e83ec12fa93a9436938b191b80d9e4c0fc44"}, + {file = "Pillow-9.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:d3c6b54e304c60c4181da1c9dadf83e4a54fd266a99c70ba646a9baa626819eb"}, + {file = "Pillow-9.5.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:7ec6f6ce99dab90b52da21cf0dc519e21095e332ff3b399a357c187b1a5eee32"}, + {file = "Pillow-9.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:560737e70cb9c6255d6dcba3de6578a9e2ec4b573659943a5e7e4af13f298f5c"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96e88745a55b88a7c64fa49bceff363a1a27d9a64e04019c2281049444a571e3"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d9c206c29b46cfd343ea7cdfe1232443072bbb270d6a46f59c259460db76779a"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfcc2c53c06f2ccb8976fb5c71d448bdd0a07d26d8e07e321c103416444c7ad1"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:a0f9bb6c80e6efcde93ffc51256d5cfb2155ff8f78292f074f60f9e70b942d99"}, + {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8d935f924bbab8f0a9a28404422da8af4904e36d5c33fc6f677e4c4485515625"}, + {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fed1e1cf6a42577953abbe8e6cf2fe2f566daebde7c34724ec8803c4c0cda579"}, + {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c1170d6b195555644f0616fd6ed929dfcf6333b8675fcca044ae5ab110ded296"}, + {file = "Pillow-9.5.0-cp311-cp311-win32.whl", hash = "sha256:54f7102ad31a3de5666827526e248c3530b3a33539dbda27c6843d19d72644ec"}, + {file = "Pillow-9.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:cfa4561277f677ecf651e2b22dc43e8f5368b74a25a8f7d1d4a3a243e573f2d4"}, + {file = "Pillow-9.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:965e4a05ef364e7b973dd17fc765f42233415974d773e82144c9bbaaaea5d089"}, + {file = "Pillow-9.5.0-cp312-cp312-win32.whl", hash = "sha256:22baf0c3cf0c7f26e82d6e1adf118027afb325e703922c8dfc1d5d0156bb2eeb"}, + {file = "Pillow-9.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:432b975c009cf649420615388561c0ce7cc31ce9b2e374db659ee4f7d57a1f8b"}, + {file = "Pillow-9.5.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:5d4ebf8e1db4441a55c509c4baa7a0587a0210f7cd25fcfe74dbbce7a4bd1906"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:375f6e5ee9620a271acb6820b3d1e94ffa8e741c0601db4c0c4d3cb0a9c224bf"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99eb6cafb6ba90e436684e08dad8be1637efb71c4f2180ee6b8f940739406e78"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dfaaf10b6172697b9bceb9a3bd7b951819d1ca339a5ef294d1f1ac6d7f63270"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:763782b2e03e45e2c77d7779875f4432e25121ef002a41829d8868700d119392"}, + {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:35f6e77122a0c0762268216315bf239cf52b88865bba522999dc38f1c52b9b47"}, + {file = "Pillow-9.5.0-cp37-cp37m-win32.whl", hash = "sha256:aca1c196f407ec7cf04dcbb15d19a43c507a81f7ffc45b690899d6a76ac9fda7"}, + {file = "Pillow-9.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322724c0032af6692456cd6ed554bb85f8149214d97398bb80613b04e33769f6"}, + {file = "Pillow-9.5.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:a0aa9417994d91301056f3d0038af1199eb7adc86e646a36b9e050b06f526597"}, + {file = "Pillow-9.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f8286396b351785801a976b1e85ea88e937712ee2c3ac653710a4a57a8da5d9c"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c830a02caeb789633863b466b9de10c015bded434deb3ec87c768e53752ad22a"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fbd359831c1657d69bb81f0db962905ee05e5e9451913b18b831febfe0519082"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8fc330c3370a81bbf3f88557097d1ea26cd8b019d6433aa59f71195f5ddebbf"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:7002d0797a3e4193c7cdee3198d7c14f92c0836d6b4a3f3046a64bd1ce8df2bf"}, + {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:229e2c79c00e85989a34b5981a2b67aa079fd08c903f0aaead522a1d68d79e51"}, + {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9adf58f5d64e474bed00d69bcd86ec4bcaa4123bfa70a65ce72e424bfb88ed96"}, + {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:662da1f3f89a302cc22faa9f14a262c2e3951f9dbc9617609a47521c69dd9f8f"}, + {file = "Pillow-9.5.0-cp38-cp38-win32.whl", hash = "sha256:6608ff3bf781eee0cd14d0901a2b9cc3d3834516532e3bd673a0a204dc8615fc"}, + {file = "Pillow-9.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:e49eb4e95ff6fd7c0c402508894b1ef0e01b99a44320ba7d8ecbabefddcc5569"}, + {file = "Pillow-9.5.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:482877592e927fd263028c105b36272398e3e1be3269efda09f6ba21fd83ec66"}, + {file = "Pillow-9.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3ded42b9ad70e5f1754fb7c2e2d6465a9c842e41d178f262e08b8c85ed8a1d8e"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c446d2245ba29820d405315083d55299a796695d747efceb5717a8b450324115"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aca1152d93dcc27dc55395604dcfc55bed5f25ef4c98716a928bacba90d33a3"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:608488bdcbdb4ba7837461442b90ea6f3079397ddc968c31265c1e056964f1ef"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:60037a8db8750e474af7ffc9faa9b5859e6c6d0a50e55c45576bf28be7419705"}, + {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:07999f5834bdc404c442146942a2ecadd1cb6292f5229f4ed3b31e0a108746b1"}, + {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a127ae76092974abfbfa38ca2d12cbeddcdeac0fb71f9627cc1135bedaf9d51a"}, + {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:489f8389261e5ed43ac8ff7b453162af39c3e8abd730af8363587ba64bb2e865"}, + {file = "Pillow-9.5.0-cp39-cp39-win32.whl", hash = "sha256:9b1af95c3a967bf1da94f253e56b6286b50af23392a886720f563c547e48e964"}, + {file = "Pillow-9.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:77165c4a5e7d5a284f10a6efaa39a0ae8ba839da344f20b111d62cc932fa4e5d"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:833b86a98e0ede388fa29363159c9b1a294b0905b5128baf01db683672f230f5"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aaf305d6d40bd9632198c766fb64f0c1a83ca5b667f16c1e79e1661ab5060140"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0852ddb76d85f127c135b6dd1f0bb88dbb9ee990d2cd9aa9e28526c93e794fba"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:91ec6fe47b5eb5a9968c79ad9ed78c342b1f97a091677ba0e012701add857829"}, + {file = "Pillow-9.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cb841572862f629b99725ebaec3287fc6d275be9b14443ea746c1dd325053cbd"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c380b27d041209b849ed246b111b7c166ba36d7933ec6e41175fd15ab9eb1572"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c9af5a3b406a50e313467e3565fc99929717f780164fe6fbb7704edba0cebbe"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5671583eab84af046a397d6d0ba25343c00cd50bce03787948e0fff01d4fd9b1"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:84a6f19ce086c1bf894644b43cd129702f781ba5751ca8572f08aa40ef0ab7b7"}, + {file = "Pillow-9.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1e7723bd90ef94eda669a3c2c19d549874dd5badaeefabefd26053304abe5799"}, + {file = "Pillow-9.5.0.tar.gz", hash = "sha256:bf548479d336726d7a0eceb6e767e179fbde37833ae42794602631a070d630f1"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "pyparsing" +version = "3.0.9" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +optional = false +python-versions = ">=3.6.8" +files = [ + {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, + {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + [[package]] name = "python-dateutil" version = "2.8.2" @@ -285,6 +677,27 @@ dev = ["click", "cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyl doc = ["jupytext", "matplotlib (>2)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +[[package]] +name = "seaborn" +version = "0.12.2" +description = "Statistical data visualization" +optional = false +python-versions = ">=3.7" +files = [ + {file = "seaborn-0.12.2-py3-none-any.whl", hash = "sha256:ebf15355a4dba46037dfd65b7350f014ceb1f13c05e814eda2c9f5fd731afc08"}, + {file = "seaborn-0.12.2.tar.gz", hash = "sha256:374645f36509d0dcab895cba5b47daf0586f77bfe3b36c97c607db7da5be0139"}, +] + +[package.dependencies] +matplotlib = ">=3.1,<3.6.1 || >3.6.1" +numpy = ">=1.17,<1.24.0 || >1.24.0" +pandas = ">=0.25" + +[package.extras] +dev = ["flake8", "flit", "mypy", "pandas-stubs", "pre-commit", "pytest", "pytest-cov", "pytest-xdist"] +docs = ["ipykernel", "nbconvert", "numpydoc", "pydata_sphinx_theme (==0.10.0rc2)", "pyyaml", "sphinx-copybutton", "sphinx-design", "sphinx-issues"] +stats = ["scipy (>=1.3)", "statsmodels (>=0.10)"] + [[package]] name = "six" version = "1.16.0" @@ -383,7 +796,22 @@ files = [ {file = "tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"}, ] +[[package]] +name = "zipp" +version = "3.15.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +optional = false +python-versions = ">=3.7" +files = [ + {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, + {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] + [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.13" -content-hash = "3792652653576f4aff69ee6b2239c9a45cefb3fa2df35d1d9306a20ad944baf4" +content-hash = "5cab8c96a151d4615b0d7160bb7314a0a2134b8295497936f483a15c0411ab91" diff --git a/pyproject.toml b/pyproject.toml index 93e0bff..5b488a3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,6 +14,7 @@ tqdm = "^4.65.0" statsmodels = "^0.14.0" scikit-learn = "^1.2.2" opencv-python = "^4.7.0.72" +seaborn = "^0.12.2" [build-system] requires = ["poetry-core"] From 8d05d31bd3c37034f6b98e6aa2ada8c5c5e294d5 Mon Sep 17 00:00:00 2001 From: dabadav Date: Tue, 13 Jun 2023 17:44:15 +0200 Subject: [PATCH 24/67] Fix Dependencies poetry --- poetry.lock | 42 ++++++++++++++++++++++++++++-------------- pyproject.toml | 2 +- 2 files changed, 29 insertions(+), 15 deletions(-) diff --git a/poetry.lock b/poetry.lock index b0d5518..477db03 100644 --- a/poetry.lock +++ b/poetry.lock @@ -679,24 +679,20 @@ test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeo [[package]] name = "seaborn" -version = "0.12.2" -description = "Statistical data visualization" +version = "0.11.2" +description = "seaborn: statistical data visualization" optional = false -python-versions = ">=3.7" +python-versions = ">=3.6" files = [ - {file = "seaborn-0.12.2-py3-none-any.whl", hash = "sha256:ebf15355a4dba46037dfd65b7350f014ceb1f13c05e814eda2c9f5fd731afc08"}, - {file = "seaborn-0.12.2.tar.gz", hash = "sha256:374645f36509d0dcab895cba5b47daf0586f77bfe3b36c97c607db7da5be0139"}, + {file = "seaborn-0.11.2-py3-none-any.whl", hash = "sha256:85a6baa9b55f81a0623abddc4a26b334653ff4c6b18c418361de19dbba0ef283"}, + {file = "seaborn-0.11.2.tar.gz", hash = "sha256:cf45e9286d40826864be0e3c066f98536982baf701a7caa386511792d61ff4f6"}, ] [package.dependencies] -matplotlib = ">=3.1,<3.6.1 || >3.6.1" -numpy = ">=1.17,<1.24.0 || >1.24.0" -pandas = ">=0.25" - -[package.extras] -dev = ["flake8", "flit", "mypy", "pandas-stubs", "pre-commit", "pytest", "pytest-cov", "pytest-xdist"] -docs = ["ipykernel", "nbconvert", "numpydoc", "pydata_sphinx_theme (==0.10.0rc2)", "pyyaml", "sphinx-copybutton", "sphinx-design", "sphinx-issues"] -stats = ["scipy (>=1.3)", "statsmodels (>=0.10)"] +matplotlib = ">=2.2" +numpy = ">=1.15" +pandas = ">=0.23" +scipy = ">=1.0" [[package]] name = "six" @@ -709,6 +705,24 @@ files = [ {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] +[[package]] +name = "statannotations" +version = "0.5.0" +description = "add statistical significance or custom annotations on seaborn plots. Based on statannot 0.2.3" +optional = false +python-versions = ">=3.6" +files = [ + {file = "statannotations-0.5.0-py3-none-any.whl", hash = "sha256:fbcec5666e0eab9eca41e5337e60ee4dce552d0dda2e70c05f73e41498c62b46"}, + {file = "statannotations-0.5.0.tar.gz", hash = "sha256:15449b8c9835c4f4e582aef7698eb2994fe75ced5df0882115f355cc0fe181fb"}, +] + +[package.dependencies] +matplotlib = ">=2.2.2" +numpy = ">=1.12.1" +pandas = ">=0.23.0" +scipy = ">=1.1.0" +seaborn = ">=0.9.0,<0.12" + [[package]] name = "statsmodels" version = "0.14.0" @@ -814,4 +828,4 @@ testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.13" -content-hash = "5cab8c96a151d4615b0d7160bb7314a0a2134b8295497936f483a15c0411ab91" +content-hash = "05b78c0065513fa477a5ed37887a51c81ad8587f44c21e6b959967f5ca03d07a" diff --git a/pyproject.toml b/pyproject.toml index 5b488a3..cf5af06 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,7 +14,7 @@ tqdm = "^4.65.0" statsmodels = "^0.14.0" scikit-learn = "^1.2.2" opencv-python = "^4.7.0.72" -seaborn = "^0.12.2" +statannotations = "^0.5.0" [build-system] requires = ["poetry-core"] From d518144fcf2da67379b60882bf6655db46a04d3d Mon Sep 17 00:00:00 2001 From: dabadav Date: Tue, 13 Jun 2023 17:45:44 +0200 Subject: [PATCH 25/67] Fix Dependencies poetry --- poetry.lock | 39 ++++++++++++++++++++++++++++++++++++++- pyproject.toml | 3 ++- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/poetry.lock b/poetry.lock index 477db03..3a89921 100644 --- a/poetry.lock +++ b/poetry.lock @@ -153,6 +153,43 @@ ufo = ["fs (>=2.2.0,<3)"] unicode = ["unicodedata2 (>=15.0.0)"] woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] +[[package]] +name = "h5py" +version = "3.8.0" +description = "Read and write HDF5 files from Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h5py-3.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:533d7dad466ddb7e3b30af274b630eb7c1a6e4ddf01d1c373a0334dc2152110a"}, + {file = "h5py-3.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c873ba9fd4fa875ad62ce0e4891725e257a8fe7f5abdbc17e51a5d54819be55c"}, + {file = "h5py-3.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98a240cd4c1bfd568aaa52ec42d263131a2582dab82d74d3d42a0d954cac12be"}, + {file = "h5py-3.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3389b63222b1c7a158bb7fe69d11ca00066740ec5574596d47a2fe5317f563a"}, + {file = "h5py-3.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:7f3350fc0a8407d668b13247861c2acd23f7f5fe7d060a3ad9b0820f5fcbcae0"}, + {file = "h5py-3.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:db03e3f2c716205fbdabb34d0848459840585225eb97b4f08998c743821ca323"}, + {file = "h5py-3.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:36761693efbe53df179627a775476dcbc37727d6e920958277a7efbc18f1fb73"}, + {file = "h5py-3.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a506fc223def428f4329e7e1f9fe1c8c593eab226e7c0942c8d75308ad49950"}, + {file = "h5py-3.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33b15aae79e9147aebe1d0e54099cbcde8d65e3e227cd5b59e49b1272aa0e09d"}, + {file = "h5py-3.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:9f6f6ffadd6bfa9b2c5b334805eb4b19ca0a5620433659d8f7fb86692c40a359"}, + {file = "h5py-3.8.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8f55d9c6c84d7d09c79fb85979e97b81ec6071cc776a97eb6b96f8f6ec767323"}, + {file = "h5py-3.8.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b685453e538b2b5934c58a644ac3f3b3d0cec1a01b6fb26d57388e9f9b674ad0"}, + {file = "h5py-3.8.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:377865821fe80ad984d003723d6f8890bd54ceeb5981b43c0313b9df95411b30"}, + {file = "h5py-3.8.0-cp37-cp37m-win_amd64.whl", hash = "sha256:0fef76e10b9216657fa37e7edff6d8be0709b25bd5066474c229b56cf0098df9"}, + {file = "h5py-3.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:26ffc344ec9984d2cd3ca0265007299a8bac8d85c1ad48f4639d8d3aed2af171"}, + {file = "h5py-3.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bacaa1c16810dd2b3e4417f8e730971b7c4d53d234de61fe4a918db78e80e1e4"}, + {file = "h5py-3.8.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bae730580ae928de409d63cbe4fdca4c82c3ad2bed30511d19d34e995d63c77e"}, + {file = "h5py-3.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f47f757d1b76f0ecb8aa0508ec8d1b390df67a8b67ee2515dc1b046f3a1596ea"}, + {file = "h5py-3.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:f891b17e3a3e974e93f9e34e7cca9f530806543571ce078998676a555837d91d"}, + {file = "h5py-3.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:290e00fa2de74a10688d1bac98d5a9cdd43f14f58e562c580b5b3dfbd358ecae"}, + {file = "h5py-3.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:03890b1c123d024fb0239a3279737d5432498c1901c354f8b10d8221d1d16235"}, + {file = "h5py-3.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7865de06779b14d98068da387333ad9bf2756b5b579cc887fac169bc08f87c3"}, + {file = "h5py-3.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49bc857635f935fa30e92e61ac1e87496df8f260a6945a3235e43a9890426866"}, + {file = "h5py-3.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:5fd2252d1fc364ba0e93dd0b7089f4906b66805cb4e6aca7fa8874ac08649647"}, + {file = "h5py-3.8.0.tar.gz", hash = "sha256:6fead82f0c4000cf38d53f9c030780d81bfa0220218aee13b90b7701c937d95f"}, +] + +[package.dependencies] +numpy = ">=1.14.5" + [[package]] name = "importlib-resources" version = "5.12.0" @@ -828,4 +865,4 @@ testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more [metadata] lock-version = "2.0" python-versions = ">=3.9,<3.13" -content-hash = "05b78c0065513fa477a5ed37887a51c81ad8587f44c21e6b959967f5ca03d07a" +content-hash = "9f288495225dd322d508ec3782cc722dc242cf44289b641937e87ded2506d709" diff --git a/pyproject.toml b/pyproject.toml index cf5af06..16e8b03 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "pipeline_vsdi" -version = "1.0.0" +version = "0.1.0" description = "Preprocessing tools for voltage sensitive dye imaging data" authors = ["NeuroNetMem"] license = "MIT" @@ -15,6 +15,7 @@ statsmodels = "^0.14.0" scikit-learn = "^1.2.2" opencv-python = "^4.7.0.72" statannotations = "^0.5.0" +h5py = "^3.8.0" [build-system] requires = ["poetry-core"] From 2968899b98449ea8b7a7488e2540859cc3c62db1 Mon Sep 17 00:00:00 2001 From: dabadav Date: Tue, 13 Jun 2023 17:47:03 +0200 Subject: [PATCH 26/67] Fix Dependencies poetry --- poetry.lock | 868 ---------------------------------------------------- 1 file changed, 868 deletions(-) delete mode 100644 poetry.lock diff --git a/poetry.lock b/poetry.lock deleted file mode 100644 index 3a89921..0000000 --- a/poetry.lock +++ /dev/null @@ -1,868 +0,0 @@ -# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. - -[[package]] -name = "colorama" -version = "0.4.6" -description = "Cross-platform colored terminal text." -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -files = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] - -[[package]] -name = "contourpy" -version = "1.0.7" -description = "Python library for calculating contours of 2D quadrilateral grids" -optional = false -python-versions = ">=3.8" -files = [ - {file = "contourpy-1.0.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:95c3acddf921944f241b6773b767f1cbce71d03307270e2d769fd584d5d1092d"}, - {file = "contourpy-1.0.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fc1464c97579da9f3ab16763c32e5c5d5bb5fa1ec7ce509a4ca6108b61b84fab"}, - {file = "contourpy-1.0.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8acf74b5d383414401926c1598ed77825cd530ac7b463ebc2e4f46638f56cce6"}, - {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c71fdd8f1c0f84ffd58fca37d00ca4ebaa9e502fb49825484da075ac0b0b803"}, - {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f99e9486bf1bb979d95d5cffed40689cb595abb2b841f2991fc894b3452290e8"}, - {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87f4d8941a9564cda3f7fa6a6cd9b32ec575830780677932abdec7bcb61717b0"}, - {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9e20e5a1908e18aaa60d9077a6d8753090e3f85ca25da6e25d30dc0a9e84c2c6"}, - {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a877ada905f7d69b2a31796c4b66e31a8068b37aa9b78832d41c82fc3e056ddd"}, - {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6381fa66866b0ea35e15d197fc06ac3840a9b2643a6475c8fff267db8b9f1e69"}, - {file = "contourpy-1.0.7-cp310-cp310-win32.whl", hash = "sha256:3c184ad2433635f216645fdf0493011a4667e8d46b34082f5a3de702b6ec42e3"}, - {file = "contourpy-1.0.7-cp310-cp310-win_amd64.whl", hash = "sha256:3caea6365b13119626ee996711ab63e0c9d7496f65641f4459c60a009a1f3e80"}, - {file = "contourpy-1.0.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ed33433fc3820263a6368e532f19ddb4c5990855e4886088ad84fd7c4e561c71"}, - {file = "contourpy-1.0.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:38e2e577f0f092b8e6774459317c05a69935a1755ecfb621c0a98f0e3c09c9a5"}, - {file = "contourpy-1.0.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ae90d5a8590e5310c32a7630b4b8618cef7563cebf649011da80874d0aa8f414"}, - {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:130230b7e49825c98edf0b428b7aa1125503d91732735ef897786fe5452b1ec2"}, - {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58569c491e7f7e874f11519ef46737cea1d6eda1b514e4eb5ac7dab6aa864d02"}, - {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54d43960d809c4c12508a60b66cb936e7ed57d51fb5e30b513934a4a23874fae"}, - {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:152fd8f730c31fd67fe0ffebe1df38ab6a669403da93df218801a893645c6ccc"}, - {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:9056c5310eb1daa33fc234ef39ebfb8c8e2533f088bbf0bc7350f70a29bde1ac"}, - {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a9d7587d2fdc820cc9177139b56795c39fb8560f540bba9ceea215f1f66e1566"}, - {file = "contourpy-1.0.7-cp311-cp311-win32.whl", hash = "sha256:4ee3ee247f795a69e53cd91d927146fb16c4e803c7ac86c84104940c7d2cabf0"}, - {file = "contourpy-1.0.7-cp311-cp311-win_amd64.whl", hash = "sha256:5caeacc68642e5f19d707471890f037a13007feba8427eb7f2a60811a1fc1350"}, - {file = "contourpy-1.0.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fd7dc0e6812b799a34f6d12fcb1000539098c249c8da54f3566c6a6461d0dbad"}, - {file = "contourpy-1.0.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0f9d350b639db6c2c233d92c7f213d94d2e444d8e8fc5ca44c9706cf72193772"}, - {file = "contourpy-1.0.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e96a08b62bb8de960d3a6afbc5ed8421bf1a2d9c85cc4ea73f4bc81b4910500f"}, - {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:031154ed61f7328ad7f97662e48660a150ef84ee1bc8876b6472af88bf5a9b98"}, - {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e9ebb4425fc1b658e13bace354c48a933b842d53c458f02c86f371cecbedecc"}, - {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efb8f6d08ca7998cf59eaf50c9d60717f29a1a0a09caa46460d33b2924839dbd"}, - {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6c180d89a28787e4b73b07e9b0e2dac7741261dbdca95f2b489c4f8f887dd810"}, - {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b8d587cc39057d0afd4166083d289bdeff221ac6d3ee5046aef2d480dc4b503c"}, - {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:769eef00437edf115e24d87f8926955f00f7704bede656ce605097584f9966dc"}, - {file = "contourpy-1.0.7-cp38-cp38-win32.whl", hash = "sha256:62398c80ef57589bdbe1eb8537127321c1abcfdf8c5f14f479dbbe27d0322e66"}, - {file = "contourpy-1.0.7-cp38-cp38-win_amd64.whl", hash = "sha256:57119b0116e3f408acbdccf9eb6ef19d7fe7baf0d1e9aaa5381489bc1aa56556"}, - {file = "contourpy-1.0.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:30676ca45084ee61e9c3da589042c24a57592e375d4b138bd84d8709893a1ba4"}, - {file = "contourpy-1.0.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e927b3868bd1e12acee7cc8f3747d815b4ab3e445a28d2e5373a7f4a6e76ba1"}, - {file = "contourpy-1.0.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:366a0cf0fc079af5204801786ad7a1c007714ee3909e364dbac1729f5b0849e5"}, - {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89ba9bb365446a22411f0673abf6ee1fea3b2cf47b37533b970904880ceb72f3"}, - {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:71b0bf0c30d432278793d2141362ac853859e87de0a7dee24a1cea35231f0d50"}, - {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7281244c99fd7c6f27c1c6bfafba878517b0b62925a09b586d88ce750a016d2"}, - {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b6d0f9e1d39dbfb3977f9dd79f156c86eb03e57a7face96f199e02b18e58d32a"}, - {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7f6979d20ee5693a1057ab53e043adffa1e7418d734c1532e2d9e915b08d8ec2"}, - {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5dd34c1ae752515318224cba7fc62b53130c45ac6a1040c8b7c1a223c46e8967"}, - {file = "contourpy-1.0.7-cp39-cp39-win32.whl", hash = "sha256:c5210e5d5117e9aec8c47d9156d1d3835570dd909a899171b9535cb4a3f32693"}, - {file = "contourpy-1.0.7-cp39-cp39-win_amd64.whl", hash = "sha256:60835badb5ed5f4e194a6f21c09283dd6e007664a86101431bf870d9e86266c4"}, - {file = "contourpy-1.0.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ce41676b3d0dd16dbcfabcc1dc46090aaf4688fd6e819ef343dbda5a57ef0161"}, - {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a011cf354107b47c58ea932d13b04d93c6d1d69b8b6dce885e642531f847566"}, - {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:31a55dccc8426e71817e3fe09b37d6d48ae40aae4ecbc8c7ad59d6893569c436"}, - {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69f8ff4db108815addd900a74df665e135dbbd6547a8a69333a68e1f6e368ac2"}, - {file = "contourpy-1.0.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efe99298ba37e37787f6a2ea868265465410822f7bea163edcc1bd3903354ea9"}, - {file = "contourpy-1.0.7-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a1e97b86f73715e8670ef45292d7cc033548266f07d54e2183ecb3c87598888f"}, - {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc331c13902d0f50845099434cd936d49d7a2ca76cb654b39691974cb1e4812d"}, - {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24847601071f740837aefb730e01bd169fbcaa610209779a78db7ebb6e6a7051"}, - {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abf298af1e7ad44eeb93501e40eb5a67abbf93b5d90e468d01fc0c4451971afa"}, - {file = "contourpy-1.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:64757f6460fc55d7e16ed4f1de193f362104285c667c112b50a804d482777edd"}, - {file = "contourpy-1.0.7.tar.gz", hash = "sha256:d8165a088d31798b59e91117d1f5fc3df8168d8b48c4acc10fc0df0d0bdbcc5e"}, -] - -[package.dependencies] -numpy = ">=1.16" - -[package.extras] -bokeh = ["bokeh", "chromedriver", "selenium"] -docs = ["furo", "sphinx-copybutton"] -mypy = ["contourpy[bokeh]", "docutils-stubs", "mypy (==0.991)", "types-Pillow"] -test = ["Pillow", "matplotlib", "pytest"] -test-no-images = ["pytest"] - -[[package]] -name = "cycler" -version = "0.11.0" -description = "Composable style cycles" -optional = false -python-versions = ">=3.6" -files = [ - {file = "cycler-0.11.0-py3-none-any.whl", hash = "sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3"}, - {file = "cycler-0.11.0.tar.gz", hash = "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f"}, -] - -[[package]] -name = "fonttools" -version = "4.40.0" -description = "Tools to manipulate font files" -optional = false -python-versions = ">=3.8" -files = [ - {file = "fonttools-4.40.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b802dcbf9bcff74672f292b2466f6589ab8736ce4dcf36f48eb994c2847c4b30"}, - {file = "fonttools-4.40.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7f6e3fa3da923063c286320e728ba2270e49c73386e3a711aa680f4b0747d692"}, - {file = "fonttools-4.40.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fdf60f8a5c6bcce7d024a33f7e4bc7921f5b74e8ea13bccd204f2c8b86f3470"}, - {file = "fonttools-4.40.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91784e21a1a085fac07c6a407564f4a77feb471b5954c9ee55a4f9165151f6c1"}, - {file = "fonttools-4.40.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:05171f3c546f64d78569f10adc0de72561882352cac39ec7439af12304d8d8c0"}, - {file = "fonttools-4.40.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7449e5e306f3a930a8944c85d0cbc8429cba13503372a1a40f23124d6fb09b58"}, - {file = "fonttools-4.40.0-cp310-cp310-win32.whl", hash = "sha256:bae8c13abbc2511e9a855d2142c0ab01178dd66b1a665798f357da0d06253e0d"}, - {file = "fonttools-4.40.0-cp310-cp310-win_amd64.whl", hash = "sha256:425b74a608427499b0e45e433c34ddc350820b6f25b7c8761963a08145157a66"}, - {file = "fonttools-4.40.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:00ab569b2a3e591e00425023ade87e8fef90380c1dde61be7691cb524ca5f743"}, - {file = "fonttools-4.40.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:18ea64ac43e94c9e0c23d7a9475f1026be0e25b10dda8f236fc956188761df97"}, - {file = "fonttools-4.40.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:022c4a16b412293e7f1ce21b8bab7a6f9d12c4ffdf171fdc67122baddb973069"}, - {file = "fonttools-4.40.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:530c5d35109f3e0cea2535742d6a3bc99c0786cf0cbd7bb2dc9212387f0d908c"}, - {file = "fonttools-4.40.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5e00334c66f4e83535384cb5339526d01d02d77f142c23b2f97bd6a4f585497a"}, - {file = "fonttools-4.40.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb52c10fda31159c22c7ed85074e05f8b97da8773ea461706c273e31bcbea836"}, - {file = "fonttools-4.40.0-cp311-cp311-win32.whl", hash = "sha256:6a8d71b9a5c884c72741868e845c0e563c5d83dcaf10bb0ceeec3b4b2eb14c67"}, - {file = "fonttools-4.40.0-cp311-cp311-win_amd64.whl", hash = "sha256:15abb3d055c1b2dff9ce376b6c3db10777cb74b37b52b78f61657634fd348a0d"}, - {file = "fonttools-4.40.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:14037c31138fbd21847ad5e5441dfdde003e0a8f3feb5812a1a21fd1c255ffbd"}, - {file = "fonttools-4.40.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:94c915f6716589f78bc00fbc14c5b8de65cfd11ee335d32504f1ef234524cb24"}, - {file = "fonttools-4.40.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37467cee0f32cada2ec08bc16c9c31f9b53ea54b2f5604bf25a1246b5f50593a"}, - {file = "fonttools-4.40.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56d4d85f5374b45b08d2f928517d1e313ea71b4847240398decd0ab3ebbca885"}, - {file = "fonttools-4.40.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8c4305b171b61040b1ee75d18f9baafe58bd3b798d1670078efe2c92436bfb63"}, - {file = "fonttools-4.40.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a954b90d1473c85a22ecf305761d9fd89da93bbd31dae86e7dea436ad2cb5dc9"}, - {file = "fonttools-4.40.0-cp38-cp38-win32.whl", hash = "sha256:1bc4c5b147be8dbc5df9cc8ac5e93ee914ad030fe2a201cc8f02f499db71011d"}, - {file = "fonttools-4.40.0-cp38-cp38-win_amd64.whl", hash = "sha256:8a917828dbfdb1cbe50cf40eeae6fbf9c41aef9e535649ed8f4982b2ef65c091"}, - {file = "fonttools-4.40.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:882983279bf39afe4e945109772c2ffad2be2c90983d6559af8b75c19845a80a"}, - {file = "fonttools-4.40.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c55f1b4109dbc3aeb496677b3e636d55ef46dc078c2a5e3f3db4e90f1c6d2907"}, - {file = "fonttools-4.40.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec468c022d09f1817c691cf884feb1030ef6f1e93e3ea6831b0d8144c06480d1"}, - {file = "fonttools-4.40.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d5adf4ba114f028fc3f5317a221fd8b0f4ef7a2e5524a2b1e0fd891b093791a"}, - {file = "fonttools-4.40.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:aa83b3f151bc63970f39b2b42a06097c5a22fd7ed9f7ba008e618de4503d3895"}, - {file = "fonttools-4.40.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:97d95b8301b62bdece1af943b88bcb3680fd385f88346a4a899ee145913b414a"}, - {file = "fonttools-4.40.0-cp39-cp39-win32.whl", hash = "sha256:1a003608400dd1cca3e089e8c94973c6b51a4fb1ef00ff6d7641617b9242e637"}, - {file = "fonttools-4.40.0-cp39-cp39-win_amd64.whl", hash = "sha256:7961575221e3da0841c75da53833272c520000d76f7f71274dbf43370f8a1065"}, - {file = "fonttools-4.40.0-py3-none-any.whl", hash = "sha256:200729d12461e2038700d31f0d49ad5a7b55855dec7525074979a06b46f88505"}, - {file = "fonttools-4.40.0.tar.gz", hash = "sha256:337b6e83d7ee73c40ea62407f2ce03b07c3459e213b6f332b94a69923b9e1cb9"}, -] - -[package.extras] -all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.0.0)", "xattr", "zopfli (>=0.1.4)"] -graphite = ["lz4 (>=1.7.4.2)"] -interpolatable = ["munkres", "scipy"] -lxml = ["lxml (>=4.0,<5)"] -pathops = ["skia-pathops (>=0.5.0)"] -plot = ["matplotlib"] -repacker = ["uharfbuzz (>=0.23.0)"] -symfont = ["sympy"] -type1 = ["xattr"] -ufo = ["fs (>=2.2.0,<3)"] -unicode = ["unicodedata2 (>=15.0.0)"] -woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] - -[[package]] -name = "h5py" -version = "3.8.0" -description = "Read and write HDF5 files from Python" -optional = false -python-versions = ">=3.7" -files = [ - {file = "h5py-3.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:533d7dad466ddb7e3b30af274b630eb7c1a6e4ddf01d1c373a0334dc2152110a"}, - {file = "h5py-3.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c873ba9fd4fa875ad62ce0e4891725e257a8fe7f5abdbc17e51a5d54819be55c"}, - {file = "h5py-3.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98a240cd4c1bfd568aaa52ec42d263131a2582dab82d74d3d42a0d954cac12be"}, - {file = "h5py-3.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3389b63222b1c7a158bb7fe69d11ca00066740ec5574596d47a2fe5317f563a"}, - {file = "h5py-3.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:7f3350fc0a8407d668b13247861c2acd23f7f5fe7d060a3ad9b0820f5fcbcae0"}, - {file = "h5py-3.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:db03e3f2c716205fbdabb34d0848459840585225eb97b4f08998c743821ca323"}, - {file = "h5py-3.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:36761693efbe53df179627a775476dcbc37727d6e920958277a7efbc18f1fb73"}, - {file = "h5py-3.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a506fc223def428f4329e7e1f9fe1c8c593eab226e7c0942c8d75308ad49950"}, - {file = "h5py-3.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33b15aae79e9147aebe1d0e54099cbcde8d65e3e227cd5b59e49b1272aa0e09d"}, - {file = "h5py-3.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:9f6f6ffadd6bfa9b2c5b334805eb4b19ca0a5620433659d8f7fb86692c40a359"}, - {file = "h5py-3.8.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8f55d9c6c84d7d09c79fb85979e97b81ec6071cc776a97eb6b96f8f6ec767323"}, - {file = "h5py-3.8.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b685453e538b2b5934c58a644ac3f3b3d0cec1a01b6fb26d57388e9f9b674ad0"}, - {file = "h5py-3.8.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:377865821fe80ad984d003723d6f8890bd54ceeb5981b43c0313b9df95411b30"}, - {file = "h5py-3.8.0-cp37-cp37m-win_amd64.whl", hash = "sha256:0fef76e10b9216657fa37e7edff6d8be0709b25bd5066474c229b56cf0098df9"}, - {file = "h5py-3.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:26ffc344ec9984d2cd3ca0265007299a8bac8d85c1ad48f4639d8d3aed2af171"}, - {file = "h5py-3.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bacaa1c16810dd2b3e4417f8e730971b7c4d53d234de61fe4a918db78e80e1e4"}, - {file = "h5py-3.8.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bae730580ae928de409d63cbe4fdca4c82c3ad2bed30511d19d34e995d63c77e"}, - {file = "h5py-3.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f47f757d1b76f0ecb8aa0508ec8d1b390df67a8b67ee2515dc1b046f3a1596ea"}, - {file = "h5py-3.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:f891b17e3a3e974e93f9e34e7cca9f530806543571ce078998676a555837d91d"}, - {file = "h5py-3.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:290e00fa2de74a10688d1bac98d5a9cdd43f14f58e562c580b5b3dfbd358ecae"}, - {file = "h5py-3.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:03890b1c123d024fb0239a3279737d5432498c1901c354f8b10d8221d1d16235"}, - {file = "h5py-3.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7865de06779b14d98068da387333ad9bf2756b5b579cc887fac169bc08f87c3"}, - {file = "h5py-3.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49bc857635f935fa30e92e61ac1e87496df8f260a6945a3235e43a9890426866"}, - {file = "h5py-3.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:5fd2252d1fc364ba0e93dd0b7089f4906b66805cb4e6aca7fa8874ac08649647"}, - {file = "h5py-3.8.0.tar.gz", hash = "sha256:6fead82f0c4000cf38d53f9c030780d81bfa0220218aee13b90b7701c937d95f"}, -] - -[package.dependencies] -numpy = ">=1.14.5" - -[[package]] -name = "importlib-resources" -version = "5.12.0" -description = "Read resources from Python packages" -optional = false -python-versions = ">=3.7" -files = [ - {file = "importlib_resources-5.12.0-py3-none-any.whl", hash = "sha256:7b1deeebbf351c7578e09bf2f63fa2ce8b5ffec296e0d349139d43cca061a81a"}, - {file = "importlib_resources-5.12.0.tar.gz", hash = "sha256:4be82589bf5c1d7999aedf2a45159d10cb3ca4f19b2271f8792bc8e6da7b22f6"}, -] - -[package.dependencies] -zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] - -[[package]] -name = "joblib" -version = "1.2.0" -description = "Lightweight pipelining with Python functions" -optional = false -python-versions = ">=3.7" -files = [ - {file = "joblib-1.2.0-py3-none-any.whl", hash = "sha256:091138ed78f800342968c523bdde947e7a305b8594b910a0fea2ab83c3c6d385"}, - {file = "joblib-1.2.0.tar.gz", hash = "sha256:e1cee4a79e4af22881164f218d4311f60074197fb707e082e803b61f6d137018"}, -] - -[[package]] -name = "kiwisolver" -version = "1.4.4" -description = "A fast implementation of the Cassowary constraint solver" -optional = false -python-versions = ">=3.7" -files = [ - {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2f5e60fabb7343a836360c4f0919b8cd0d6dbf08ad2ca6b9cf90bf0c76a3c4f6"}, - {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:10ee06759482c78bdb864f4109886dff7b8a56529bc1609d4f1112b93fe6423c"}, - {file = "kiwisolver-1.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c79ebe8f3676a4c6630fd3f777f3cfecf9289666c84e775a67d1d358578dc2e3"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:abbe9fa13da955feb8202e215c4018f4bb57469b1b78c7a4c5c7b93001699938"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7577c1987baa3adc4b3c62c33bd1118c3ef5c8ddef36f0f2c950ae0b199e100d"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ad8285b01b0d4695102546b342b493b3ccc6781fc28c8c6a1bb63e95d22f09"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ed58b8acf29798b036d347791141767ccf65eee7f26bde03a71c944449e53de"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a68b62a02953b9841730db7797422f983935aeefceb1679f0fc85cbfbd311c32"}, - {file = "kiwisolver-1.4.4-cp310-cp310-win32.whl", hash = "sha256:e92a513161077b53447160b9bd8f522edfbed4bd9759e4c18ab05d7ef7e49408"}, - {file = "kiwisolver-1.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:3fe20f63c9ecee44560d0e7f116b3a747a5d7203376abeea292ab3152334d004"}, - {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ea21f66820452a3f5d1655f8704a60d66ba1191359b96541eaf457710a5fc6"}, - {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bc9db8a3efb3e403e4ecc6cd9489ea2bac94244f80c78e27c31dcc00d2790ac2"}, - {file = "kiwisolver-1.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d5b61785a9ce44e5a4b880272baa7cf6c8f48a5180c3e81c59553ba0cb0821ca"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c2dbb44c3f7e6c4d3487b31037b1bdbf424d97687c1747ce4ff2895795c9bf69"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6295ecd49304dcf3bfbfa45d9a081c96509e95f4b9d0eb7ee4ec0530c4a96514"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4bd472dbe5e136f96a4b18f295d159d7f26fd399136f5b17b08c4e5f498cd494"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf7d9fce9bcc4752ca4a1b80aabd38f6d19009ea5cbda0e0856983cf6d0023f5"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78d6601aed50c74e0ef02f4204da1816147a6d3fbdc8b3872d263338a9052c51"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:877272cf6b4b7e94c9614f9b10140e198d2186363728ed0f701c6eee1baec1da"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:db608a6757adabb32f1cfe6066e39b3706d8c3aa69bbc353a5b61edad36a5cb4"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5853eb494c71e267912275e5586fe281444eb5e722de4e131cddf9d442615626"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f0a1dbdb5ecbef0d34eb77e56fcb3e95bbd7e50835d9782a45df81cc46949750"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:283dffbf061a4ec60391d51e6155e372a1f7a4f5b15d59c8505339454f8989e4"}, - {file = "kiwisolver-1.4.4-cp311-cp311-win32.whl", hash = "sha256:d06adcfa62a4431d404c31216f0f8ac97397d799cd53800e9d3efc2fbb3cf14e"}, - {file = "kiwisolver-1.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:e7da3fec7408813a7cebc9e4ec55afed2d0fd65c4754bc376bf03498d4e92686"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:62ac9cc684da4cf1778d07a89bf5f81b35834cb96ca523d3a7fb32509380cbf6"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41dae968a94b1ef1897cb322b39360a0812661dba7c682aa45098eb8e193dbdf"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02f79693ec433cb4b5f51694e8477ae83b3205768a6fb48ffba60549080e295b"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d0611a0a2a518464c05ddd5a3a1a0e856ccc10e67079bb17f265ad19ab3c7597"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:db5283d90da4174865d520e7366801a93777201e91e79bacbac6e6927cbceede"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1041feb4cda8708ce73bb4dcb9ce1ccf49d553bf87c3954bdfa46f0c3f77252c"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-win32.whl", hash = "sha256:a553dadda40fef6bfa1456dc4be49b113aa92c2a9a9e8711e955618cd69622e3"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-win_amd64.whl", hash = "sha256:03baab2d6b4a54ddbb43bba1a3a2d1627e82d205c5cf8f4c924dc49284b87166"}, - {file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:841293b17ad704d70c578f1f0013c890e219952169ce8a24ebc063eecf775454"}, - {file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f4f270de01dd3e129a72efad823da90cc4d6aafb64c410c9033aba70db9f1ff0"}, - {file = "kiwisolver-1.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f9f39e2f049db33a908319cf46624a569b36983c7c78318e9726a4cb8923b26c"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c97528e64cb9ebeff9701e7938653a9951922f2a38bd847787d4a8e498cc83ae"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d1573129aa0fd901076e2bfb4275a35f5b7aa60fbfb984499d661ec950320b0"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ad881edc7ccb9d65b0224f4e4d05a1e85cf62d73aab798943df6d48ab0cd79a1"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b428ef021242344340460fa4c9185d0b1f66fbdbfecc6c63eff4b7c29fad429d"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2e407cb4bd5a13984a6c2c0fe1845e4e41e96f183e5e5cd4d77a857d9693494c"}, - {file = "kiwisolver-1.4.4-cp38-cp38-win32.whl", hash = "sha256:75facbe9606748f43428fc91a43edb46c7ff68889b91fa31f53b58894503a191"}, - {file = "kiwisolver-1.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:5bce61af018b0cb2055e0e72e7d65290d822d3feee430b7b8203d8a855e78766"}, - {file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8c808594c88a025d4e322d5bb549282c93c8e1ba71b790f539567932722d7bd8"}, - {file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0a71d85ecdd570ded8ac3d1c0f480842f49a40beb423bb8014539a9f32a5897"}, - {file = "kiwisolver-1.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b533558eae785e33e8c148a8d9921692a9fe5aa516efbdff8606e7d87b9d5824"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:efda5fc8cc1c61e4f639b8067d118e742b812c930f708e6667a5ce0d13499e29"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7c43e1e1206cd421cd92e6b3280d4385d41d7166b3ed577ac20444b6995a445f"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc8d3bd6c72b2dd9decf16ce70e20abcb3274ba01b4e1c96031e0c4067d1e7cd"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ea39b0ccc4f5d803e3337dd46bcce60b702be4d86fd0b3d7531ef10fd99a1ac"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:968f44fdbf6dd757d12920d63b566eeb4d5b395fd2d00d29d7ef00a00582aac9"}, - {file = "kiwisolver-1.4.4-cp39-cp39-win32.whl", hash = "sha256:da7e547706e69e45d95e116e6939488d62174e033b763ab1496b4c29b76fabea"}, - {file = "kiwisolver-1.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:ba59c92039ec0a66103b1d5fe588fa546373587a7d68f5c96f743c3396afc04b"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:91672bacaa030f92fc2f43b620d7b337fd9a5af28b0d6ed3f77afc43c4a64b5a"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:787518a6789009c159453da4d6b683f468ef7a65bbde796bcea803ccf191058d"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da152d8cdcab0e56e4f45eb08b9aea6455845ec83172092f09b0e077ece2cf7a"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ecb1fa0db7bf4cff9dac752abb19505a233c7f16684c5826d1f11ebd9472b871"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:28bc5b299f48150b5f822ce68624e445040595a4ac3d59251703779836eceff9"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:81e38381b782cc7e1e46c4e14cd997ee6040768101aefc8fa3c24a4cc58e98f8"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2a66fdfb34e05b705620dd567f5a03f239a088d5a3f321e7b6ac3239d22aa286"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:872b8ca05c40d309ed13eb2e582cab0c5a05e81e987ab9c521bf05ad1d5cf5cb"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:70e7c2e7b750585569564e2e5ca9845acfaa5da56ac46df68414f29fea97be9f"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9f85003f5dfa867e86d53fac6f7e6f30c045673fa27b603c397753bebadc3008"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e307eb9bd99801f82789b44bb45e9f541961831c7311521b13a6c85afc09767"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1792d939ec70abe76f5054d3f36ed5656021dcad1322d1cc996d4e54165cef9"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6cb459eea32a4e2cf18ba5fcece2dbdf496384413bc1bae15583f19e567f3b2"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36dafec3d6d6088d34e2de6b85f9d8e2324eb734162fba59d2ba9ed7a2043d5b"}, - {file = "kiwisolver-1.4.4.tar.gz", hash = "sha256:d41997519fcba4a1e46eb4a2fe31bc12f0ff957b2b81bac28db24744f333e955"}, -] - -[[package]] -name = "matplotlib" -version = "3.7.1" -description = "Python plotting package" -optional = false -python-versions = ">=3.8" -files = [ - {file = "matplotlib-3.7.1-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:95cbc13c1fc6844ab8812a525bbc237fa1470863ff3dace7352e910519e194b1"}, - {file = "matplotlib-3.7.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:08308bae9e91aca1ec6fd6dda66237eef9f6294ddb17f0d0b3c863169bf82353"}, - {file = "matplotlib-3.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:544764ba51900da4639c0f983b323d288f94f65f4024dc40ecb1542d74dc0500"}, - {file = "matplotlib-3.7.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56d94989191de3fcc4e002f93f7f1be5da476385dde410ddafbb70686acf00ea"}, - {file = "matplotlib-3.7.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e99bc9e65901bb9a7ce5e7bb24af03675cbd7c70b30ac670aa263240635999a4"}, - {file = "matplotlib-3.7.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb7d248c34a341cd4c31a06fd34d64306624c8cd8d0def7abb08792a5abfd556"}, - {file = "matplotlib-3.7.1-cp310-cp310-win32.whl", hash = "sha256:ce463ce590f3825b52e9fe5c19a3c6a69fd7675a39d589e8b5fbe772272b3a24"}, - {file = "matplotlib-3.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:3d7bc90727351fb841e4d8ae620d2d86d8ed92b50473cd2b42ce9186104ecbba"}, - {file = "matplotlib-3.7.1-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:770a205966d641627fd5cf9d3cb4b6280a716522cd36b8b284a8eb1581310f61"}, - {file = "matplotlib-3.7.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f67bfdb83a8232cb7a92b869f9355d677bce24485c460b19d01970b64b2ed476"}, - {file = "matplotlib-3.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2bf092f9210e105f414a043b92af583c98f50050559616930d884387d0772aba"}, - {file = "matplotlib-3.7.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89768d84187f31717349c6bfadc0e0d8c321e8eb34522acec8a67b1236a66332"}, - {file = "matplotlib-3.7.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83111e6388dec67822e2534e13b243cc644c7494a4bb60584edbff91585a83c6"}, - {file = "matplotlib-3.7.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a867bf73a7eb808ef2afbca03bcdb785dae09595fbe550e1bab0cd023eba3de0"}, - {file = "matplotlib-3.7.1-cp311-cp311-win32.whl", hash = "sha256:fbdeeb58c0cf0595efe89c05c224e0a502d1aa6a8696e68a73c3efc6bc354304"}, - {file = "matplotlib-3.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:c0bd19c72ae53e6ab979f0ac6a3fafceb02d2ecafa023c5cca47acd934d10be7"}, - {file = "matplotlib-3.7.1-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:6eb88d87cb2c49af00d3bbc33a003f89fd9f78d318848da029383bfc08ecfbfb"}, - {file = "matplotlib-3.7.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:cf0e4f727534b7b1457898c4f4ae838af1ef87c359b76dcd5330fa31893a3ac7"}, - {file = "matplotlib-3.7.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:46a561d23b91f30bccfd25429c3c706afe7d73a5cc64ef2dfaf2b2ac47c1a5dc"}, - {file = "matplotlib-3.7.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8704726d33e9aa8a6d5215044b8d00804561971163563e6e6591f9dcf64340cc"}, - {file = "matplotlib-3.7.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4cf327e98ecf08fcbb82685acaf1939d3338548620ab8dfa02828706402c34de"}, - {file = "matplotlib-3.7.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:617f14ae9d53292ece33f45cba8503494ee199a75b44de7717964f70637a36aa"}, - {file = "matplotlib-3.7.1-cp38-cp38-win32.whl", hash = "sha256:7c9a4b2da6fac77bcc41b1ea95fadb314e92508bf5493ceff058e727e7ecf5b0"}, - {file = "matplotlib-3.7.1-cp38-cp38-win_amd64.whl", hash = "sha256:14645aad967684e92fc349493fa10c08a6da514b3d03a5931a1bac26e6792bd1"}, - {file = "matplotlib-3.7.1-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:81a6b377ea444336538638d31fdb39af6be1a043ca5e343fe18d0f17e098770b"}, - {file = "matplotlib-3.7.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:28506a03bd7f3fe59cd3cd4ceb2a8d8a2b1db41afede01f66c42561b9be7b4b7"}, - {file = "matplotlib-3.7.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8c587963b85ce41e0a8af53b9b2de8dddbf5ece4c34553f7bd9d066148dc719c"}, - {file = "matplotlib-3.7.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8bf26ade3ff0f27668989d98c8435ce9327d24cffb7f07d24ef609e33d582439"}, - {file = "matplotlib-3.7.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:def58098f96a05f90af7e92fd127d21a287068202aa43b2a93476170ebd99e87"}, - {file = "matplotlib-3.7.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f883a22a56a84dba3b588696a2b8a1ab0d2c3d41be53264115c71b0a942d8fdb"}, - {file = "matplotlib-3.7.1-cp39-cp39-win32.whl", hash = "sha256:4f99e1b234c30c1e9714610eb0c6d2f11809c9c78c984a613ae539ea2ad2eb4b"}, - {file = "matplotlib-3.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:3ba2af245e36990facf67fde840a760128ddd71210b2ab6406e640188d69d136"}, - {file = "matplotlib-3.7.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3032884084f541163f295db8a6536e0abb0db464008fadca6c98aaf84ccf4717"}, - {file = "matplotlib-3.7.1-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a2cb34336110e0ed8bb4f650e817eed61fa064acbefeb3591f1b33e3a84fd96"}, - {file = "matplotlib-3.7.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b867e2f952ed592237a1828f027d332d8ee219ad722345b79a001f49df0936eb"}, - {file = "matplotlib-3.7.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:57bfb8c8ea253be947ccb2bc2d1bb3862c2bccc662ad1b4626e1f5e004557042"}, - {file = "matplotlib-3.7.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:438196cdf5dc8d39b50a45cb6e3f6274edbcf2254f85fa9b895bf85851c3a613"}, - {file = "matplotlib-3.7.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:21e9cff1a58d42e74d01153360de92b326708fb205250150018a52c70f43c290"}, - {file = "matplotlib-3.7.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75d4725d70b7c03e082bbb8a34639ede17f333d7247f56caceb3801cb6ff703d"}, - {file = "matplotlib-3.7.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:97cc368a7268141afb5690760921765ed34867ffb9655dd325ed207af85c7529"}, - {file = "matplotlib-3.7.1.tar.gz", hash = "sha256:7b73305f25eab4541bd7ee0b96d87e53ae9c9f1823be5659b806cd85786fe882"}, -] - -[package.dependencies] -contourpy = ">=1.0.1" -cycler = ">=0.10" -fonttools = ">=4.22.0" -importlib-resources = {version = ">=3.2.0", markers = "python_version < \"3.10\""} -kiwisolver = ">=1.0.1" -numpy = ">=1.20" -packaging = ">=20.0" -pillow = ">=6.2.0" -pyparsing = ">=2.3.1" -python-dateutil = ">=2.7" - -[[package]] -name = "numpy" -version = "1.24.3" -description = "Fundamental package for array computing in Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "numpy-1.24.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3c1104d3c036fb81ab923f507536daedc718d0ad5a8707c6061cdfd6d184e570"}, - {file = "numpy-1.24.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:202de8f38fc4a45a3eea4b63e2f376e5f2dc64ef0fa692838e31a808520efaf7"}, - {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8535303847b89aa6b0f00aa1dc62867b5a32923e4d1681a35b5eef2d9591a463"}, - {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d926b52ba1367f9acb76b0df6ed21f0b16a1ad87c6720a1121674e5cf63e2b6"}, - {file = "numpy-1.24.3-cp310-cp310-win32.whl", hash = "sha256:f21c442fdd2805e91799fbe044a7b999b8571bb0ab0f7850d0cb9641a687092b"}, - {file = "numpy-1.24.3-cp310-cp310-win_amd64.whl", hash = "sha256:ab5f23af8c16022663a652d3b25dcdc272ac3f83c3af4c02eb8b824e6b3ab9d7"}, - {file = "numpy-1.24.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9a7721ec204d3a237225db3e194c25268faf92e19338a35f3a224469cb6039a3"}, - {file = "numpy-1.24.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d6cc757de514c00b24ae8cf5c876af2a7c3df189028d68c0cb4eaa9cd5afc2bf"}, - {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76e3f4e85fc5d4fd311f6e9b794d0c00e7002ec122be271f2019d63376f1d385"}, - {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1d3c026f57ceaad42f8231305d4653d5f05dc6332a730ae5c0bea3513de0950"}, - {file = "numpy-1.24.3-cp311-cp311-win32.whl", hash = "sha256:c91c4afd8abc3908e00a44b2672718905b8611503f7ff87390cc0ac3423fb096"}, - {file = "numpy-1.24.3-cp311-cp311-win_amd64.whl", hash = "sha256:5342cf6aad47943286afa6f1609cad9b4266a05e7f2ec408e2cf7aea7ff69d80"}, - {file = "numpy-1.24.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7776ea65423ca6a15255ba1872d82d207bd1e09f6d0894ee4a64678dd2204078"}, - {file = "numpy-1.24.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ae8d0be48d1b6ed82588934aaaa179875e7dc4f3d84da18d7eae6eb3f06c242c"}, - {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecde0f8adef7dfdec993fd54b0f78183051b6580f606111a6d789cd14c61ea0c"}, - {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4749e053a29364d3452c034827102ee100986903263e89884922ef01a0a6fd2f"}, - {file = "numpy-1.24.3-cp38-cp38-win32.whl", hash = "sha256:d933fabd8f6a319e8530d0de4fcc2e6a61917e0b0c271fded460032db42a0fe4"}, - {file = "numpy-1.24.3-cp38-cp38-win_amd64.whl", hash = "sha256:56e48aec79ae238f6e4395886b5eaed058abb7231fb3361ddd7bfdf4eed54289"}, - {file = "numpy-1.24.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4719d5aefb5189f50887773699eaf94e7d1e02bf36c1a9d353d9f46703758ca4"}, - {file = "numpy-1.24.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ec87a7084caa559c36e0a2309e4ecb1baa03b687201d0a847c8b0ed476a7187"}, - {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea8282b9bcfe2b5e7d491d0bf7f3e2da29700cec05b49e64d6246923329f2b02"}, - {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210461d87fb02a84ef243cac5e814aad2b7f4be953b32cb53327bb49fd77fbb4"}, - {file = "numpy-1.24.3-cp39-cp39-win32.whl", hash = "sha256:784c6da1a07818491b0ffd63c6bbe5a33deaa0e25a20e1b3ea20cf0e43f8046c"}, - {file = "numpy-1.24.3-cp39-cp39-win_amd64.whl", hash = "sha256:d5036197ecae68d7f491fcdb4df90082b0d4960ca6599ba2659957aafced7c17"}, - {file = "numpy-1.24.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:352ee00c7f8387b44d19f4cada524586f07379c0d49270f87233983bc5087ca0"}, - {file = "numpy-1.24.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7d6acc2e7524c9955e5c903160aa4ea083736fde7e91276b0e5d98e6332812"}, - {file = "numpy-1.24.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:35400e6a8d102fd07c71ed7dcadd9eb62ee9a6e84ec159bd48c28235bbb0f8e4"}, - {file = "numpy-1.24.3.tar.gz", hash = "sha256:ab344f1bf21f140adab8e47fdbc7c35a477dc01408791f8ba00d018dd0bc5155"}, -] - -[[package]] -name = "opencv-python" -version = "4.7.0.72" -description = "Wrapper package for OpenCV python bindings." -optional = false -python-versions = ">=3.6" -files = [ - {file = "opencv-python-4.7.0.72.tar.gz", hash = "sha256:3424794a711f33284581f3c1e4b071cfc827d02b99d6fd9a35391f517c453306"}, - {file = "opencv_python-4.7.0.72-cp37-abi3-macosx_10_16_x86_64.whl", hash = "sha256:d4f8880440c433a0025d78804dda6901d1e8e541a561dda66892d90290aef881"}, - {file = "opencv_python-4.7.0.72-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:7a297e7651e22eb17c265ddbbc80e2ba2a8ff4f4a1696a67c45e5f5798245842"}, - {file = "opencv_python-4.7.0.72-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd08343654c6b88c5a8c25bf425f8025aed2e3189b4d7306b5861d32affaf737"}, - {file = "opencv_python-4.7.0.72-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ebfc0a3a2f57716e709028b992e4de7fd8752105d7a768531c4f434043c6f9ff"}, - {file = "opencv_python-4.7.0.72-cp37-abi3-win32.whl", hash = "sha256:eda115797b114fc16ca6f182b91c5d984f0015c19bec3145e55d33d708e9bae1"}, - {file = "opencv_python-4.7.0.72-cp37-abi3-win_amd64.whl", hash = "sha256:812af57553ec1c6709060c63f6b7e9ad07ddc0f592f3ccc6d00c71e0fe0e6376"}, -] - -[package.dependencies] -numpy = [ - {version = ">=1.21.0", markers = "python_version <= \"3.9\" and platform_system == \"Darwin\" and platform_machine == \"arm64\""}, - {version = ">=1.21.2", markers = "python_version >= \"3.10\""}, - {version = ">=1.21.4", markers = "python_version >= \"3.10\" and platform_system == \"Darwin\""}, - {version = ">=1.22.0", markers = "python_version >= \"3.11\""}, - {version = ">=1.19.3", markers = "python_version >= \"3.6\" and platform_system == \"Linux\" and platform_machine == \"aarch64\" or python_version >= \"3.9\""}, - {version = ">=1.17.0", markers = "python_version >= \"3.7\""}, - {version = ">=1.17.3", markers = "python_version >= \"3.8\""}, -] - -[[package]] -name = "packaging" -version = "23.1" -description = "Core utilities for Python packages" -optional = false -python-versions = ">=3.7" -files = [ - {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, - {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, -] - -[[package]] -name = "pandas" -version = "2.0.2" -description = "Powerful data structures for data analysis, time series, and statistics" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pandas-2.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ebb9f1c22ddb828e7fd017ea265a59d80461d5a79154b49a4207bd17514d122"}, - {file = "pandas-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1eb09a242184092f424b2edd06eb2b99d06dc07eeddff9929e8667d4ed44e181"}, - {file = "pandas-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7319b6e68de14e6209460f72a8d1ef13c09fb3d3ef6c37c1e65b35d50b5c145"}, - {file = "pandas-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd46bde7309088481b1cf9c58e3f0e204b9ff9e3244f441accd220dd3365ce7c"}, - {file = "pandas-2.0.2-cp310-cp310-win32.whl", hash = "sha256:51a93d422fbb1bd04b67639ba4b5368dffc26923f3ea32a275d2cc450f1d1c86"}, - {file = "pandas-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:66d00300f188fa5de73f92d5725ced162488f6dc6ad4cecfe4144ca29debe3b8"}, - {file = "pandas-2.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:02755de164da6827764ceb3bbc5f64b35cb12394b1024fdf88704d0fa06e0e2f"}, - {file = "pandas-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0a1e0576611641acde15c2322228d138258f236d14b749ad9af498ab69089e2d"}, - {file = "pandas-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6b5f14cd24a2ed06e14255ff40fe2ea0cfaef79a8dd68069b7ace74bd6acbba"}, - {file = "pandas-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50e451932b3011b61d2961b4185382c92cc8c6ee4658dcd4f320687bb2d000ee"}, - {file = "pandas-2.0.2-cp311-cp311-win32.whl", hash = "sha256:7b21cb72958fc49ad757685db1919021d99650d7aaba676576c9e88d3889d456"}, - {file = "pandas-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:c4af689352c4fe3d75b2834933ee9d0ccdbf5d7a8a7264f0ce9524e877820c08"}, - {file = "pandas-2.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:69167693cb8f9b3fc060956a5d0a0a8dbfed5f980d9fd2c306fb5b9c855c814c"}, - {file = "pandas-2.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:30a89d0fec4263ccbf96f68592fd668939481854d2ff9da709d32a047689393b"}, - {file = "pandas-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a18e5c72b989ff0f7197707ceddc99828320d0ca22ab50dd1b9e37db45b010c0"}, - {file = "pandas-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7376e13d28eb16752c398ca1d36ccfe52bf7e887067af9a0474de6331dd948d2"}, - {file = "pandas-2.0.2-cp38-cp38-win32.whl", hash = "sha256:6d6d10c2142d11d40d6e6c0a190b1f89f525bcf85564707e31b0a39e3b398e08"}, - {file = "pandas-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:e69140bc2d29a8556f55445c15f5794490852af3de0f609a24003ef174528b79"}, - {file = "pandas-2.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b42b120458636a981077cfcfa8568c031b3e8709701315e2bfa866324a83efa8"}, - {file = "pandas-2.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f908a77cbeef9bbd646bd4b81214cbef9ac3dda4181d5092a4aa9797d1bc7774"}, - {file = "pandas-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:713f2f70abcdade1ddd68fc91577cb090b3544b07ceba78a12f799355a13ee44"}, - {file = "pandas-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf3f0c361a4270185baa89ec7ab92ecaa355fe783791457077473f974f654df5"}, - {file = "pandas-2.0.2-cp39-cp39-win32.whl", hash = "sha256:598e9020d85a8cdbaa1815eb325a91cfff2bb2b23c1442549b8a3668e36f0f77"}, - {file = "pandas-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:77550c8909ebc23e56a89f91b40ad01b50c42cfbfab49b3393694a50549295ea"}, - {file = "pandas-2.0.2.tar.gz", hash = "sha256:dd5476b6c3fe410ee95926873f377b856dbc4e81a9c605a0dc05aaccc6a7c6c6"}, -] - -[package.dependencies] -numpy = [ - {version = ">=1.20.3", markers = "python_version < \"3.10\""}, - {version = ">=1.21.0", markers = "python_version >= \"3.10\""}, - {version = ">=1.23.2", markers = "python_version >= \"3.11\""}, -] -python-dateutil = ">=2.8.2" -pytz = ">=2020.1" -tzdata = ">=2022.1" - -[package.extras] -all = ["PyQt5 (>=5.15.1)", "SQLAlchemy (>=1.4.16)", "beautifulsoup4 (>=4.9.3)", "bottleneck (>=1.3.2)", "brotlipy (>=0.7.0)", "fastparquet (>=0.6.3)", "fsspec (>=2021.07.0)", "gcsfs (>=2021.07.0)", "html5lib (>=1.1)", "hypothesis (>=6.34.2)", "jinja2 (>=3.0.0)", "lxml (>=4.6.3)", "matplotlib (>=3.6.1)", "numba (>=0.53.1)", "numexpr (>=2.7.3)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pandas-gbq (>=0.15.0)", "psycopg2 (>=2.8.6)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.2)", "pytest (>=7.0.0)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)", "python-snappy (>=0.6.0)", "pyxlsb (>=1.0.8)", "qtpy (>=2.2.0)", "s3fs (>=2021.08.0)", "scipy (>=1.7.1)", "tables (>=3.6.1)", "tabulate (>=0.8.9)", "xarray (>=0.21.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)", "zstandard (>=0.15.2)"] -aws = ["s3fs (>=2021.08.0)"] -clipboard = ["PyQt5 (>=5.15.1)", "qtpy (>=2.2.0)"] -compression = ["brotlipy (>=0.7.0)", "python-snappy (>=0.6.0)", "zstandard (>=0.15.2)"] -computation = ["scipy (>=1.7.1)", "xarray (>=0.21.0)"] -excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.0.7)", "pyxlsb (>=1.0.8)", "xlrd (>=2.0.1)", "xlsxwriter (>=1.4.3)"] -feather = ["pyarrow (>=7.0.0)"] -fss = ["fsspec (>=2021.07.0)"] -gcp = ["gcsfs (>=2021.07.0)", "pandas-gbq (>=0.15.0)"] -hdf5 = ["tables (>=3.6.1)"] -html = ["beautifulsoup4 (>=4.9.3)", "html5lib (>=1.1)", "lxml (>=4.6.3)"] -mysql = ["SQLAlchemy (>=1.4.16)", "pymysql (>=1.0.2)"] -output-formatting = ["jinja2 (>=3.0.0)", "tabulate (>=0.8.9)"] -parquet = ["pyarrow (>=7.0.0)"] -performance = ["bottleneck (>=1.3.2)", "numba (>=0.53.1)", "numexpr (>=2.7.1)"] -plot = ["matplotlib (>=3.6.1)"] -postgresql = ["SQLAlchemy (>=1.4.16)", "psycopg2 (>=2.8.6)"] -spss = ["pyreadstat (>=1.1.2)"] -sql-other = ["SQLAlchemy (>=1.4.16)"] -test = ["hypothesis (>=6.34.2)", "pytest (>=7.0.0)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)"] -xml = ["lxml (>=4.6.3)"] - -[[package]] -name = "patsy" -version = "0.5.3" -description = "A Python package for describing statistical models and for building design matrices." -optional = false -python-versions = "*" -files = [ - {file = "patsy-0.5.3-py2.py3-none-any.whl", hash = "sha256:7eb5349754ed6aa982af81f636479b1b8db9d5b1a6e957a6016ec0534b5c86b7"}, - {file = "patsy-0.5.3.tar.gz", hash = "sha256:bdc18001875e319bc91c812c1eb6a10be4bb13cb81eb763f466179dca3b67277"}, -] - -[package.dependencies] -numpy = ">=1.4" -six = "*" - -[package.extras] -test = ["pytest", "pytest-cov", "scipy"] - -[[package]] -name = "pillow" -version = "9.5.0" -description = "Python Imaging Library (Fork)" -optional = false -python-versions = ">=3.7" -files = [ - {file = "Pillow-9.5.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:ace6ca218308447b9077c14ea4ef381ba0b67ee78d64046b3f19cf4e1139ad16"}, - {file = "Pillow-9.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d3d403753c9d5adc04d4694d35cf0391f0f3d57c8e0030aac09d7678fa8030aa"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ba1b81ee69573fe7124881762bb4cd2e4b6ed9dd28c9c60a632902fe8db8b38"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe7e1c262d3392afcf5071df9afa574544f28eac825284596ac6db56e6d11062"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f36397bf3f7d7c6a3abdea815ecf6fd14e7fcd4418ab24bae01008d8d8ca15e"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:252a03f1bdddce077eff2354c3861bf437c892fb1832f75ce813ee94347aa9b5"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:85ec677246533e27770b0de5cf0f9d6e4ec0c212a1f89dfc941b64b21226009d"}, - {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b416f03d37d27290cb93597335a2f85ed446731200705b22bb927405320de903"}, - {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1781a624c229cb35a2ac31cc4a77e28cafc8900733a864870c49bfeedacd106a"}, - {file = "Pillow-9.5.0-cp310-cp310-win32.whl", hash = "sha256:8507eda3cd0608a1f94f58c64817e83ec12fa93a9436938b191b80d9e4c0fc44"}, - {file = "Pillow-9.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:d3c6b54e304c60c4181da1c9dadf83e4a54fd266a99c70ba646a9baa626819eb"}, - {file = "Pillow-9.5.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:7ec6f6ce99dab90b52da21cf0dc519e21095e332ff3b399a357c187b1a5eee32"}, - {file = "Pillow-9.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:560737e70cb9c6255d6dcba3de6578a9e2ec4b573659943a5e7e4af13f298f5c"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96e88745a55b88a7c64fa49bceff363a1a27d9a64e04019c2281049444a571e3"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d9c206c29b46cfd343ea7cdfe1232443072bbb270d6a46f59c259460db76779a"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfcc2c53c06f2ccb8976fb5c71d448bdd0a07d26d8e07e321c103416444c7ad1"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:a0f9bb6c80e6efcde93ffc51256d5cfb2155ff8f78292f074f60f9e70b942d99"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8d935f924bbab8f0a9a28404422da8af4904e36d5c33fc6f677e4c4485515625"}, - {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fed1e1cf6a42577953abbe8e6cf2fe2f566daebde7c34724ec8803c4c0cda579"}, - {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c1170d6b195555644f0616fd6ed929dfcf6333b8675fcca044ae5ab110ded296"}, - {file = "Pillow-9.5.0-cp311-cp311-win32.whl", hash = "sha256:54f7102ad31a3de5666827526e248c3530b3a33539dbda27c6843d19d72644ec"}, - {file = "Pillow-9.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:cfa4561277f677ecf651e2b22dc43e8f5368b74a25a8f7d1d4a3a243e573f2d4"}, - {file = "Pillow-9.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:965e4a05ef364e7b973dd17fc765f42233415974d773e82144c9bbaaaea5d089"}, - {file = "Pillow-9.5.0-cp312-cp312-win32.whl", hash = "sha256:22baf0c3cf0c7f26e82d6e1adf118027afb325e703922c8dfc1d5d0156bb2eeb"}, - {file = "Pillow-9.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:432b975c009cf649420615388561c0ce7cc31ce9b2e374db659ee4f7d57a1f8b"}, - {file = "Pillow-9.5.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:5d4ebf8e1db4441a55c509c4baa7a0587a0210f7cd25fcfe74dbbce7a4bd1906"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:375f6e5ee9620a271acb6820b3d1e94ffa8e741c0601db4c0c4d3cb0a9c224bf"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99eb6cafb6ba90e436684e08dad8be1637efb71c4f2180ee6b8f940739406e78"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dfaaf10b6172697b9bceb9a3bd7b951819d1ca339a5ef294d1f1ac6d7f63270"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:763782b2e03e45e2c77d7779875f4432e25121ef002a41829d8868700d119392"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:35f6e77122a0c0762268216315bf239cf52b88865bba522999dc38f1c52b9b47"}, - {file = "Pillow-9.5.0-cp37-cp37m-win32.whl", hash = "sha256:aca1c196f407ec7cf04dcbb15d19a43c507a81f7ffc45b690899d6a76ac9fda7"}, - {file = "Pillow-9.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322724c0032af6692456cd6ed554bb85f8149214d97398bb80613b04e33769f6"}, - {file = "Pillow-9.5.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:a0aa9417994d91301056f3d0038af1199eb7adc86e646a36b9e050b06f526597"}, - {file = "Pillow-9.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f8286396b351785801a976b1e85ea88e937712ee2c3ac653710a4a57a8da5d9c"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c830a02caeb789633863b466b9de10c015bded434deb3ec87c768e53752ad22a"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fbd359831c1657d69bb81f0db962905ee05e5e9451913b18b831febfe0519082"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8fc330c3370a81bbf3f88557097d1ea26cd8b019d6433aa59f71195f5ddebbf"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:7002d0797a3e4193c7cdee3198d7c14f92c0836d6b4a3f3046a64bd1ce8df2bf"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:229e2c79c00e85989a34b5981a2b67aa079fd08c903f0aaead522a1d68d79e51"}, - {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9adf58f5d64e474bed00d69bcd86ec4bcaa4123bfa70a65ce72e424bfb88ed96"}, - {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:662da1f3f89a302cc22faa9f14a262c2e3951f9dbc9617609a47521c69dd9f8f"}, - {file = "Pillow-9.5.0-cp38-cp38-win32.whl", hash = "sha256:6608ff3bf781eee0cd14d0901a2b9cc3d3834516532e3bd673a0a204dc8615fc"}, - {file = "Pillow-9.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:e49eb4e95ff6fd7c0c402508894b1ef0e01b99a44320ba7d8ecbabefddcc5569"}, - {file = "Pillow-9.5.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:482877592e927fd263028c105b36272398e3e1be3269efda09f6ba21fd83ec66"}, - {file = "Pillow-9.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3ded42b9ad70e5f1754fb7c2e2d6465a9c842e41d178f262e08b8c85ed8a1d8e"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c446d2245ba29820d405315083d55299a796695d747efceb5717a8b450324115"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aca1152d93dcc27dc55395604dcfc55bed5f25ef4c98716a928bacba90d33a3"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:608488bdcbdb4ba7837461442b90ea6f3079397ddc968c31265c1e056964f1ef"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:60037a8db8750e474af7ffc9faa9b5859e6c6d0a50e55c45576bf28be7419705"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:07999f5834bdc404c442146942a2ecadd1cb6292f5229f4ed3b31e0a108746b1"}, - {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a127ae76092974abfbfa38ca2d12cbeddcdeac0fb71f9627cc1135bedaf9d51a"}, - {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:489f8389261e5ed43ac8ff7b453162af39c3e8abd730af8363587ba64bb2e865"}, - {file = "Pillow-9.5.0-cp39-cp39-win32.whl", hash = "sha256:9b1af95c3a967bf1da94f253e56b6286b50af23392a886720f563c547e48e964"}, - {file = "Pillow-9.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:77165c4a5e7d5a284f10a6efaa39a0ae8ba839da344f20b111d62cc932fa4e5d"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:833b86a98e0ede388fa29363159c9b1a294b0905b5128baf01db683672f230f5"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aaf305d6d40bd9632198c766fb64f0c1a83ca5b667f16c1e79e1661ab5060140"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0852ddb76d85f127c135b6dd1f0bb88dbb9ee990d2cd9aa9e28526c93e794fba"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:91ec6fe47b5eb5a9968c79ad9ed78c342b1f97a091677ba0e012701add857829"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cb841572862f629b99725ebaec3287fc6d275be9b14443ea746c1dd325053cbd"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c380b27d041209b849ed246b111b7c166ba36d7933ec6e41175fd15ab9eb1572"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c9af5a3b406a50e313467e3565fc99929717f780164fe6fbb7704edba0cebbe"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5671583eab84af046a397d6d0ba25343c00cd50bce03787948e0fff01d4fd9b1"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:84a6f19ce086c1bf894644b43cd129702f781ba5751ca8572f08aa40ef0ab7b7"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1e7723bd90ef94eda669a3c2c19d549874dd5badaeefabefd26053304abe5799"}, - {file = "Pillow-9.5.0.tar.gz", hash = "sha256:bf548479d336726d7a0eceb6e767e179fbde37833ae42794602631a070d630f1"}, -] - -[package.extras] -docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] -tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] - -[[package]] -name = "pyparsing" -version = "3.0.9" -description = "pyparsing module - Classes and methods to define and execute parsing grammars" -optional = false -python-versions = ">=3.6.8" -files = [ - {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, - {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, -] - -[package.extras] -diagrams = ["jinja2", "railroad-diagrams"] - -[[package]] -name = "python-dateutil" -version = "2.8.2" -description = "Extensions to the standard Python datetime module" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -files = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, -] - -[package.dependencies] -six = ">=1.5" - -[[package]] -name = "pytz" -version = "2023.3" -description = "World timezone definitions, modern and historical" -optional = false -python-versions = "*" -files = [ - {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"}, - {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, -] - -[[package]] -name = "scikit-learn" -version = "1.2.2" -description = "A set of python modules for machine learning and data mining" -optional = false -python-versions = ">=3.8" -files = [ - {file = "scikit-learn-1.2.2.tar.gz", hash = "sha256:8429aea30ec24e7a8c7ed8a3fa6213adf3814a6efbea09e16e0a0c71e1a1a3d7"}, - {file = "scikit_learn-1.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99cc01184e347de485bf253d19fcb3b1a3fb0ee4cea5ee3c43ec0cc429b6d29f"}, - {file = "scikit_learn-1.2.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:e6e574db9914afcb4e11ade84fab084536a895ca60aadea3041e85b8ac963edb"}, - {file = "scikit_learn-1.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fe83b676f407f00afa388dd1fdd49e5c6612e551ed84f3b1b182858f09e987d"}, - {file = "scikit_learn-1.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e2642baa0ad1e8f8188917423dd73994bf25429f8893ddbe115be3ca3183584"}, - {file = "scikit_learn-1.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:ad66c3848c0a1ec13464b2a95d0a484fd5b02ce74268eaa7e0c697b904f31d6c"}, - {file = "scikit_learn-1.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dfeaf8be72117eb61a164ea6fc8afb6dfe08c6f90365bde2dc16456e4bc8e45f"}, - {file = "scikit_learn-1.2.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:fe0aa1a7029ed3e1dcbf4a5bc675aa3b1bc468d9012ecf6c6f081251ca47f590"}, - {file = "scikit_learn-1.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:065e9673e24e0dc5113e2dd2b4ca30c9d8aa2fa90f4c0597241c93b63130d233"}, - {file = "scikit_learn-1.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf036ea7ef66115e0d49655f16febfa547886deba20149555a41d28f56fd6d3c"}, - {file = "scikit_learn-1.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:8b0670d4224a3c2d596fd572fb4fa673b2a0ccfb07152688ebd2ea0b8c61025c"}, - {file = "scikit_learn-1.2.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9c710ff9f9936ba8a3b74a455ccf0dcf59b230caa1e9ba0223773c490cab1e51"}, - {file = "scikit_learn-1.2.2-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:2dd3ffd3950e3d6c0c0ef9033a9b9b32d910c61bd06cb8206303fb4514b88a49"}, - {file = "scikit_learn-1.2.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44b47a305190c28dd8dd73fc9445f802b6ea716669cfc22ab1eb97b335d238b1"}, - {file = "scikit_learn-1.2.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:953236889928d104c2ef14027539f5f2609a47ebf716b8cbe4437e85dce42744"}, - {file = "scikit_learn-1.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:7f69313884e8eb311460cc2f28676d5e400bd929841a2c8eb8742ae78ebf7c20"}, - {file = "scikit_learn-1.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8156db41e1c39c69aa2d8599ab7577af53e9e5e7a57b0504e116cc73c39138dd"}, - {file = "scikit_learn-1.2.2-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:fe175ee1dab589d2e1033657c5b6bec92a8a3b69103e3dd361b58014729975c3"}, - {file = "scikit_learn-1.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d5312d9674bed14f73773d2acf15a3272639b981e60b72c9b190a0cffed5bad"}, - {file = "scikit_learn-1.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea061bf0283bf9a9f36ea3c5d3231ba2176221bbd430abd2603b1c3b2ed85c89"}, - {file = "scikit_learn-1.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:6477eed40dbce190f9f9e9d0d37e020815825b300121307942ec2110302b66a3"}, -] - -[package.dependencies] -joblib = ">=1.1.1" -numpy = ">=1.17.3" -scipy = ">=1.3.2" -threadpoolctl = ">=2.0.0" - -[package.extras] -benchmark = ["matplotlib (>=3.1.3)", "memory-profiler (>=0.57.0)", "pandas (>=1.0.5)"] -docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.1.3)", "memory-profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "plotly (>=5.10.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)", "sphinx (>=4.0.1)", "sphinx-gallery (>=0.7.0)", "sphinx-prompt (>=1.3.0)", "sphinxext-opengraph (>=0.4.2)"] -examples = ["matplotlib (>=3.1.3)", "pandas (>=1.0.5)", "plotly (>=5.10.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)"] -tests = ["black (>=22.3.0)", "flake8 (>=3.8.2)", "matplotlib (>=3.1.3)", "mypy (>=0.961)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pytest (>=5.3.1)", "pytest-cov (>=2.9.0)", "scikit-image (>=0.16.2)"] - -[[package]] -name = "scipy" -version = "1.11.0rc1" -description = "Fundamental algorithms for scientific computing in Python" -optional = false -python-versions = "<3.13,>=3.9" -files = [ - {file = "scipy-1.11.0rc1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:af1d5b71b21f1afc0de0d166a16038587c498b691f8243e5749792f2617fd651"}, - {file = "scipy-1.11.0rc1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:73df607643dc8c17228d2bc540473d3dbd09243402d873ec0c3e9b4b1906a27c"}, - {file = "scipy-1.11.0rc1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79b199b9f5b7b1fe7f187dd2922f5ba062ccbbeec82cf2a19cd763325d6b2fe3"}, - {file = "scipy-1.11.0rc1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57f1d0ccbbf8905eda3bf454c9db49679d266e1a7c16038f5d6a630bff7ebb58"}, - {file = "scipy-1.11.0rc1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:eb1514f6cfb843bf9656b8dbb62310a52773154a1f01cad389253f96b67786ab"}, - {file = "scipy-1.11.0rc1-cp310-cp310-win_amd64.whl", hash = "sha256:f80d63babab3297f551b03d152f5b0cbf1505b7d4551c23f63b72e7379373e2c"}, - {file = "scipy-1.11.0rc1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5aa15f2fb3198c1bd2ece26f60961e1c655126b5c041c901f5c5fc2349e32ece"}, - {file = "scipy-1.11.0rc1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:88d0623211e5e54032850e69a9d3d0953f8e66b277a3fde7a0774f7636e75cdd"}, - {file = "scipy-1.11.0rc1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe2126c03b53bac3fd0c8738e25363d07643cbca48553c5603c9a546fb060807"}, - {file = "scipy-1.11.0rc1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25ca2bdb8c6b26f52412ce90d090b4d5a8c7ee5747f8c6ac1c9f587dfaa95b08"}, - {file = "scipy-1.11.0rc1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:83ac6f81fa280f6345b43abf420edba28ea018b2465644363c876b6f5b3341d6"}, - {file = "scipy-1.11.0rc1-cp311-cp311-win_amd64.whl", hash = "sha256:7e253e5bb847cc960fc3c4b87540992f080f9adfcb1fcc665d53824bff002313"}, - {file = "scipy-1.11.0rc1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ba6a6ddf6b0fed76560b5124f570473135bfd66cfd77655cb859dfdb334d4bc0"}, - {file = "scipy-1.11.0rc1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:031b9e45972f370ef9f9b5e1d9879b8cc339ea3637a9a1ea83d4dd53b1bfa3ce"}, - {file = "scipy-1.11.0rc1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82d3ae9098e05be8f2b0092dff62f73694afb82677df57fa1b3531d3fd318929"}, - {file = "scipy-1.11.0rc1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c74ce6155c495e9939569842064e994d72b352bc6cfcfa319753d94dffd16c6"}, - {file = "scipy-1.11.0rc1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3194b3ff1c5f0b7592e814307702f25f00ab457c6d553b609fc3237e48b6a42b"}, - {file = "scipy-1.11.0rc1-cp39-cp39-win_amd64.whl", hash = "sha256:353c993b9caf969182f113729375e2b5573bee77fad7b8afa7ea494dc6bb90b7"}, - {file = "scipy-1.11.0rc1.tar.gz", hash = "sha256:312420789955c875a0126c0f1f949a14c1b2e4807d0a3aff6ebe598d5760e051"}, -] - -[package.dependencies] -numpy = ">=1.21.6,<1.28.0" - -[package.extras] -dev = ["click", "cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] -doc = ["jupytext", "matplotlib (>2)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] -test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] - -[[package]] -name = "seaborn" -version = "0.11.2" -description = "seaborn: statistical data visualization" -optional = false -python-versions = ">=3.6" -files = [ - {file = "seaborn-0.11.2-py3-none-any.whl", hash = "sha256:85a6baa9b55f81a0623abddc4a26b334653ff4c6b18c418361de19dbba0ef283"}, - {file = "seaborn-0.11.2.tar.gz", hash = "sha256:cf45e9286d40826864be0e3c066f98536982baf701a7caa386511792d61ff4f6"}, -] - -[package.dependencies] -matplotlib = ">=2.2" -numpy = ">=1.15" -pandas = ">=0.23" -scipy = ">=1.0" - -[[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] - -[[package]] -name = "statannotations" -version = "0.5.0" -description = "add statistical significance or custom annotations on seaborn plots. Based on statannot 0.2.3" -optional = false -python-versions = ">=3.6" -files = [ - {file = "statannotations-0.5.0-py3-none-any.whl", hash = "sha256:fbcec5666e0eab9eca41e5337e60ee4dce552d0dda2e70c05f73e41498c62b46"}, - {file = "statannotations-0.5.0.tar.gz", hash = "sha256:15449b8c9835c4f4e582aef7698eb2994fe75ced5df0882115f355cc0fe181fb"}, -] - -[package.dependencies] -matplotlib = ">=2.2.2" -numpy = ">=1.12.1" -pandas = ">=0.23.0" -scipy = ">=1.1.0" -seaborn = ">=0.9.0,<0.12" - -[[package]] -name = "statsmodels" -version = "0.14.0" -description = "Statistical computations and models for Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "statsmodels-0.14.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:16bfe0c96a53b20fa19067e3b6bd2f1d39e30d4891ea0d7bc20734a0ae95942d"}, - {file = "statsmodels-0.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5a6a0a1a06ff79be8aa89c8494b33903442859add133f0dda1daf37c3c71682e"}, - {file = "statsmodels-0.14.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77b3cd3a5268ef966a0a08582c591bd29c09c88b4566c892a7c087935234f285"}, - {file = "statsmodels-0.14.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c64ebe9cf376cba0c31aed138e15ed179a1d128612dd241cdf299d159e5e882"}, - {file = "statsmodels-0.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:fb471f757fc45102a87e5d86e87dc2c8c78b34ad4f203679a46520f1d863b9da"}, - {file = "statsmodels-0.14.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:582f9e41092e342aaa04920d17cc3f97240e3ee198672f194719b5a3d08657d6"}, - {file = "statsmodels-0.14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7ebe885ccaa64b4bc5ad49ac781c246e7a594b491f08ab4cfd5aa456c363a6f6"}, - {file = "statsmodels-0.14.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b587ee5d23369a0e881da6e37f78371dce4238cf7638a455db4b633a1a1c62d6"}, - {file = "statsmodels-0.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ef7fa4813c7a73b0d8a0c830250f021c102c71c95e9fe0d6877bcfb56d38b8c"}, - {file = "statsmodels-0.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:a6ad7b8aadccd4e4dd7f315a07bef1bca41d194eeaf4ec600d20dea02d242fce"}, - {file = "statsmodels-0.14.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3757542c95247e4ab025291a740efa5da91dc11a05990c033d40fce31c450dc9"}, - {file = "statsmodels-0.14.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:de489e3ed315bdba55c9d1554a2e89faa65d212e365ab81bc323fa52681fc60e"}, - {file = "statsmodels-0.14.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76e290f4718177bffa8823a780f3b882d56dd64ad1c18cfb4bc8b5558f3f5757"}, - {file = "statsmodels-0.14.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71054f9dbcead56def14e3c9db6f66f943110fdfb19713caf0eb0f08c1ec03fd"}, - {file = "statsmodels-0.14.0-cp38-cp38-win_amd64.whl", hash = "sha256:d7fda067837df94e0a614d93d3a38fb6868958d37f7f50afe2a534524f2660cb"}, - {file = "statsmodels-0.14.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1c7724ad573af26139a98393ae64bc318d1b19762b13442d96c7a3e793f495c3"}, - {file = "statsmodels-0.14.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3b0a135f3bfdeec987e36e3b3b4c53e0bb87a8d91464d2fcc4d169d176f46fdb"}, - {file = "statsmodels-0.14.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce28eb1c397dba437ec39b9ab18f2101806f388c7a0cf9cdfd8f09294ad1c799"}, - {file = "statsmodels-0.14.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68b1c768dd94cc5ba8398121a632b673c625491aa7ed627b82cb4c880a25563f"}, - {file = "statsmodels-0.14.0-cp39-cp39-win_amd64.whl", hash = "sha256:8d1e3e10dfbfcd58119ba5a4d3c7d519182b970a2aebaf0b6f539f55ae16058d"}, - {file = "statsmodels-0.14.0.tar.gz", hash = "sha256:6875c7d689e966d948f15eb816ab5616f4928706b180cf470fd5907ab6f647a4"}, -] - -[package.dependencies] -numpy = [ - {version = ">=1.18", markers = "python_version != \"3.10\" or platform_system != \"Windows\" or platform_python_implementation == \"PyPy\""}, - {version = ">=1.22.3", markers = "python_version == \"3.10\" and platform_system == \"Windows\" and platform_python_implementation != \"PyPy\""}, -] -packaging = ">=21.3" -pandas = ">=1.0" -patsy = ">=0.5.2" -scipy = ">=1.4,<1.9.2 || >1.9.2" - -[package.extras] -build = ["cython (>=0.29.26)"] -develop = ["colorama", "cython (>=0.29.26)", "cython (>=0.29.28,<3.0.0)", "flake8", "isort", "joblib", "matplotlib (>=3)", "oldest-supported-numpy (>=2022.4.18)", "pytest (>=7.0.1,<7.1.0)", "pytest-randomly", "pytest-xdist", "pywinpty", "setuptools-scm[toml] (>=7.0.0,<7.1.0)"] -docs = ["ipykernel", "jupyter-client", "matplotlib", "nbconvert", "nbformat", "numpydoc", "pandas-datareader", "sphinx"] - -[[package]] -name = "threadpoolctl" -version = "3.1.0" -description = "threadpoolctl" -optional = false -python-versions = ">=3.6" -files = [ - {file = "threadpoolctl-3.1.0-py3-none-any.whl", hash = "sha256:8b99adda265feb6773280df41eece7b2e6561b772d21ffd52e372f999024907b"}, - {file = "threadpoolctl-3.1.0.tar.gz", hash = "sha256:a335baacfaa4400ae1f0d8e3a58d6674d2f8828e3716bb2802c44955ad391380"}, -] - -[[package]] -name = "tqdm" -version = "4.65.0" -description = "Fast, Extensible Progress Meter" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tqdm-4.65.0-py3-none-any.whl", hash = "sha256:c4f53a17fe37e132815abceec022631be8ffe1b9381c2e6e30aa70edc99e9671"}, - {file = "tqdm-4.65.0.tar.gz", hash = "sha256:1871fb68a86b8fb3b59ca4cdd3dcccbc7e6d613eeed31f4c332531977b89beb5"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - -[package.extras] -dev = ["py-make (>=0.1.0)", "twine", "wheel"] -notebook = ["ipywidgets (>=6)"] -slack = ["slack-sdk"] -telegram = ["requests"] - -[[package]] -name = "tzdata" -version = "2023.3" -description = "Provider of IANA time zone data" -optional = false -python-versions = ">=2" -files = [ - {file = "tzdata-2023.3-py2.py3-none-any.whl", hash = "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda"}, - {file = "tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"}, -] - -[[package]] -name = "zipp" -version = "3.15.0" -description = "Backport of pathlib-compatible object wrapper for zip files" -optional = false -python-versions = ">=3.7" -files = [ - {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, - {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, -] - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] - -[metadata] -lock-version = "2.0" -python-versions = ">=3.9,<3.13" -content-hash = "9f288495225dd322d508ec3782cc722dc242cf44289b641937e87ded2506d709" From c38ac11f2832b118f4aef4d132f50d40d66e1468 Mon Sep 17 00:00:00 2001 From: dabadav Date: Tue, 13 Jun 2023 17:53:23 +0200 Subject: [PATCH 27/67] Fix Data Handling Class --- pipeline_vsdi/vsdi/vsdi.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pipeline_vsdi/vsdi/vsdi.py b/pipeline_vsdi/vsdi/vsdi.py index 6478e51..8135805 100644 --- a/pipeline_vsdi/vsdi/vsdi.py +++ b/pipeline_vsdi/vsdi/vsdi.py @@ -19,6 +19,7 @@ from scipy.io import loadmat import h5py +import loaders # from loaders import * # from pipeline_vsdi.preprocessing.utils import * From adb4984d2526f48a4319b515dc7a9fcb7ab52a5b Mon Sep 17 00:00:00 2001 From: dabadav Date: Tue, 13 Jun 2023 17:55:03 +0200 Subject: [PATCH 28/67] Fix Data Handling Class --- pipeline_vsdi/vsdi/vsdi.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pipeline_vsdi/vsdi/vsdi.py b/pipeline_vsdi/vsdi/vsdi.py index 8135805..20fba1c 100644 --- a/pipeline_vsdi/vsdi/vsdi.py +++ b/pipeline_vsdi/vsdi/vsdi.py @@ -20,6 +20,7 @@ from scipy.io import loadmat import h5py import loaders +from pipeline_vsdi.preprocessing.utils import make_design_matrix, normalize_vsdi, clean_outliers # from loaders import * # from pipeline_vsdi.preprocessing.utils import * From b7d13a96fc7869fd1a2b44146046f6316a907d83 Mon Sep 17 00:00:00 2001 From: dabadav Date: Tue, 13 Jun 2023 17:56:17 +0200 Subject: [PATCH 29/67] Fix Data Handling Class --- pipeline_vsdi/vsdi/vsdi.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipeline_vsdi/vsdi/vsdi.py b/pipeline_vsdi/vsdi/vsdi.py index 20fba1c..ccdeac5 100644 --- a/pipeline_vsdi/vsdi/vsdi.py +++ b/pipeline_vsdi/vsdi/vsdi.py @@ -20,7 +20,7 @@ from scipy.io import loadmat import h5py import loaders -from pipeline_vsdi.preprocessing.utils import make_design_matrix, normalize_vsdi, clean_outliers +from pipeline_vsdi.preprocessing.behavior import make_design_matrix # from loaders import * # from pipeline_vsdi.preprocessing.utils import * From da8edb24a62bccae9841f31ae056088177d04e69 Mon Sep 17 00:00:00 2001 From: dabadav Date: Tue, 13 Jun 2023 18:00:22 +0200 Subject: [PATCH 30/67] Fix Data Handling Class --- pipeline_vsdi/vsdi/vsdi.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipeline_vsdi/vsdi/vsdi.py b/pipeline_vsdi/vsdi/vsdi.py index ccdeac5..5291bbc 100644 --- a/pipeline_vsdi/vsdi/vsdi.py +++ b/pipeline_vsdi/vsdi/vsdi.py @@ -54,7 +54,7 @@ def __exit__(self, type, value, traceback): """Exit method for the DataLoader context manager.""" self.file.close() - def load_data(self, datapath, animals, days, sessions): + def load_data(self, datapath, animals, days, sessions, event_sequences): """ Load VSI data into the HDF5 file. From 5fc296bcda03027b09232903bc9fd0d10bf971f8 Mon Sep 17 00:00:00 2001 From: dabadav Date: Tue, 13 Jun 2023 18:07:21 +0200 Subject: [PATCH 31/67] Fix Data Handling Class --- docs/preprocessing.rst | 8 ++++++++ pipeline_vsdi/vsdi/vsdi.py | 5 +---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/docs/preprocessing.rst b/docs/preprocessing.rst index 2c27bb6..8166232 100644 --- a/docs/preprocessing.rst +++ b/docs/preprocessing.rst @@ -9,6 +9,14 @@ preprocessing.clustering module :undoc-members: :show-inheritance: +preprocessing.behavior module +----------------------------- + +.. automodule:: preprocessing.behavior + :members: + :undoc-members: + :show-inheritance: + preprocessing.utils module -------------------------- diff --git a/pipeline_vsdi/vsdi/vsdi.py b/pipeline_vsdi/vsdi/vsdi.py index 5291bbc..e085693 100644 --- a/pipeline_vsdi/vsdi/vsdi.py +++ b/pipeline_vsdi/vsdi/vsdi.py @@ -19,12 +19,9 @@ from scipy.io import loadmat import h5py -import loaders +import pipeline_vsdi.vsdi.loaders as loaders from pipeline_vsdi.preprocessing.behavior import make_design_matrix -# from loaders import * -# from pipeline_vsdi.preprocessing.utils import * - class DataLoader: """ Handling VSDI data full dataset using HDF5 files From 7c16e280df9adfb2251136ff9a2b664b881a0a61 Mon Sep 17 00:00:00 2001 From: dabadav Date: Tue, 13 Jun 2023 18:11:02 +0200 Subject: [PATCH 32/67] Publish Docs --- .readthedocs.yaml | 56 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 .readthedocs.yaml diff --git a/.readthedocs.yaml b/.readthedocs.yaml new file mode 100644 index 0000000..3adeba7 --- /dev/null +++ b/.readthedocs.yaml @@ -0,0 +1,56 @@ +# Read the Docs configuration file for Sphinx projects + +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + + +# Required + +version: 2 + + +# Set the OS, Python version and other tools you might need + +build: + + os: ubuntu-22.04 + + tools: + + python: "3.11" + + # You can also specify other tool versions: + + # nodejs: "19" + + # rust: "1.64" + + # golang: "1.19" + + +# Build documentation in the "docs/" directory with Sphinx + +sphinx: + + configuration: docs/conf.py + + +# Optionally build your docs in additional formats such as PDF and ePub + +# formats: + +# - pdf + +# - epub + + +# Optional but recommended, declare the Python requirements required + +# to build your documentation + +# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html + +# python: + +# install: + +# - requirements: docs/requirements.txt From 246adb39d10e2bfe941b8213acd647dfad9abd46 Mon Sep 17 00:00:00 2001 From: dabadav Date: Tue, 13 Jun 2023 18:13:57 +0200 Subject: [PATCH 33/67] Publish Docs --- .readthedocs.yaml | 27 +-------------------------- 1 file changed, 1 insertion(+), 26 deletions(-) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 3adeba7..82dfe1f 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -1,56 +1,31 @@ # Read the Docs configuration file for Sphinx projects - # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details - # Required - version: 2 - # Set the OS, Python version and other tools you might need - build: - os: ubuntu-22.04 - tools: - python: "3.11" - # You can also specify other tool versions: - # nodejs: "19" - # rust: "1.64" - # golang: "1.19" - # Build documentation in the "docs/" directory with Sphinx - sphinx: - configuration: docs/conf.py - # Optionally build your docs in additional formats such as PDF and ePub - # formats: - # - pdf - # - epub - # Optional but recommended, declare the Python requirements required - # to build your documentation - # See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html - # python: - # install: - -# - requirements: docs/requirements.txt +# - requirements: docs/requirements.txt \ No newline at end of file From 3757aa6898fd59540d9a3aec79d52ece85047282 Mon Sep 17 00:00:00 2001 From: dabadav Date: Tue, 13 Jun 2023 18:17:54 +0200 Subject: [PATCH 34/67] Publish Docs --- docs/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index b993e95..78a8329 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -13,7 +13,7 @@ project = 'VSDI Pipeline' copyright = '2023, NeuroNetMem' author = 'NeuroNetMem' -release = '1.0.0' +release = '0.1.0' # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration From 3bc74e8b7fdf97cb0ed0f8d0986b02fe80c0f7af Mon Sep 17 00:00:00 2001 From: dabadav Date: Wed, 14 Jun 2023 00:54:23 +0200 Subject: [PATCH 35/67] More Docs --- docs/_static/favicon/favicon.ico | Bin 0 -> 2889 bytes docs/_templates/autosummary/attribute.rst | 13 ++ docs/_templates/autosummary/base.rst | 17 +++ docs/_templates/autosummary/class.rst | 27 +++++ docs/_templates/autosummary/member.rst | 13 ++ docs/_templates/autosummary/method.rst | 13 ++ .../_templates/autosummary/minimal_module.rst | 8 ++ docs/_templates/autosummary/module.rst | 40 +++++++ docs/_templates/layout.html | 10 -- docs/conf.py | 26 +++- docs/dim_reduction.rst | 11 -- ...im_reduction.VAE.Conv_AE.T_destination.rst | 11 ++ ...sdi.dim_reduction.VAE.Conv_AE.__call__.rst | 11 ++ ...i.dim_reduction.VAE.Conv_AE.add_module.rst | 11 ++ ...e_vsdi.dim_reduction.VAE.Conv_AE.apply.rst | 11 ++ ...sdi.dim_reduction.VAE.Conv_AE.backward.rst | 11 ++ ...sdi.dim_reduction.VAE.Conv_AE.bfloat16.rst | 11 ++ ...vsdi.dim_reduction.VAE.Conv_AE.buffers.rst | 11 ++ ..._reduction.VAE.Conv_AE.call_super_init.rst | 11 ++ ...sdi.dim_reduction.VAE.Conv_AE.children.rst | 11 ++ ...ine_vsdi.dim_reduction.VAE.Conv_AE.cpu.rst | 11 ++ ...ne_vsdi.dim_reduction.VAE.Conv_AE.cuda.rst | 11 ++ ..._vsdi.dim_reduction.VAE.Conv_AE.double.rst | 11 ++ ...dim_reduction.VAE.Conv_AE.dump_patches.rst | 11 ++ ...ne_vsdi.dim_reduction.VAE.Conv_AE.eval.rst | 11 ++ ...i.dim_reduction.VAE.Conv_AE.extra_repr.rst | 11 ++ ...e_vsdi.dim_reduction.VAE.Conv_AE.float.rst | 11 ++ ...vsdi.dim_reduction.VAE.Conv_AE.forward.rst | 11 ++ ...i.dim_reduction.VAE.Conv_AE.get_buffer.rst | 11 ++ ..._reduction.VAE.Conv_AE.get_extra_state.rst | 11 ++ ...im_reduction.VAE.Conv_AE.get_parameter.rst | 11 ++ ...im_reduction.VAE.Conv_AE.get_submodule.rst | 11 ++ ...ne_vsdi.dim_reduction.VAE.Conv_AE.half.rst | 11 ++ ...ine_vsdi.dim_reduction.VAE.Conv_AE.ipu.rst | 11 ++ ..._reduction.VAE.Conv_AE.load_state_dict.rst | 11 ++ ...vsdi.dim_reduction.VAE.Conv_AE.modules.rst | 11 ++ ...im_reduction.VAE.Conv_AE.named_buffers.rst | 11 ++ ...m_reduction.VAE.Conv_AE.named_children.rst | 11 ++ ...im_reduction.VAE.Conv_AE.named_modules.rst | 11 ++ ...reduction.VAE.Conv_AE.named_parameters.rst | 11 ++ ...i.dim_reduction.VAE.Conv_AE.parameters.rst | 11 ++ ...ion.VAE.Conv_AE.register_backward_hook.rst | 11 ++ ..._reduction.VAE.Conv_AE.register_buffer.rst | 11 ++ ...tion.VAE.Conv_AE.register_forward_hook.rst | 11 ++ ....VAE.Conv_AE.register_forward_pre_hook.rst | 11 ++ ...AE.Conv_AE.register_full_backward_hook.rst | 11 ++ ...onv_AE.register_full_backward_pre_hook.rst | 11 ++ ..._AE.register_load_state_dict_post_hook.rst | 11 ++ ..._reduction.VAE.Conv_AE.register_module.rst | 11 ++ ...duction.VAE.Conv_AE.register_parameter.rst | 11 ++ ...E.Conv_AE.register_state_dict_pre_hook.rst | 11 ++ ...m_reduction.VAE.Conv_AE.requires_grad_.rst | 11 ++ ...ipeline_vsdi.dim_reduction.VAE.Conv_AE.rst | 74 ++++++++++++ ..._reduction.VAE.Conv_AE.set_extra_state.rst | 11 ++ ...dim_reduction.VAE.Conv_AE.share_memory.rst | 11 ++ ...i.dim_reduction.VAE.Conv_AE.state_dict.rst | 11 ++ ...line_vsdi.dim_reduction.VAE.Conv_AE.to.rst | 11 ++ ...sdi.dim_reduction.VAE.Conv_AE.to_empty.rst | 11 ++ ...e_vsdi.dim_reduction.VAE.Conv_AE.train.rst | 11 ++ ...sdi.dim_reduction.VAE.Conv_AE.training.rst | 11 ++ ...ne_vsdi.dim_reduction.VAE.Conv_AE.type.rst | 11 ++ ...ine_vsdi.dim_reduction.VAE.Conv_AE.xpu.rst | 11 ++ ...di.dim_reduction.VAE.Conv_AE.zero_grad.rst | 11 ++ ...m_reduction.VAE.Conv_VAE.T_destination.rst | 11 ++ ...di.dim_reduction.VAE.Conv_VAE.__call__.rst | 11 ++ ....dim_reduction.VAE.Conv_VAE.add_module.rst | 11 ++ ..._vsdi.dim_reduction.VAE.Conv_VAE.apply.rst | 11 ++ ...di.dim_reduction.VAE.Conv_VAE.backward.rst | 11 ++ ...di.dim_reduction.VAE.Conv_VAE.bfloat16.rst | 11 ++ ...sdi.dim_reduction.VAE.Conv_VAE.buffers.rst | 11 ++ ...reduction.VAE.Conv_VAE.call_super_init.rst | 11 ++ ...di.dim_reduction.VAE.Conv_VAE.children.rst | 11 ++ ...ne_vsdi.dim_reduction.VAE.Conv_VAE.cpu.rst | 11 ++ ...e_vsdi.dim_reduction.VAE.Conv_VAE.cuda.rst | 11 ++ ...vsdi.dim_reduction.VAE.Conv_VAE.double.rst | 11 ++ ...im_reduction.VAE.Conv_VAE.dump_patches.rst | 11 ++ ...e_vsdi.dim_reduction.VAE.Conv_VAE.eval.rst | 11 ++ ....dim_reduction.VAE.Conv_VAE.extra_repr.rst | 11 ++ ..._vsdi.dim_reduction.VAE.Conv_VAE.float.rst | 11 ++ ...sdi.dim_reduction.VAE.Conv_VAE.forward.rst | 11 ++ ....dim_reduction.VAE.Conv_VAE.get_buffer.rst | 11 ++ ...reduction.VAE.Conv_VAE.get_extra_state.rst | 11 ++ ...m_reduction.VAE.Conv_VAE.get_parameter.rst | 11 ++ ...m_reduction.VAE.Conv_VAE.get_submodule.rst | 11 ++ ...e_vsdi.dim_reduction.VAE.Conv_VAE.half.rst | 11 ++ ...ne_vsdi.dim_reduction.VAE.Conv_VAE.ipu.rst | 11 ++ ...reduction.VAE.Conv_VAE.load_state_dict.rst | 11 ++ ...sdi.dim_reduction.VAE.Conv_VAE.modules.rst | 11 ++ ...m_reduction.VAE.Conv_VAE.named_buffers.rst | 11 ++ ..._reduction.VAE.Conv_VAE.named_children.rst | 11 ++ ...m_reduction.VAE.Conv_VAE.named_modules.rst | 11 ++ ...eduction.VAE.Conv_VAE.named_parameters.rst | 11 ++ ....dim_reduction.VAE.Conv_VAE.parameters.rst | 11 ++ ...on.VAE.Conv_VAE.register_backward_hook.rst | 11 ++ ...reduction.VAE.Conv_VAE.register_buffer.rst | 11 ++ ...ion.VAE.Conv_VAE.register_forward_hook.rst | 11 ++ ...VAE.Conv_VAE.register_forward_pre_hook.rst | 11 ++ ...E.Conv_VAE.register_full_backward_hook.rst | 11 ++ ...nv_VAE.register_full_backward_pre_hook.rst | 11 ++ ...VAE.register_load_state_dict_post_hook.rst | 11 ++ ...reduction.VAE.Conv_VAE.register_module.rst | 11 ++ ...uction.VAE.Conv_VAE.register_parameter.rst | 11 ++ ....Conv_VAE.register_state_dict_pre_hook.rst | 11 ++ ...m_reduction.VAE.Conv_VAE.reparametrize.rst | 11 ++ ..._reduction.VAE.Conv_VAE.requires_grad_.rst | 11 ++ ...peline_vsdi.dim_reduction.VAE.Conv_VAE.rst | 75 ++++++++++++ ...reduction.VAE.Conv_VAE.set_extra_state.rst | 11 ++ ...im_reduction.VAE.Conv_VAE.share_memory.rst | 11 ++ ....dim_reduction.VAE.Conv_VAE.state_dict.rst | 11 ++ ...ine_vsdi.dim_reduction.VAE.Conv_VAE.to.rst | 11 ++ ...di.dim_reduction.VAE.Conv_VAE.to_empty.rst | 11 ++ ..._vsdi.dim_reduction.VAE.Conv_VAE.train.rst | 11 ++ ...di.dim_reduction.VAE.Conv_VAE.training.rst | 11 ++ ...e_vsdi.dim_reduction.VAE.Conv_VAE.type.rst | 11 ++ ...ne_vsdi.dim_reduction.VAE.Conv_VAE.xpu.rst | 11 ++ ...i.dim_reduction.VAE.Conv_VAE.zero_grad.rst | 11 ++ ...di.dim_reduction.VAE.create_dataloader.rst | 11 ++ ...duction.VAE.find_max_activation_images.rst | 11 ++ ...i.dim_reduction.VAE.get_latent_vectors.rst | 11 ++ ...im_reduction.VAE.linear_decoding_error.rst | 11 ++ ...im_reduction.VAE.linear_decoding_score.rst | 11 ++ ...ipeline_vsdi.dim_reduction.VAE.predict.rst | 11 ++ .../pipeline_vsdi.dim_reduction.VAE.rst | 45 +++++++ ...di.dim_reduction.VAE.shuffle_2D_matrix.rst | 11 ++ ...di.dim_reduction.VAE.train_autoencoder.rst | 11 ++ ...i.dim_reduction.linear_dim_red.pca_ica.rst | 11 ++ ...line_vsdi.dim_reduction.linear_dim_red.rst | 30 +++++ ...ing.behavior.compute_and_add_lick_rate.rst | 11 ++ ...eprocessing.behavior.compute_lick_rate.rst | 11 ++ ...vsdi.preprocessing.behavior.get_trials.rst | 11 ++ ...processing.behavior.make_design_matrix.rst | 11 ++ .../pipeline_vsdi.preprocessing.behavior.rst | 35 ++++++ ...i.preprocessing.behavior.store_indices.rst | 11 ++ ...ne_vsdi.preprocessing.behavior.subsets.rst | 11 ++ ...processing.clustering.cluster_and_plot.rst | 11 ++ ...ing.clustering.compute_distance_matrix.rst | 11 ++ ...pipeline_vsdi.preprocessing.clustering.rst | 31 +++++ ...sdi.preprocessing.utils.clean_outliers.rst | 11 ++ ...essing.utils.compute_and_add_lick_rate.rst | 11 ++ ....preprocessing.utils.compute_lick_rate.rst | 11 ++ ...sdi.preprocessing.utils.crop_to_bounds.rst | 11 ++ ...e_vsdi.preprocessing.utils.filter_data.rst | 11 ++ ..._vsdi.preprocessing.utils.filter_data2.rst | 11 ++ ...ocessing.utils.find_bounding_rectangle.rst | 11 ++ ...vsdi.preprocessing.utils.find_outliers.rst | 11 ++ ...ne_vsdi.preprocessing.utils.get_trials.rst | 11 ++ ...preprocessing.utils.make_design_matrix.rst | 11 ++ ...sdi.preprocessing.utils.moving_average.rst | 11 ++ ...sdi.preprocessing.utils.normalize_vsdi.rst | 11 ++ ...eline_vsdi.preprocessing.utils.pca_ica.rst | 11 ++ ...essing.utils.plot_decoding_performance.rst | 11 ++ ...peline_vsdi.preprocessing.utils.resize.rst | 11 ++ ..._vsdi.preprocessing.utils.resize_video.rst | 11 ++ .../pipeline_vsdi.preprocessing.utils.rst | 51 ++++++++ ...ne_vsdi.preprocessing.utils.split_data.rst | 11 ++ ...vsdi.preprocessing.utils.store_indices.rst | 11 ++ ...eline_vsdi.preprocessing.utils.subsets.rst | 11 ++ ...preprocessing.utils.train_SVM_baseline.rst | 11 ++ ...reprocessing.utils.train_SVM_baseline2.rst | 11 ++ ...vsdi.preprocessing.utils.train_SVM_day.rst | 11 ++ ...ssing.vsdi_preprocessing.check_bimodal.rst | 11 ++ ...di_preprocessing.clean_hemodynamic_pca.rst | 11 ++ ....vsdi_preprocessing.clean_hemodynamics.rst | 11 ++ ...sing.vsdi_preprocessing.clean_outliers.rst | 11 ++ ...ssing.vsdi_preprocessing.design_matrix.rst | 11 ++ ...ssing.vsdi_preprocessing.find_outliers.rst | 11 ++ ...g.vsdi_preprocessing.find_outliers_old.rst | 11 ++ ...i.preprocessing.vsdi_preprocessing.glm.rst | 11 ++ ...cessing.vsdi_preprocessing.merge_masks.rst | 11 ++ ...i.preprocessing.vsdi_preprocessing.pca.rst | 11 ++ ...eprocessing.vsdi_preprocessing.pca_ica.rst | 11 ++ ...ssing.vsdi_preprocessing.peak_distance.rst | 11 ++ ..._vsdi.preprocessing.vsdi_preprocessing.rst | 41 +++++++ ...ualization.convert_pvalue_to_asterisks.rst | 11 ++ ...zation.vsdi_visualization.create_frame.rst | 11 ++ ...ion.vsdi_visualization.fingerprint_gif.rst | 11 ++ ...lization.vsdi_visualization.plot_betas.rst | 11 ++ ...n.vsdi_visualization.plot_fingerprints.rst | 11 ++ ...sualization.plot_timecourse_histograms.rst | 11 ++ ...on.vsdi_visualization.plot_timecourses.rst | 11 ++ ..._vsdi.visualization.vsdi_visualization.rst | 37 ++++++ ...n.vsdi_visualization.timecourse_around.rst | 11 ++ ....vsdi.loaders.extract_behavioural_data.rst | 11 ++ ...ine_vsdi.vsdi.loaders.extract_lfp_data.rst | 11 ++ ...ine_vsdi.vsdi.loaders.read_data_fields.rst | 11 ++ docs/generated/pipeline_vsdi.vsdi.loaders.rst | 32 +++++ ...e_vsdi.vsdi.vsdi.DataLoader.clean_vsdi.rst | 11 ++ ...ine_vsdi.vsdi.vsdi.DataLoader.get_data.rst | 11 ++ ...ne_vsdi.vsdi.vsdi.DataLoader.load_data.rst | 11 ++ .../pipeline_vsdi.vsdi.vsdi.DataLoader.rst | 21 ++++ docs/generated/pipeline_vsdi.vsdi.vsdi.rst | 30 +++++ docs/index.rst | 9 +- docs/modules.rst | 10 -- docs/pipeline_vsdi.dim_reduction.rst | 14 +++ docs/pipeline_vsdi.preprocessing.rst | 16 +++ docs/pipeline_vsdi.visualization.rst | 13 ++ docs/pipeline_vsdi.vsdi.rst | 14 +++ docs/preprocessing.rst | 34 ------ docs/visualization.rst | 18 --- docs/vsdi.rst | 19 --- pipeline_vsdi/dim_reduction/VAE.py | 68 +---------- pipeline_vsdi/dim_reduction/linear_dim_red.py | 96 +++++++++++++++ pipeline_vsdi/preprocessing/behavior.py | 73 ++++++++++-- .../preprocessing/vsdi_preprocessing.py | 1 + pipeline_vsdi/vsdi/loaders.py | 112 ++++++++++++++++++ 205 files changed, 2840 insertions(+), 185 deletions(-) create mode 100644 docs/_static/favicon/favicon.ico create mode 100644 docs/_templates/autosummary/attribute.rst create mode 100644 docs/_templates/autosummary/base.rst create mode 100644 docs/_templates/autosummary/class.rst create mode 100644 docs/_templates/autosummary/member.rst create mode 100644 docs/_templates/autosummary/method.rst create mode 100644 docs/_templates/autosummary/minimal_module.rst create mode 100644 docs/_templates/autosummary/module.rst delete mode 100644 docs/_templates/layout.html delete mode 100644 docs/dim_reduction.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.T_destination.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.__call__.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.add_module.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.apply.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.backward.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.bfloat16.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.buffers.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.call_super_init.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.children.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.cpu.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.cuda.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.double.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.dump_patches.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.eval.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.extra_repr.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.float.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.forward.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.get_buffer.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.get_extra_state.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.get_parameter.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.get_submodule.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.half.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.ipu.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.load_state_dict.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.modules.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.named_buffers.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.named_children.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.named_modules.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.named_parameters.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.parameters.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_backward_hook.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_buffer.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_forward_hook.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_forward_pre_hook.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_full_backward_hook.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_full_backward_pre_hook.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_load_state_dict_post_hook.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_module.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_parameter.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_state_dict_pre_hook.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.requires_grad_.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.set_extra_state.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.share_memory.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.state_dict.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.to.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.to_empty.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.train.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.training.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.type.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.xpu.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.zero_grad.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.T_destination.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.__call__.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.add_module.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.apply.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.backward.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.bfloat16.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.buffers.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.call_super_init.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.children.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.cpu.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.cuda.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.double.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.dump_patches.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.eval.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.extra_repr.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.float.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.forward.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.get_buffer.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.get_extra_state.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.get_parameter.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.get_submodule.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.half.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.ipu.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.load_state_dict.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.modules.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.named_buffers.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.named_children.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.named_modules.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.named_parameters.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.parameters.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_backward_hook.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_buffer.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_forward_hook.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_forward_pre_hook.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_full_backward_hook.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_full_backward_pre_hook.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_load_state_dict_post_hook.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_module.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_parameter.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_state_dict_pre_hook.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.reparametrize.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.requires_grad_.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.set_extra_state.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.share_memory.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.state_dict.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.to.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.to_empty.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.train.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.training.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.type.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.xpu.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.zero_grad.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.create_dataloader.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.find_max_activation_images.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.get_latent_vectors.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.linear_decoding_error.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.linear_decoding_score.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.predict.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.shuffle_2D_matrix.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.train_autoencoder.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.linear_dim_red.pca_ica.rst create mode 100644 docs/generated/pipeline_vsdi.dim_reduction.linear_dim_red.rst create mode 100644 docs/generated/pipeline_vsdi.preprocessing.behavior.compute_and_add_lick_rate.rst create mode 100644 docs/generated/pipeline_vsdi.preprocessing.behavior.compute_lick_rate.rst create mode 100644 docs/generated/pipeline_vsdi.preprocessing.behavior.get_trials.rst create mode 100644 docs/generated/pipeline_vsdi.preprocessing.behavior.make_design_matrix.rst create mode 100644 docs/generated/pipeline_vsdi.preprocessing.behavior.rst create mode 100644 docs/generated/pipeline_vsdi.preprocessing.behavior.store_indices.rst create mode 100644 docs/generated/pipeline_vsdi.preprocessing.behavior.subsets.rst create mode 100644 docs/generated/pipeline_vsdi.preprocessing.clustering.cluster_and_plot.rst create mode 100644 docs/generated/pipeline_vsdi.preprocessing.clustering.compute_distance_matrix.rst create mode 100644 docs/generated/pipeline_vsdi.preprocessing.clustering.rst create mode 100644 docs/generated/pipeline_vsdi.preprocessing.utils.clean_outliers.rst create mode 100644 docs/generated/pipeline_vsdi.preprocessing.utils.compute_and_add_lick_rate.rst create mode 100644 docs/generated/pipeline_vsdi.preprocessing.utils.compute_lick_rate.rst create mode 100644 docs/generated/pipeline_vsdi.preprocessing.utils.crop_to_bounds.rst create mode 100644 docs/generated/pipeline_vsdi.preprocessing.utils.filter_data.rst create mode 100644 docs/generated/pipeline_vsdi.preprocessing.utils.filter_data2.rst create mode 100644 docs/generated/pipeline_vsdi.preprocessing.utils.find_bounding_rectangle.rst create mode 100644 docs/generated/pipeline_vsdi.preprocessing.utils.find_outliers.rst create mode 100644 docs/generated/pipeline_vsdi.preprocessing.utils.get_trials.rst create mode 100644 docs/generated/pipeline_vsdi.preprocessing.utils.make_design_matrix.rst create mode 100644 docs/generated/pipeline_vsdi.preprocessing.utils.moving_average.rst create mode 100644 docs/generated/pipeline_vsdi.preprocessing.utils.normalize_vsdi.rst create mode 100644 docs/generated/pipeline_vsdi.preprocessing.utils.pca_ica.rst create mode 100644 docs/generated/pipeline_vsdi.preprocessing.utils.plot_decoding_performance.rst create mode 100644 docs/generated/pipeline_vsdi.preprocessing.utils.resize.rst create mode 100644 docs/generated/pipeline_vsdi.preprocessing.utils.resize_video.rst create mode 100644 docs/generated/pipeline_vsdi.preprocessing.utils.rst create mode 100644 docs/generated/pipeline_vsdi.preprocessing.utils.split_data.rst create mode 100644 docs/generated/pipeline_vsdi.preprocessing.utils.store_indices.rst create mode 100644 docs/generated/pipeline_vsdi.preprocessing.utils.subsets.rst create mode 100644 docs/generated/pipeline_vsdi.preprocessing.utils.train_SVM_baseline.rst create mode 100644 docs/generated/pipeline_vsdi.preprocessing.utils.train_SVM_baseline2.rst create mode 100644 docs/generated/pipeline_vsdi.preprocessing.utils.train_SVM_day.rst create mode 100644 docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.check_bimodal.rst create mode 100644 docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.clean_hemodynamic_pca.rst create mode 100644 docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.clean_hemodynamics.rst create mode 100644 docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.clean_outliers.rst create mode 100644 docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.design_matrix.rst create mode 100644 docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.find_outliers.rst create mode 100644 docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.find_outliers_old.rst create mode 100644 docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.glm.rst create mode 100644 docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.merge_masks.rst create mode 100644 docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.pca.rst create mode 100644 docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.pca_ica.rst create mode 100644 docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.peak_distance.rst create mode 100644 docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.rst create mode 100644 docs/generated/pipeline_vsdi.visualization.vsdi_visualization.convert_pvalue_to_asterisks.rst create mode 100644 docs/generated/pipeline_vsdi.visualization.vsdi_visualization.create_frame.rst create mode 100644 docs/generated/pipeline_vsdi.visualization.vsdi_visualization.fingerprint_gif.rst create mode 100644 docs/generated/pipeline_vsdi.visualization.vsdi_visualization.plot_betas.rst create mode 100644 docs/generated/pipeline_vsdi.visualization.vsdi_visualization.plot_fingerprints.rst create mode 100644 docs/generated/pipeline_vsdi.visualization.vsdi_visualization.plot_timecourse_histograms.rst create mode 100644 docs/generated/pipeline_vsdi.visualization.vsdi_visualization.plot_timecourses.rst create mode 100644 docs/generated/pipeline_vsdi.visualization.vsdi_visualization.rst create mode 100644 docs/generated/pipeline_vsdi.visualization.vsdi_visualization.timecourse_around.rst create mode 100644 docs/generated/pipeline_vsdi.vsdi.loaders.extract_behavioural_data.rst create mode 100644 docs/generated/pipeline_vsdi.vsdi.loaders.extract_lfp_data.rst create mode 100644 docs/generated/pipeline_vsdi.vsdi.loaders.read_data_fields.rst create mode 100644 docs/generated/pipeline_vsdi.vsdi.loaders.rst create mode 100644 docs/generated/pipeline_vsdi.vsdi.vsdi.DataLoader.clean_vsdi.rst create mode 100644 docs/generated/pipeline_vsdi.vsdi.vsdi.DataLoader.get_data.rst create mode 100644 docs/generated/pipeline_vsdi.vsdi.vsdi.DataLoader.load_data.rst create mode 100644 docs/generated/pipeline_vsdi.vsdi.vsdi.DataLoader.rst create mode 100644 docs/generated/pipeline_vsdi.vsdi.vsdi.rst delete mode 100644 docs/modules.rst create mode 100644 docs/pipeline_vsdi.dim_reduction.rst create mode 100644 docs/pipeline_vsdi.preprocessing.rst create mode 100644 docs/pipeline_vsdi.visualization.rst create mode 100644 docs/pipeline_vsdi.vsdi.rst delete mode 100644 docs/preprocessing.rst delete mode 100644 docs/visualization.rst delete mode 100644 docs/vsdi.rst diff --git a/docs/_static/favicon/favicon.ico b/docs/_static/favicon/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..6b1f190eb3d802034819c256243f231a51afff13 GIT binary patch literal 2889 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 literal 0 HcmV?d00001 diff --git a/docs/_templates/autosummary/attribute.rst b/docs/_templates/autosummary/attribute.rst new file mode 100644 index 0000000..17d065e --- /dev/null +++ b/docs/_templates/autosummary/attribute.rst @@ -0,0 +1,13 @@ +:orphan: + +{{ fullname | escape | underline}} + +.. currentmodule:: {{ module }} + +attribute + +.. auto{{ objtype }}:: {{ fullname | replace("pipeline_vsdi.", "pipeline_vsdi::") }} + +{# In the fullname (e.g. `numpy.ma.MaskedArray.methodname`), the module name +is ambiguous. Using a `::` separator (e.g. `numpy::ma.MaskedArray.methodname`) +specifies `numpy` as the module name. #} diff --git a/docs/_templates/autosummary/base.rst b/docs/_templates/autosummary/base.rst new file mode 100644 index 0000000..ec7846d --- /dev/null +++ b/docs/_templates/autosummary/base.rst @@ -0,0 +1,17 @@ +{% if objtype == 'property' %} +:orphan: +{% endif %} + +{{ fullname | escape | underline}} + +.. currentmodule:: {{ module }} + +{% if objtype == 'property' %} +property +{% endif %} + +.. auto{{ objtype }}:: {{ fullname | replace("pipeline_vsdi.", "pipeline_vsdi::") }} + +{# In the fullname (e.g. `numpy.ma.MaskedArray.methodname`), the module name +is ambiguous. Using a `::` separator (e.g. `numpy::ma.MaskedArray.methodname`) +specifies `numpy` as the module name. #} diff --git a/docs/_templates/autosummary/class.rst b/docs/_templates/autosummary/class.rst new file mode 100644 index 0000000..64c1b11 --- /dev/null +++ b/docs/_templates/autosummary/class.rst @@ -0,0 +1,27 @@ +{% extends "!autosummary/class.rst" %} + +{% block methods %} +{% if methods %} + .. HACK -- the point here is that we don't want this to appear in the output, but the autosummary should still generate the pages. + .. autosummary:: + :toctree: + {% for item in all_methods %} + {%- if not item.startswith('_') or item in ['__call__'] %} + {{ name }}.{{ item }} + {%- endif -%} + {%- endfor %} +{% endif %} +{% endblock %} + +{% block attributes %} +{% if attributes %} + .. HACK -- the point here is that we don't want this to appear in the output, but the autosummary should still generate the pages. + .. autosummary:: + :toctree: + {% for item in all_attributes %} + {%- if not item.startswith('_') %} + {{ name }}.{{ item }} + {%- endif -%} + {%- endfor %} +{% endif %} +{% endblock %} diff --git a/docs/_templates/autosummary/member.rst b/docs/_templates/autosummary/member.rst new file mode 100644 index 0000000..c216dc2 --- /dev/null +++ b/docs/_templates/autosummary/member.rst @@ -0,0 +1,13 @@ +:orphan: + +{{ fullname | escape | underline}} + +.. currentmodule:: {{ module }} + +member + +.. auto{{ objtype }}:: {{ fullname | replace("pipeline_vsdi.", "pipeline_vsdi::") }} + +{# In the fullname (e.g. `numpy.ma.MaskedArray.methodname`), the module name +is ambiguous. Using a `::` separator (e.g. `numpy::ma.MaskedArray.methodname`) +specifies `numpy` as the module name. #} diff --git a/docs/_templates/autosummary/method.rst b/docs/_templates/autosummary/method.rst new file mode 100644 index 0000000..5e64545 --- /dev/null +++ b/docs/_templates/autosummary/method.rst @@ -0,0 +1,13 @@ +:orphan: + +{{ fullname | escape | underline}} + +.. currentmodule:: {{ module }} + +method + +.. auto{{ objtype }}:: {{ fullname | replace("pipeline_vsdi.", "pipeline_vsdi::") }} + +{# In the fullname (e.g. `numpy.ma.MaskedArray.methodname`), the module name +is ambiguous. Using a `::` separator (e.g. `numpy::ma.MaskedArray.methodname`) +specifies `pipeline_vsdi` as the module name. #} diff --git a/docs/_templates/autosummary/minimal_module.rst b/docs/_templates/autosummary/minimal_module.rst new file mode 100644 index 0000000..f0d9f00 --- /dev/null +++ b/docs/_templates/autosummary/minimal_module.rst @@ -0,0 +1,8 @@ +{{ fullname | escape | underline}} + +.. automodule:: {{ fullname }} + + {% block docstring %} + {% endblock %} + + diff --git a/docs/_templates/autosummary/module.rst b/docs/_templates/autosummary/module.rst new file mode 100644 index 0000000..e1f428d --- /dev/null +++ b/docs/_templates/autosummary/module.rst @@ -0,0 +1,40 @@ +{% extends "!autosummary/module.rst" %} + +{# This file is almost the same as the default, but adds :toctree: to the autosummary directives. + The original can be found at `sphinx/ext/autosummary/templates/autosummary/module.rst`. #} + +{% block attributes %} +{% if attributes %} + .. rubric:: Module Attributes + + .. autosummary:: + :toctree: + {% for item in attributes %} + {{ item }} + {%- endfor %} +{% endif %} +{% endblock %} + +{% block functions %} +{% if functions %} + .. rubric:: Functions + + .. autosummary:: + :toctree: + {% for item in functions %} + {{ item }} + {%- endfor %} +{% endif %} +{% endblock %} + +{% block classes %} +{% if classes %} + .. rubric:: Classes + + .. autosummary:: + :toctree: + {% for item in classes %} + {{ item }} + {%- endfor %} +{% endif %} +{% endblock %} diff --git a/docs/_templates/layout.html b/docs/_templates/layout.html deleted file mode 100644 index 33c6788..0000000 --- a/docs/_templates/layout.html +++ /dev/null @@ -1,10 +0,0 @@ -{% extends "!layout.html" %} - -{% block extrahead %} -{{ super() }} - -{% endblock %} \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py index 78a8329..26bf1ee 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -8,7 +8,7 @@ import os import sys -sys.path.insert(0, os.path.abspath("../pipeline_vsdi")) +sys.path.insert(0, os.path.abspath('../pipeline_vsdi')) project = 'VSDI Pipeline' copyright = '2023, NeuroNetMem' @@ -18,9 +18,10 @@ # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration -extensions = ["sphinx.ext.todo", - "sphinx.ext.viewcode", - "sphinx.ext.autodoc"] +extensions = ['sphinx.ext.autodoc', + 'numpydoc', + 'sphinx.ext.autosummary', + 'sphinx_design'] templates_path = ['_templates'] exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] @@ -30,6 +31,19 @@ # -- Options for HTML output ------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output -html_theme = 'sphinx_rtd_theme' +# html_theme = 'sphinx_rtd_theme' +html_theme = 'pydata_sphinx_theme' +html_favicon = '_static/favicon/favicon.ico' +html_logo = '_static/favicon/favicon.ico' +html_context = {"default_mode": "light"} html_show_sourcelink = False -html_static_path = ['_static'] \ No newline at end of file +html_static_path = ['_static'] + +# ----------------------------------------------------------------------------- +# Autosummary +# ----------------------------------------------------------------------------- + + +# Make numpydoc to generate plots for example sections +numpydoc_use_plots = True +autosummary_generate = True \ No newline at end of file diff --git a/docs/dim_reduction.rst b/docs/dim_reduction.rst deleted file mode 100644 index ff1691b..0000000 --- a/docs/dim_reduction.rst +++ /dev/null @@ -1,11 +0,0 @@ -Dimensionality Reduction -======================== - -dim\_reduction.VAE module -------------------------- - -.. automodule:: dim_reduction.VAE - :members: - :undoc-members: - :show-inheritance: - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.T_destination.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.T_destination.rst new file mode 100644 index 0000000..10fc3c2 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.T_destination.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.T\_destination +========================================================= + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +attribute + +.. autoattribute:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.T_destination + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.__call__.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.__call__.rst new file mode 100644 index 0000000..1b8e911 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.__call__.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.\_\_call\_\_ +======================================================= + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.__call__ + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.add_module.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.add_module.rst new file mode 100644 index 0000000..10be954 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.add_module.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.add\_module +====================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.add_module + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.apply.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.apply.rst new file mode 100644 index 0000000..417d24a --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.apply.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.apply +================================================ + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.apply + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.backward.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.backward.rst new file mode 100644 index 0000000..f697f94 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.backward.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.backward +=================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.backward + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.bfloat16.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.bfloat16.rst new file mode 100644 index 0000000..ed4f01b --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.bfloat16.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.bfloat16 +=================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.bfloat16 + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.buffers.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.buffers.rst new file mode 100644 index 0000000..01b545d --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.buffers.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.buffers +================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.buffers + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.call_super_init.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.call_super_init.rst new file mode 100644 index 0000000..343514b --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.call_super_init.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.call\_super\_init +============================================================ + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +attribute + +.. autoattribute:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.call_super_init + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.children.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.children.rst new file mode 100644 index 0000000..072aca1 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.children.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.children +=================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.children + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.cpu.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.cpu.rst new file mode 100644 index 0000000..ecfd8c9 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.cpu.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.cpu +============================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.cpu + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.cuda.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.cuda.rst new file mode 100644 index 0000000..acdb2fb --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.cuda.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.cuda +=============================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.cuda + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.double.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.double.rst new file mode 100644 index 0000000..0cff1d7 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.double.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.double +================================================= + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.double + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.dump_patches.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.dump_patches.rst new file mode 100644 index 0000000..cfbac28 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.dump_patches.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.dump\_patches +======================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +attribute + +.. autoattribute:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.dump_patches + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.eval.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.eval.rst new file mode 100644 index 0000000..ab93916 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.eval.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.eval +=============================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.eval + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.extra_repr.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.extra_repr.rst new file mode 100644 index 0000000..69b768c --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.extra_repr.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.extra\_repr +====================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.extra_repr + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.float.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.float.rst new file mode 100644 index 0000000..66aa9c3 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.float.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.float +================================================ + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.float + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.forward.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.forward.rst new file mode 100644 index 0000000..0acd635 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.forward.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.forward +================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.forward + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.get_buffer.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.get_buffer.rst new file mode 100644 index 0000000..53064e4 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.get_buffer.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.get\_buffer +====================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.get_buffer + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.get_extra_state.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.get_extra_state.rst new file mode 100644 index 0000000..3b3a1f4 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.get_extra_state.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.get\_extra\_state +============================================================ + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.get_extra_state + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.get_parameter.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.get_parameter.rst new file mode 100644 index 0000000..546d9dc --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.get_parameter.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.get\_parameter +========================================================= + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.get_parameter + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.get_submodule.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.get_submodule.rst new file mode 100644 index 0000000..082ebc3 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.get_submodule.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.get\_submodule +========================================================= + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.get_submodule + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.half.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.half.rst new file mode 100644 index 0000000..ff98501 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.half.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.half +=============================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.half + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.ipu.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.ipu.rst new file mode 100644 index 0000000..925d251 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.ipu.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.ipu +============================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.ipu + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.load_state_dict.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.load_state_dict.rst new file mode 100644 index 0000000..e463bca --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.load_state_dict.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.load\_state\_dict +============================================================ + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.load_state_dict + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.modules.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.modules.rst new file mode 100644 index 0000000..b39e153 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.modules.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.modules +================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.modules + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.named_buffers.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.named_buffers.rst new file mode 100644 index 0000000..1abbe7f --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.named_buffers.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.named\_buffers +========================================================= + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.named_buffers + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.named_children.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.named_children.rst new file mode 100644 index 0000000..6c9e2c7 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.named_children.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.named\_children +========================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.named_children + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.named_modules.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.named_modules.rst new file mode 100644 index 0000000..975dbde --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.named_modules.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.named\_modules +========================================================= + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.named_modules + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.named_parameters.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.named_parameters.rst new file mode 100644 index 0000000..d6fda55 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.named_parameters.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.named\_parameters +============================================================ + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.named_parameters + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.parameters.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.parameters.rst new file mode 100644 index 0000000..74e23d2 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.parameters.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.parameters +===================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.parameters + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_backward_hook.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_backward_hook.rst new file mode 100644 index 0000000..06b91fc --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_backward_hook.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.register\_backward\_hook +=================================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.register_backward_hook + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_buffer.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_buffer.rst new file mode 100644 index 0000000..86d9eec --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_buffer.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.register\_buffer +=========================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.register_buffer + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_forward_hook.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_forward_hook.rst new file mode 100644 index 0000000..9d8bf7d --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_forward_hook.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.register\_forward\_hook +================================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.register_forward_hook + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_forward_pre_hook.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_forward_pre_hook.rst new file mode 100644 index 0000000..9345ebb --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_forward_pre_hook.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.register\_forward\_pre\_hook +======================================================================= + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.register_forward_pre_hook + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_full_backward_hook.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_full_backward_hook.rst new file mode 100644 index 0000000..d94770c --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_full_backward_hook.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.register\_full\_backward\_hook +========================================================================= + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.register_full_backward_hook + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_full_backward_pre_hook.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_full_backward_pre_hook.rst new file mode 100644 index 0000000..a8d64f8 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_full_backward_pre_hook.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.register\_full\_backward\_pre\_hook +============================================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.register_full_backward_pre_hook + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_load_state_dict_post_hook.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_load_state_dict_post_hook.rst new file mode 100644 index 0000000..e4f762e --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_load_state_dict_post_hook.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.register\_load\_state\_dict\_post\_hook +================================================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.register_load_state_dict_post_hook + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_module.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_module.rst new file mode 100644 index 0000000..17c80dd --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_module.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.register\_module +=========================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.register_module + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_parameter.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_parameter.rst new file mode 100644 index 0000000..1cffd71 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_parameter.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.register\_parameter +============================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.register_parameter + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_state_dict_pre_hook.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_state_dict_pre_hook.rst new file mode 100644 index 0000000..91ca8a4 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_state_dict_pre_hook.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.register\_state\_dict\_pre\_hook +=========================================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.register_state_dict_pre_hook + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.requires_grad_.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.requires_grad_.rst new file mode 100644 index 0000000..435438e --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.requires_grad_.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.requires\_grad\_ +=========================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.requires_grad_ + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.rst new file mode 100644 index 0000000..454aef1 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.rst @@ -0,0 +1,74 @@ +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE +========================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +.. autoclass:: Conv_AE + + + + .. HACK -- the point here is that we don't want this to appear in the output, but the autosummary should still generate the pages. + .. autosummary:: + :toctree: + + Conv_AE.__call__ + Conv_AE.add_module + Conv_AE.apply + Conv_AE.backward + Conv_AE.bfloat16 + Conv_AE.buffers + Conv_AE.children + Conv_AE.cpu + Conv_AE.cuda + Conv_AE.double + Conv_AE.eval + Conv_AE.extra_repr + Conv_AE.float + Conv_AE.forward + Conv_AE.get_buffer + Conv_AE.get_extra_state + Conv_AE.get_parameter + Conv_AE.get_submodule + Conv_AE.half + Conv_AE.ipu + Conv_AE.load_state_dict + Conv_AE.modules + Conv_AE.named_buffers + Conv_AE.named_children + Conv_AE.named_modules + Conv_AE.named_parameters + Conv_AE.parameters + Conv_AE.register_backward_hook + Conv_AE.register_buffer + Conv_AE.register_forward_hook + Conv_AE.register_forward_pre_hook + Conv_AE.register_full_backward_hook + Conv_AE.register_full_backward_pre_hook + Conv_AE.register_load_state_dict_post_hook + Conv_AE.register_module + Conv_AE.register_parameter + Conv_AE.register_state_dict_pre_hook + Conv_AE.requires_grad_ + Conv_AE.set_extra_state + Conv_AE.share_memory + Conv_AE.state_dict + Conv_AE.to + Conv_AE.to_empty + Conv_AE.train + Conv_AE.type + Conv_AE.xpu + Conv_AE.zero_grad + + + + + + .. HACK -- the point here is that we don't want this to appear in the output, but the autosummary should still generate the pages. + .. autosummary:: + :toctree: + + Conv_AE.T_destination + Conv_AE.call_super_init + Conv_AE.dump_patches + Conv_AE.training + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.set_extra_state.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.set_extra_state.rst new file mode 100644 index 0000000..e4e6cf8 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.set_extra_state.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.set\_extra\_state +============================================================ + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.set_extra_state + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.share_memory.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.share_memory.rst new file mode 100644 index 0000000..d23ff9c --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.share_memory.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.share\_memory +======================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.share_memory + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.state_dict.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.state_dict.rst new file mode 100644 index 0000000..0509c5e --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.state_dict.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.state\_dict +====================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.state_dict + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.to.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.to.rst new file mode 100644 index 0000000..3c09b03 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.to.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.to +============================================= + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.to + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.to_empty.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.to_empty.rst new file mode 100644 index 0000000..3eab20c --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.to_empty.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.to\_empty +==================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.to_empty + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.train.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.train.rst new file mode 100644 index 0000000..c53ce4d --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.train.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.train +================================================ + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.train + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.training.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.training.rst new file mode 100644 index 0000000..2d822f0 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.training.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.training +=================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +attribute + +.. autoattribute:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.training + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.type.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.type.rst new file mode 100644 index 0000000..0a37668 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.type.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.type +=============================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.type + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.xpu.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.xpu.rst new file mode 100644 index 0000000..3360eea --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.xpu.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.xpu +============================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.xpu + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.zero_grad.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.zero_grad.rst new file mode 100644 index 0000000..417abea --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.zero_grad.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.zero\_grad +===================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.zero_grad + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.T_destination.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.T_destination.rst new file mode 100644 index 0000000..59e1770 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.T_destination.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.T\_destination +========================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +attribute + +.. autoattribute:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.T_destination + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.__call__.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.__call__.rst new file mode 100644 index 0000000..93fc1e6 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.__call__.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.\_\_call\_\_ +======================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.__call__ + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.add_module.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.add_module.rst new file mode 100644 index 0000000..75925d1 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.add_module.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.add\_module +======================================================= + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.add_module + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.apply.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.apply.rst new file mode 100644 index 0000000..1d986dc --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.apply.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.apply +================================================= + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.apply + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.backward.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.backward.rst new file mode 100644 index 0000000..599a357 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.backward.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.backward +==================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.backward + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.bfloat16.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.bfloat16.rst new file mode 100644 index 0000000..74bf063 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.bfloat16.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.bfloat16 +==================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.bfloat16 + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.buffers.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.buffers.rst new file mode 100644 index 0000000..6a08452 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.buffers.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.buffers +=================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.buffers + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.call_super_init.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.call_super_init.rst new file mode 100644 index 0000000..6dc09be --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.call_super_init.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.call\_super\_init +============================================================= + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +attribute + +.. autoattribute:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.call_super_init + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.children.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.children.rst new file mode 100644 index 0000000..be49d9c --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.children.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.children +==================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.children + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.cpu.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.cpu.rst new file mode 100644 index 0000000..48cc945 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.cpu.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.cpu +=============================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.cpu + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.cuda.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.cuda.rst new file mode 100644 index 0000000..b1b50c3 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.cuda.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.cuda +================================================ + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.cuda + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.double.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.double.rst new file mode 100644 index 0000000..533e932 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.double.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.double +================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.double + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.dump_patches.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.dump_patches.rst new file mode 100644 index 0000000..955f34d --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.dump_patches.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.dump\_patches +========================================================= + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +attribute + +.. autoattribute:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.dump_patches + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.eval.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.eval.rst new file mode 100644 index 0000000..c582981 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.eval.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.eval +================================================ + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.eval + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.extra_repr.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.extra_repr.rst new file mode 100644 index 0000000..595df1b --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.extra_repr.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.extra\_repr +======================================================= + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.extra_repr + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.float.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.float.rst new file mode 100644 index 0000000..7d46c70 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.float.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.float +================================================= + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.float + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.forward.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.forward.rst new file mode 100644 index 0000000..e10dc46 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.forward.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.forward +=================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.forward + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.get_buffer.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.get_buffer.rst new file mode 100644 index 0000000..c8c751f --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.get_buffer.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.get\_buffer +======================================================= + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.get_buffer + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.get_extra_state.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.get_extra_state.rst new file mode 100644 index 0000000..00f3267 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.get_extra_state.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.get\_extra\_state +============================================================= + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.get_extra_state + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.get_parameter.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.get_parameter.rst new file mode 100644 index 0000000..93038c0 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.get_parameter.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.get\_parameter +========================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.get_parameter + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.get_submodule.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.get_submodule.rst new file mode 100644 index 0000000..bbf8422 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.get_submodule.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.get\_submodule +========================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.get_submodule + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.half.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.half.rst new file mode 100644 index 0000000..4d5aaff --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.half.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.half +================================================ + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.half + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.ipu.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.ipu.rst new file mode 100644 index 0000000..ff535bb --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.ipu.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.ipu +=============================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.ipu + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.load_state_dict.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.load_state_dict.rst new file mode 100644 index 0000000..c0440b8 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.load_state_dict.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.load\_state\_dict +============================================================= + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.load_state_dict + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.modules.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.modules.rst new file mode 100644 index 0000000..2b23564 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.modules.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.modules +=================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.modules + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.named_buffers.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.named_buffers.rst new file mode 100644 index 0000000..b0f2845 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.named_buffers.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.named\_buffers +========================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.named_buffers + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.named_children.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.named_children.rst new file mode 100644 index 0000000..b50b92a --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.named_children.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.named\_children +=========================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.named_children + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.named_modules.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.named_modules.rst new file mode 100644 index 0000000..2959a8a --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.named_modules.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.named\_modules +========================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.named_modules + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.named_parameters.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.named_parameters.rst new file mode 100644 index 0000000..2839633 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.named_parameters.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.named\_parameters +============================================================= + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.named_parameters + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.parameters.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.parameters.rst new file mode 100644 index 0000000..29274dd --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.parameters.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.parameters +====================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.parameters + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_backward_hook.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_backward_hook.rst new file mode 100644 index 0000000..a61bf48 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_backward_hook.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.register\_backward\_hook +==================================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.register_backward_hook + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_buffer.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_buffer.rst new file mode 100644 index 0000000..48114bd --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_buffer.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.register\_buffer +============================================================ + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.register_buffer + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_forward_hook.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_forward_hook.rst new file mode 100644 index 0000000..93fd82e --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_forward_hook.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.register\_forward\_hook +=================================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.register_forward_hook + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_forward_pre_hook.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_forward_pre_hook.rst new file mode 100644 index 0000000..1563962 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_forward_pre_hook.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.register\_forward\_pre\_hook +======================================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.register_forward_pre_hook + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_full_backward_hook.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_full_backward_hook.rst new file mode 100644 index 0000000..2a387f1 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_full_backward_hook.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.register\_full\_backward\_hook +========================================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.register_full_backward_hook + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_full_backward_pre_hook.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_full_backward_pre_hook.rst new file mode 100644 index 0000000..79e902a --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_full_backward_pre_hook.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.register\_full\_backward\_pre\_hook +=============================================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.register_full_backward_pre_hook + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_load_state_dict_post_hook.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_load_state_dict_post_hook.rst new file mode 100644 index 0000000..9df898c --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_load_state_dict_post_hook.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.register\_load\_state\_dict\_post\_hook +=================================================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.register_load_state_dict_post_hook + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_module.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_module.rst new file mode 100644 index 0000000..b1d5d72 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_module.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.register\_module +============================================================ + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.register_module + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_parameter.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_parameter.rst new file mode 100644 index 0000000..7e5526e --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_parameter.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.register\_parameter +=============================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.register_parameter + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_state_dict_pre_hook.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_state_dict_pre_hook.rst new file mode 100644 index 0000000..e123741 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_state_dict_pre_hook.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.register\_state\_dict\_pre\_hook +============================================================================ + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.register_state_dict_pre_hook + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.reparametrize.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.reparametrize.rst new file mode 100644 index 0000000..88a572b --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.reparametrize.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.reparametrize +========================================================= + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.reparametrize + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.requires_grad_.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.requires_grad_.rst new file mode 100644 index 0000000..3e3166d --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.requires_grad_.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.requires\_grad\_ +============================================================ + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.requires_grad_ + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.rst new file mode 100644 index 0000000..ddd8b45 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.rst @@ -0,0 +1,75 @@ +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE +=========================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +.. autoclass:: Conv_VAE + + + + .. HACK -- the point here is that we don't want this to appear in the output, but the autosummary should still generate the pages. + .. autosummary:: + :toctree: + + Conv_VAE.__call__ + Conv_VAE.add_module + Conv_VAE.apply + Conv_VAE.backward + Conv_VAE.bfloat16 + Conv_VAE.buffers + Conv_VAE.children + Conv_VAE.cpu + Conv_VAE.cuda + Conv_VAE.double + Conv_VAE.eval + Conv_VAE.extra_repr + Conv_VAE.float + Conv_VAE.forward + Conv_VAE.get_buffer + Conv_VAE.get_extra_state + Conv_VAE.get_parameter + Conv_VAE.get_submodule + Conv_VAE.half + Conv_VAE.ipu + Conv_VAE.load_state_dict + Conv_VAE.modules + Conv_VAE.named_buffers + Conv_VAE.named_children + Conv_VAE.named_modules + Conv_VAE.named_parameters + Conv_VAE.parameters + Conv_VAE.register_backward_hook + Conv_VAE.register_buffer + Conv_VAE.register_forward_hook + Conv_VAE.register_forward_pre_hook + Conv_VAE.register_full_backward_hook + Conv_VAE.register_full_backward_pre_hook + Conv_VAE.register_load_state_dict_post_hook + Conv_VAE.register_module + Conv_VAE.register_parameter + Conv_VAE.register_state_dict_pre_hook + Conv_VAE.reparametrize + Conv_VAE.requires_grad_ + Conv_VAE.set_extra_state + Conv_VAE.share_memory + Conv_VAE.state_dict + Conv_VAE.to + Conv_VAE.to_empty + Conv_VAE.train + Conv_VAE.type + Conv_VAE.xpu + Conv_VAE.zero_grad + + + + + + .. HACK -- the point here is that we don't want this to appear in the output, but the autosummary should still generate the pages. + .. autosummary:: + :toctree: + + Conv_VAE.T_destination + Conv_VAE.call_super_init + Conv_VAE.dump_patches + Conv_VAE.training + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.set_extra_state.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.set_extra_state.rst new file mode 100644 index 0000000..54da3fe --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.set_extra_state.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.set\_extra\_state +============================================================= + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.set_extra_state + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.share_memory.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.share_memory.rst new file mode 100644 index 0000000..5e2e1eb --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.share_memory.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.share\_memory +========================================================= + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.share_memory + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.state_dict.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.state_dict.rst new file mode 100644 index 0000000..3b60cf9 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.state_dict.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.state\_dict +======================================================= + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.state_dict + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.to.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.to.rst new file mode 100644 index 0000000..84e8a5b --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.to.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.to +============================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.to + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.to_empty.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.to_empty.rst new file mode 100644 index 0000000..d6066d6 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.to_empty.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.to\_empty +===================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.to_empty + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.train.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.train.rst new file mode 100644 index 0000000..db40345 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.train.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.train +================================================= + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.train + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.training.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.training.rst new file mode 100644 index 0000000..8d80109 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.training.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.training +==================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +attribute + +.. autoattribute:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.training + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.type.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.type.rst new file mode 100644 index 0000000..a6b9cb2 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.type.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.type +================================================ + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.type + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.xpu.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.xpu.rst new file mode 100644 index 0000000..ad75874 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.xpu.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.xpu +=============================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.xpu + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.zero_grad.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.zero_grad.rst new file mode 100644 index 0000000..c7b8a17 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.zero_grad.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.zero\_grad +====================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + +method + +.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.zero_grad + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.create_dataloader.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.create_dataloader.rst new file mode 100644 index 0000000..65190ad --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.create_dataloader.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.dim\_reduction.VAE.create\_dataloader +==================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + + + +.. autofunction:: pipeline_vsdi::dim_reduction.VAE.create_dataloader + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.find_max_activation_images.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.find_max_activation_images.rst new file mode 100644 index 0000000..3c520aa --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.find_max_activation_images.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.dim\_reduction.VAE.find\_max\_activation\_images +=============================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + + + +.. autofunction:: pipeline_vsdi::dim_reduction.VAE.find_max_activation_images + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.get_latent_vectors.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.get_latent_vectors.rst new file mode 100644 index 0000000..a465bcc --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.get_latent_vectors.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.dim\_reduction.VAE.get\_latent\_vectors +====================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + + + +.. autofunction:: pipeline_vsdi::dim_reduction.VAE.get_latent_vectors + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.linear_decoding_error.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.linear_decoding_error.rst new file mode 100644 index 0000000..77f6d99 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.linear_decoding_error.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.dim\_reduction.VAE.linear\_decoding\_error +========================================================= + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + + + +.. autofunction:: pipeline_vsdi::dim_reduction.VAE.linear_decoding_error + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.linear_decoding_score.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.linear_decoding_score.rst new file mode 100644 index 0000000..12ca020 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.linear_decoding_score.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.dim\_reduction.VAE.linear\_decoding\_score +========================================================= + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + + + +.. autofunction:: pipeline_vsdi::dim_reduction.VAE.linear_decoding_score + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.predict.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.predict.rst new file mode 100644 index 0000000..65eaf61 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.predict.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.dim\_reduction.VAE.predict +========================================= + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + + + +.. autofunction:: pipeline_vsdi::dim_reduction.VAE.predict + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.rst new file mode 100644 index 0000000..55852ec --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.rst @@ -0,0 +1,45 @@ +pipeline\_vsdi.dim\_reduction.VAE +================================= + +.. automodule:: pipeline_vsdi.dim_reduction.VAE + + + + + + + + .. rubric:: Functions + + .. autosummary:: + :toctree: + + create_dataloader + find_max_activation_images + get_latent_vectors + linear_decoding_error + linear_decoding_score + predict + shuffle_2D_matrix + train_autoencoder + + + + + + .. rubric:: Classes + + .. autosummary:: + :toctree: + + Conv_AE + Conv_VAE + + + + + + + + + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.shuffle_2D_matrix.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.shuffle_2D_matrix.rst new file mode 100644 index 0000000..0f4d6b3 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.shuffle_2D_matrix.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.dim\_reduction.VAE.shuffle\_2D\_matrix +===================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + + + +.. autofunction:: pipeline_vsdi::dim_reduction.VAE.shuffle_2D_matrix + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.train_autoencoder.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.train_autoencoder.rst new file mode 100644 index 0000000..5503325 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.VAE.train_autoencoder.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.dim\_reduction.VAE.train\_autoencoder +==================================================== + +.. currentmodule:: pipeline_vsdi.dim_reduction.VAE + + + +.. autofunction:: pipeline_vsdi::dim_reduction.VAE.train_autoencoder + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.linear_dim_red.pca_ica.rst b/docs/generated/pipeline_vsdi.dim_reduction.linear_dim_red.pca_ica.rst new file mode 100644 index 0000000..f9de2ff --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.linear_dim_red.pca_ica.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.dim\_reduction.linear\_dim\_red.pca\_ica +======================================================= + +.. currentmodule:: pipeline_vsdi.dim_reduction.linear_dim_red + + + +.. autofunction:: pipeline_vsdi::dim_reduction.linear_dim_red.pca_ica + diff --git a/docs/generated/pipeline_vsdi.dim_reduction.linear_dim_red.rst b/docs/generated/pipeline_vsdi.dim_reduction.linear_dim_red.rst new file mode 100644 index 0000000..9057649 --- /dev/null +++ b/docs/generated/pipeline_vsdi.dim_reduction.linear_dim_red.rst @@ -0,0 +1,30 @@ +pipeline\_vsdi.dim\_reduction.linear\_dim\_red +============================================== + +.. automodule:: pipeline_vsdi.dim_reduction.linear_dim_red + + + + + + + + .. rubric:: Functions + + .. autosummary:: + :toctree: + + pca_ica + + + + + + + + + + + + + diff --git a/docs/generated/pipeline_vsdi.preprocessing.behavior.compute_and_add_lick_rate.rst b/docs/generated/pipeline_vsdi.preprocessing.behavior.compute_and_add_lick_rate.rst new file mode 100644 index 0000000..71753d3 --- /dev/null +++ b/docs/generated/pipeline_vsdi.preprocessing.behavior.compute_and_add_lick_rate.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.preprocessing.behavior.compute\_and\_add\_lick\_rate +=================================================================== + +.. currentmodule:: pipeline_vsdi.preprocessing.behavior + + + +.. autofunction:: pipeline_vsdi::preprocessing.behavior.compute_and_add_lick_rate + diff --git a/docs/generated/pipeline_vsdi.preprocessing.behavior.compute_lick_rate.rst b/docs/generated/pipeline_vsdi.preprocessing.behavior.compute_lick_rate.rst new file mode 100644 index 0000000..716f9a6 --- /dev/null +++ b/docs/generated/pipeline_vsdi.preprocessing.behavior.compute_lick_rate.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.preprocessing.behavior.compute\_lick\_rate +========================================================= + +.. currentmodule:: pipeline_vsdi.preprocessing.behavior + + + +.. autofunction:: pipeline_vsdi::preprocessing.behavior.compute_lick_rate + diff --git a/docs/generated/pipeline_vsdi.preprocessing.behavior.get_trials.rst b/docs/generated/pipeline_vsdi.preprocessing.behavior.get_trials.rst new file mode 100644 index 0000000..db14ace --- /dev/null +++ b/docs/generated/pipeline_vsdi.preprocessing.behavior.get_trials.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.preprocessing.behavior.get\_trials +================================================= + +.. currentmodule:: pipeline_vsdi.preprocessing.behavior + + + +.. autofunction:: pipeline_vsdi::preprocessing.behavior.get_trials + diff --git a/docs/generated/pipeline_vsdi.preprocessing.behavior.make_design_matrix.rst b/docs/generated/pipeline_vsdi.preprocessing.behavior.make_design_matrix.rst new file mode 100644 index 0000000..c68bc60 --- /dev/null +++ b/docs/generated/pipeline_vsdi.preprocessing.behavior.make_design_matrix.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.preprocessing.behavior.make\_design\_matrix +========================================================== + +.. currentmodule:: pipeline_vsdi.preprocessing.behavior + + + +.. autofunction:: pipeline_vsdi::preprocessing.behavior.make_design_matrix + diff --git a/docs/generated/pipeline_vsdi.preprocessing.behavior.rst b/docs/generated/pipeline_vsdi.preprocessing.behavior.rst new file mode 100644 index 0000000..13f3e45 --- /dev/null +++ b/docs/generated/pipeline_vsdi.preprocessing.behavior.rst @@ -0,0 +1,35 @@ +pipeline\_vsdi.preprocessing.behavior +===================================== + +.. automodule:: pipeline_vsdi.preprocessing.behavior + + + + + + + + .. rubric:: Functions + + .. autosummary:: + :toctree: + + compute_and_add_lick_rate + compute_lick_rate + get_trials + make_design_matrix + store_indices + subsets + + + + + + + + + + + + + diff --git a/docs/generated/pipeline_vsdi.preprocessing.behavior.store_indices.rst b/docs/generated/pipeline_vsdi.preprocessing.behavior.store_indices.rst new file mode 100644 index 0000000..e5c77b8 --- /dev/null +++ b/docs/generated/pipeline_vsdi.preprocessing.behavior.store_indices.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.preprocessing.behavior.store\_indices +==================================================== + +.. currentmodule:: pipeline_vsdi.preprocessing.behavior + + + +.. autofunction:: pipeline_vsdi::preprocessing.behavior.store_indices + diff --git a/docs/generated/pipeline_vsdi.preprocessing.behavior.subsets.rst b/docs/generated/pipeline_vsdi.preprocessing.behavior.subsets.rst new file mode 100644 index 0000000..33a9ae7 --- /dev/null +++ b/docs/generated/pipeline_vsdi.preprocessing.behavior.subsets.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.preprocessing.behavior.subsets +============================================= + +.. currentmodule:: pipeline_vsdi.preprocessing.behavior + + + +.. autofunction:: pipeline_vsdi::preprocessing.behavior.subsets + diff --git a/docs/generated/pipeline_vsdi.preprocessing.clustering.cluster_and_plot.rst b/docs/generated/pipeline_vsdi.preprocessing.clustering.cluster_and_plot.rst new file mode 100644 index 0000000..94b6c84 --- /dev/null +++ b/docs/generated/pipeline_vsdi.preprocessing.clustering.cluster_and_plot.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.preprocessing.clustering.cluster\_and\_plot +========================================================== + +.. currentmodule:: pipeline_vsdi.preprocessing.clustering + + + +.. autofunction:: pipeline_vsdi::preprocessing.clustering.cluster_and_plot + diff --git a/docs/generated/pipeline_vsdi.preprocessing.clustering.compute_distance_matrix.rst b/docs/generated/pipeline_vsdi.preprocessing.clustering.compute_distance_matrix.rst new file mode 100644 index 0000000..d285cb5 --- /dev/null +++ b/docs/generated/pipeline_vsdi.preprocessing.clustering.compute_distance_matrix.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.preprocessing.clustering.compute\_distance\_matrix +================================================================= + +.. currentmodule:: pipeline_vsdi.preprocessing.clustering + + + +.. autofunction:: pipeline_vsdi::preprocessing.clustering.compute_distance_matrix + diff --git a/docs/generated/pipeline_vsdi.preprocessing.clustering.rst b/docs/generated/pipeline_vsdi.preprocessing.clustering.rst new file mode 100644 index 0000000..c2215e7 --- /dev/null +++ b/docs/generated/pipeline_vsdi.preprocessing.clustering.rst @@ -0,0 +1,31 @@ +pipeline\_vsdi.preprocessing.clustering +======================================= + +.. automodule:: pipeline_vsdi.preprocessing.clustering + + + + + + + + .. rubric:: Functions + + .. autosummary:: + :toctree: + + cluster_and_plot + compute_distance_matrix + + + + + + + + + + + + + diff --git a/docs/generated/pipeline_vsdi.preprocessing.utils.clean_outliers.rst b/docs/generated/pipeline_vsdi.preprocessing.utils.clean_outliers.rst new file mode 100644 index 0000000..e22bc0d --- /dev/null +++ b/docs/generated/pipeline_vsdi.preprocessing.utils.clean_outliers.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.preprocessing.utils.clean\_outliers +================================================== + +.. currentmodule:: pipeline_vsdi.preprocessing.utils + + + +.. autofunction:: pipeline_vsdi::preprocessing.utils.clean_outliers + diff --git a/docs/generated/pipeline_vsdi.preprocessing.utils.compute_and_add_lick_rate.rst b/docs/generated/pipeline_vsdi.preprocessing.utils.compute_and_add_lick_rate.rst new file mode 100644 index 0000000..17979db --- /dev/null +++ b/docs/generated/pipeline_vsdi.preprocessing.utils.compute_and_add_lick_rate.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.preprocessing.utils.compute\_and\_add\_lick\_rate +================================================================ + +.. currentmodule:: pipeline_vsdi.preprocessing.utils + + + +.. autofunction:: pipeline_vsdi::preprocessing.utils.compute_and_add_lick_rate + diff --git a/docs/generated/pipeline_vsdi.preprocessing.utils.compute_lick_rate.rst b/docs/generated/pipeline_vsdi.preprocessing.utils.compute_lick_rate.rst new file mode 100644 index 0000000..64c38d6 --- /dev/null +++ b/docs/generated/pipeline_vsdi.preprocessing.utils.compute_lick_rate.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.preprocessing.utils.compute\_lick\_rate +====================================================== + +.. currentmodule:: pipeline_vsdi.preprocessing.utils + + + +.. autofunction:: pipeline_vsdi::preprocessing.utils.compute_lick_rate + diff --git a/docs/generated/pipeline_vsdi.preprocessing.utils.crop_to_bounds.rst b/docs/generated/pipeline_vsdi.preprocessing.utils.crop_to_bounds.rst new file mode 100644 index 0000000..a2e2251 --- /dev/null +++ b/docs/generated/pipeline_vsdi.preprocessing.utils.crop_to_bounds.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.preprocessing.utils.crop\_to\_bounds +=================================================== + +.. currentmodule:: pipeline_vsdi.preprocessing.utils + + + +.. autofunction:: pipeline_vsdi::preprocessing.utils.crop_to_bounds + diff --git a/docs/generated/pipeline_vsdi.preprocessing.utils.filter_data.rst b/docs/generated/pipeline_vsdi.preprocessing.utils.filter_data.rst new file mode 100644 index 0000000..c76cd9e --- /dev/null +++ b/docs/generated/pipeline_vsdi.preprocessing.utils.filter_data.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.preprocessing.utils.filter\_data +=============================================== + +.. currentmodule:: pipeline_vsdi.preprocessing.utils + + + +.. autofunction:: pipeline_vsdi::preprocessing.utils.filter_data + diff --git a/docs/generated/pipeline_vsdi.preprocessing.utils.filter_data2.rst b/docs/generated/pipeline_vsdi.preprocessing.utils.filter_data2.rst new file mode 100644 index 0000000..79418eb --- /dev/null +++ b/docs/generated/pipeline_vsdi.preprocessing.utils.filter_data2.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.preprocessing.utils.filter\_data2 +================================================ + +.. currentmodule:: pipeline_vsdi.preprocessing.utils + + + +.. autofunction:: pipeline_vsdi::preprocessing.utils.filter_data2 + diff --git a/docs/generated/pipeline_vsdi.preprocessing.utils.find_bounding_rectangle.rst b/docs/generated/pipeline_vsdi.preprocessing.utils.find_bounding_rectangle.rst new file mode 100644 index 0000000..032ae2f --- /dev/null +++ b/docs/generated/pipeline_vsdi.preprocessing.utils.find_bounding_rectangle.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.preprocessing.utils.find\_bounding\_rectangle +============================================================ + +.. currentmodule:: pipeline_vsdi.preprocessing.utils + + + +.. autofunction:: pipeline_vsdi::preprocessing.utils.find_bounding_rectangle + diff --git a/docs/generated/pipeline_vsdi.preprocessing.utils.find_outliers.rst b/docs/generated/pipeline_vsdi.preprocessing.utils.find_outliers.rst new file mode 100644 index 0000000..ac1e395 --- /dev/null +++ b/docs/generated/pipeline_vsdi.preprocessing.utils.find_outliers.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.preprocessing.utils.find\_outliers +================================================= + +.. currentmodule:: pipeline_vsdi.preprocessing.utils + + + +.. autofunction:: pipeline_vsdi::preprocessing.utils.find_outliers + diff --git a/docs/generated/pipeline_vsdi.preprocessing.utils.get_trials.rst b/docs/generated/pipeline_vsdi.preprocessing.utils.get_trials.rst new file mode 100644 index 0000000..4969458 --- /dev/null +++ b/docs/generated/pipeline_vsdi.preprocessing.utils.get_trials.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.preprocessing.utils.get\_trials +============================================== + +.. currentmodule:: pipeline_vsdi.preprocessing.utils + + + +.. autofunction:: pipeline_vsdi::preprocessing.utils.get_trials + diff --git a/docs/generated/pipeline_vsdi.preprocessing.utils.make_design_matrix.rst b/docs/generated/pipeline_vsdi.preprocessing.utils.make_design_matrix.rst new file mode 100644 index 0000000..850e13e --- /dev/null +++ b/docs/generated/pipeline_vsdi.preprocessing.utils.make_design_matrix.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.preprocessing.utils.make\_design\_matrix +======================================================= + +.. currentmodule:: pipeline_vsdi.preprocessing.utils + + + +.. autofunction:: pipeline_vsdi::preprocessing.utils.make_design_matrix + diff --git a/docs/generated/pipeline_vsdi.preprocessing.utils.moving_average.rst b/docs/generated/pipeline_vsdi.preprocessing.utils.moving_average.rst new file mode 100644 index 0000000..b8fe2fb --- /dev/null +++ b/docs/generated/pipeline_vsdi.preprocessing.utils.moving_average.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.preprocessing.utils.moving\_average +================================================== + +.. currentmodule:: pipeline_vsdi.preprocessing.utils + + + +.. autofunction:: pipeline_vsdi::preprocessing.utils.moving_average + diff --git a/docs/generated/pipeline_vsdi.preprocessing.utils.normalize_vsdi.rst b/docs/generated/pipeline_vsdi.preprocessing.utils.normalize_vsdi.rst new file mode 100644 index 0000000..9885839 --- /dev/null +++ b/docs/generated/pipeline_vsdi.preprocessing.utils.normalize_vsdi.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.preprocessing.utils.normalize\_vsdi +================================================== + +.. currentmodule:: pipeline_vsdi.preprocessing.utils + + + +.. autofunction:: pipeline_vsdi::preprocessing.utils.normalize_vsdi + diff --git a/docs/generated/pipeline_vsdi.preprocessing.utils.pca_ica.rst b/docs/generated/pipeline_vsdi.preprocessing.utils.pca_ica.rst new file mode 100644 index 0000000..13be0de --- /dev/null +++ b/docs/generated/pipeline_vsdi.preprocessing.utils.pca_ica.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.preprocessing.utils.pca\_ica +=========================================== + +.. currentmodule:: pipeline_vsdi.preprocessing.utils + + + +.. autofunction:: pipeline_vsdi::preprocessing.utils.pca_ica + diff --git a/docs/generated/pipeline_vsdi.preprocessing.utils.plot_decoding_performance.rst b/docs/generated/pipeline_vsdi.preprocessing.utils.plot_decoding_performance.rst new file mode 100644 index 0000000..083f709 --- /dev/null +++ b/docs/generated/pipeline_vsdi.preprocessing.utils.plot_decoding_performance.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.preprocessing.utils.plot\_decoding\_performance +============================================================== + +.. currentmodule:: pipeline_vsdi.preprocessing.utils + + + +.. autofunction:: pipeline_vsdi::preprocessing.utils.plot_decoding_performance + diff --git a/docs/generated/pipeline_vsdi.preprocessing.utils.resize.rst b/docs/generated/pipeline_vsdi.preprocessing.utils.resize.rst new file mode 100644 index 0000000..17d8b32 --- /dev/null +++ b/docs/generated/pipeline_vsdi.preprocessing.utils.resize.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.preprocessing.utils.resize +========================================= + +.. currentmodule:: pipeline_vsdi.preprocessing.utils + + + +.. autofunction:: pipeline_vsdi::preprocessing.utils.resize + diff --git a/docs/generated/pipeline_vsdi.preprocessing.utils.resize_video.rst b/docs/generated/pipeline_vsdi.preprocessing.utils.resize_video.rst new file mode 100644 index 0000000..10b6f91 --- /dev/null +++ b/docs/generated/pipeline_vsdi.preprocessing.utils.resize_video.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.preprocessing.utils.resize\_video +================================================ + +.. currentmodule:: pipeline_vsdi.preprocessing.utils + + + +.. autofunction:: pipeline_vsdi::preprocessing.utils.resize_video + diff --git a/docs/generated/pipeline_vsdi.preprocessing.utils.rst b/docs/generated/pipeline_vsdi.preprocessing.utils.rst new file mode 100644 index 0000000..8fd7c8a --- /dev/null +++ b/docs/generated/pipeline_vsdi.preprocessing.utils.rst @@ -0,0 +1,51 @@ +pipeline\_vsdi.preprocessing.utils +================================== + +.. automodule:: pipeline_vsdi.preprocessing.utils + + + + + + + + .. rubric:: Functions + + .. autosummary:: + :toctree: + + clean_outliers + compute_and_add_lick_rate + compute_lick_rate + crop_to_bounds + filter_data + filter_data2 + find_bounding_rectangle + find_outliers + get_trials + make_design_matrix + moving_average + normalize_vsdi + pca_ica + plot_decoding_performance + resize + resize_video + split_data + store_indices + subsets + train_SVM_baseline + train_SVM_baseline2 + train_SVM_day + + + + + + + + + + + + + diff --git a/docs/generated/pipeline_vsdi.preprocessing.utils.split_data.rst b/docs/generated/pipeline_vsdi.preprocessing.utils.split_data.rst new file mode 100644 index 0000000..f3197ab --- /dev/null +++ b/docs/generated/pipeline_vsdi.preprocessing.utils.split_data.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.preprocessing.utils.split\_data +============================================== + +.. currentmodule:: pipeline_vsdi.preprocessing.utils + + + +.. autofunction:: pipeline_vsdi::preprocessing.utils.split_data + diff --git a/docs/generated/pipeline_vsdi.preprocessing.utils.store_indices.rst b/docs/generated/pipeline_vsdi.preprocessing.utils.store_indices.rst new file mode 100644 index 0000000..b92a829 --- /dev/null +++ b/docs/generated/pipeline_vsdi.preprocessing.utils.store_indices.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.preprocessing.utils.store\_indices +================================================= + +.. currentmodule:: pipeline_vsdi.preprocessing.utils + + + +.. autofunction:: pipeline_vsdi::preprocessing.utils.store_indices + diff --git a/docs/generated/pipeline_vsdi.preprocessing.utils.subsets.rst b/docs/generated/pipeline_vsdi.preprocessing.utils.subsets.rst new file mode 100644 index 0000000..39e9f76 --- /dev/null +++ b/docs/generated/pipeline_vsdi.preprocessing.utils.subsets.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.preprocessing.utils.subsets +========================================== + +.. currentmodule:: pipeline_vsdi.preprocessing.utils + + + +.. autofunction:: pipeline_vsdi::preprocessing.utils.subsets + diff --git a/docs/generated/pipeline_vsdi.preprocessing.utils.train_SVM_baseline.rst b/docs/generated/pipeline_vsdi.preprocessing.utils.train_SVM_baseline.rst new file mode 100644 index 0000000..eab9d07 --- /dev/null +++ b/docs/generated/pipeline_vsdi.preprocessing.utils.train_SVM_baseline.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.preprocessing.utils.train\_SVM\_baseline +======================================================= + +.. currentmodule:: pipeline_vsdi.preprocessing.utils + + + +.. autofunction:: pipeline_vsdi::preprocessing.utils.train_SVM_baseline + diff --git a/docs/generated/pipeline_vsdi.preprocessing.utils.train_SVM_baseline2.rst b/docs/generated/pipeline_vsdi.preprocessing.utils.train_SVM_baseline2.rst new file mode 100644 index 0000000..87744c0 --- /dev/null +++ b/docs/generated/pipeline_vsdi.preprocessing.utils.train_SVM_baseline2.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.preprocessing.utils.train\_SVM\_baseline2 +======================================================== + +.. currentmodule:: pipeline_vsdi.preprocessing.utils + + + +.. autofunction:: pipeline_vsdi::preprocessing.utils.train_SVM_baseline2 + diff --git a/docs/generated/pipeline_vsdi.preprocessing.utils.train_SVM_day.rst b/docs/generated/pipeline_vsdi.preprocessing.utils.train_SVM_day.rst new file mode 100644 index 0000000..06c7bdd --- /dev/null +++ b/docs/generated/pipeline_vsdi.preprocessing.utils.train_SVM_day.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.preprocessing.utils.train\_SVM\_day +================================================== + +.. currentmodule:: pipeline_vsdi.preprocessing.utils + + + +.. autofunction:: pipeline_vsdi::preprocessing.utils.train_SVM_day + diff --git a/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.check_bimodal.rst b/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.check_bimodal.rst new file mode 100644 index 0000000..573d3a3 --- /dev/null +++ b/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.check_bimodal.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.preprocessing.vsdi\_preprocessing.check\_bimodal +=============================================================== + +.. currentmodule:: pipeline_vsdi.preprocessing.vsdi_preprocessing + + + +.. autofunction:: pipeline_vsdi::preprocessing.vsdi_preprocessing.check_bimodal + diff --git a/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.clean_hemodynamic_pca.rst b/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.clean_hemodynamic_pca.rst new file mode 100644 index 0000000..2995aa5 --- /dev/null +++ b/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.clean_hemodynamic_pca.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.preprocessing.vsdi\_preprocessing.clean\_hemodynamic\_pca +======================================================================== + +.. currentmodule:: pipeline_vsdi.preprocessing.vsdi_preprocessing + + + +.. autofunction:: pipeline_vsdi::preprocessing.vsdi_preprocessing.clean_hemodynamic_pca + diff --git a/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.clean_hemodynamics.rst b/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.clean_hemodynamics.rst new file mode 100644 index 0000000..21b10d6 --- /dev/null +++ b/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.clean_hemodynamics.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.preprocessing.vsdi\_preprocessing.clean\_hemodynamics +==================================================================== + +.. currentmodule:: pipeline_vsdi.preprocessing.vsdi_preprocessing + + + +.. autofunction:: pipeline_vsdi::preprocessing.vsdi_preprocessing.clean_hemodynamics + diff --git a/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.clean_outliers.rst b/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.clean_outliers.rst new file mode 100644 index 0000000..1165729 --- /dev/null +++ b/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.clean_outliers.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.preprocessing.vsdi\_preprocessing.clean\_outliers +================================================================ + +.. currentmodule:: pipeline_vsdi.preprocessing.vsdi_preprocessing + + + +.. autofunction:: pipeline_vsdi::preprocessing.vsdi_preprocessing.clean_outliers + diff --git a/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.design_matrix.rst b/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.design_matrix.rst new file mode 100644 index 0000000..512d8ec --- /dev/null +++ b/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.design_matrix.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.preprocessing.vsdi\_preprocessing.design\_matrix +=============================================================== + +.. currentmodule:: pipeline_vsdi.preprocessing.vsdi_preprocessing + + + +.. autofunction:: pipeline_vsdi::preprocessing.vsdi_preprocessing.design_matrix + diff --git a/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.find_outliers.rst b/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.find_outliers.rst new file mode 100644 index 0000000..0f2f303 --- /dev/null +++ b/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.find_outliers.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.preprocessing.vsdi\_preprocessing.find\_outliers +=============================================================== + +.. currentmodule:: pipeline_vsdi.preprocessing.vsdi_preprocessing + + + +.. autofunction:: pipeline_vsdi::preprocessing.vsdi_preprocessing.find_outliers + diff --git a/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.find_outliers_old.rst b/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.find_outliers_old.rst new file mode 100644 index 0000000..e7ba18a --- /dev/null +++ b/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.find_outliers_old.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.preprocessing.vsdi\_preprocessing.find\_outliers\_old +==================================================================== + +.. currentmodule:: pipeline_vsdi.preprocessing.vsdi_preprocessing + + + +.. autofunction:: pipeline_vsdi::preprocessing.vsdi_preprocessing.find_outliers_old + diff --git a/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.glm.rst b/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.glm.rst new file mode 100644 index 0000000..25e10ef --- /dev/null +++ b/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.glm.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.preprocessing.vsdi\_preprocessing.glm +==================================================== + +.. currentmodule:: pipeline_vsdi.preprocessing.vsdi_preprocessing + + + +.. autofunction:: pipeline_vsdi::preprocessing.vsdi_preprocessing.glm + diff --git a/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.merge_masks.rst b/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.merge_masks.rst new file mode 100644 index 0000000..3a8c8e0 --- /dev/null +++ b/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.merge_masks.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.preprocessing.vsdi\_preprocessing.merge\_masks +============================================================= + +.. currentmodule:: pipeline_vsdi.preprocessing.vsdi_preprocessing + + + +.. autofunction:: pipeline_vsdi::preprocessing.vsdi_preprocessing.merge_masks + diff --git a/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.pca.rst b/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.pca.rst new file mode 100644 index 0000000..831a605 --- /dev/null +++ b/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.pca.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.preprocessing.vsdi\_preprocessing.pca +==================================================== + +.. currentmodule:: pipeline_vsdi.preprocessing.vsdi_preprocessing + + + +.. autofunction:: pipeline_vsdi::preprocessing.vsdi_preprocessing.pca + diff --git a/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.pca_ica.rst b/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.pca_ica.rst new file mode 100644 index 0000000..19c863d --- /dev/null +++ b/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.pca_ica.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.preprocessing.vsdi\_preprocessing.pca\_ica +========================================================= + +.. currentmodule:: pipeline_vsdi.preprocessing.vsdi_preprocessing + + + +.. autofunction:: pipeline_vsdi::preprocessing.vsdi_preprocessing.pca_ica + diff --git a/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.peak_distance.rst b/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.peak_distance.rst new file mode 100644 index 0000000..ad1eaf3 --- /dev/null +++ b/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.peak_distance.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.preprocessing.vsdi\_preprocessing.peak\_distance +=============================================================== + +.. currentmodule:: pipeline_vsdi.preprocessing.vsdi_preprocessing + + + +.. autofunction:: pipeline_vsdi::preprocessing.vsdi_preprocessing.peak_distance + diff --git a/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.rst b/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.rst new file mode 100644 index 0000000..a0e3bf1 --- /dev/null +++ b/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.rst @@ -0,0 +1,41 @@ +pipeline\_vsdi.preprocessing.vsdi\_preprocessing +================================================ + +.. automodule:: pipeline_vsdi.preprocessing.vsdi_preprocessing + + + + + + + + .. rubric:: Functions + + .. autosummary:: + :toctree: + + check_bimodal + clean_hemodynamic_pca + clean_hemodynamics + clean_outliers + design_matrix + find_outliers + find_outliers_old + glm + merge_masks + pca + pca_ica + peak_distance + + + + + + + + + + + + + diff --git a/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.convert_pvalue_to_asterisks.rst b/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.convert_pvalue_to_asterisks.rst new file mode 100644 index 0000000..6c5e535 --- /dev/null +++ b/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.convert_pvalue_to_asterisks.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.visualization.vsdi\_visualization.convert\_pvalue\_to\_asterisks +=============================================================================== + +.. currentmodule:: pipeline_vsdi.visualization.vsdi_visualization + + + +.. autofunction:: pipeline_vsdi::visualization.vsdi_visualization.convert_pvalue_to_asterisks + diff --git a/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.create_frame.rst b/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.create_frame.rst new file mode 100644 index 0000000..9426a5b --- /dev/null +++ b/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.create_frame.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.visualization.vsdi\_visualization.create\_frame +============================================================== + +.. currentmodule:: pipeline_vsdi.visualization.vsdi_visualization + + + +.. autofunction:: pipeline_vsdi::visualization.vsdi_visualization.create_frame + diff --git a/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.fingerprint_gif.rst b/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.fingerprint_gif.rst new file mode 100644 index 0000000..7f5876c --- /dev/null +++ b/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.fingerprint_gif.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.visualization.vsdi\_visualization.fingerprint\_gif +================================================================= + +.. currentmodule:: pipeline_vsdi.visualization.vsdi_visualization + + + +.. autofunction:: pipeline_vsdi::visualization.vsdi_visualization.fingerprint_gif + diff --git a/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.plot_betas.rst b/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.plot_betas.rst new file mode 100644 index 0000000..e7f5bef --- /dev/null +++ b/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.plot_betas.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.visualization.vsdi\_visualization.plot\_betas +============================================================ + +.. currentmodule:: pipeline_vsdi.visualization.vsdi_visualization + + + +.. autofunction:: pipeline_vsdi::visualization.vsdi_visualization.plot_betas + diff --git a/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.plot_fingerprints.rst b/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.plot_fingerprints.rst new file mode 100644 index 0000000..272f7da --- /dev/null +++ b/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.plot_fingerprints.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.visualization.vsdi\_visualization.plot\_fingerprints +=================================================================== + +.. currentmodule:: pipeline_vsdi.visualization.vsdi_visualization + + + +.. autofunction:: pipeline_vsdi::visualization.vsdi_visualization.plot_fingerprints + diff --git a/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.plot_timecourse_histograms.rst b/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.plot_timecourse_histograms.rst new file mode 100644 index 0000000..23ab357 --- /dev/null +++ b/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.plot_timecourse_histograms.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.visualization.vsdi\_visualization.plot\_timecourse\_histograms +============================================================================= + +.. currentmodule:: pipeline_vsdi.visualization.vsdi_visualization + + + +.. autofunction:: pipeline_vsdi::visualization.vsdi_visualization.plot_timecourse_histograms + diff --git a/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.plot_timecourses.rst b/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.plot_timecourses.rst new file mode 100644 index 0000000..032de86 --- /dev/null +++ b/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.plot_timecourses.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.visualization.vsdi\_visualization.plot\_timecourses +================================================================== + +.. currentmodule:: pipeline_vsdi.visualization.vsdi_visualization + + + +.. autofunction:: pipeline_vsdi::visualization.vsdi_visualization.plot_timecourses + diff --git a/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.rst b/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.rst new file mode 100644 index 0000000..2d88a0e --- /dev/null +++ b/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.rst @@ -0,0 +1,37 @@ +pipeline\_vsdi.visualization.vsdi\_visualization +================================================ + +.. automodule:: pipeline_vsdi.visualization.vsdi_visualization + + + + + + + + .. rubric:: Functions + + .. autosummary:: + :toctree: + + convert_pvalue_to_asterisks + create_frame + fingerprint_gif + plot_betas + plot_fingerprints + plot_timecourse_histograms + plot_timecourses + timecourse_around + + + + + + + + + + + + + diff --git a/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.timecourse_around.rst b/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.timecourse_around.rst new file mode 100644 index 0000000..3ba1894 --- /dev/null +++ b/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.timecourse_around.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.visualization.vsdi\_visualization.timecourse\_around +=================================================================== + +.. currentmodule:: pipeline_vsdi.visualization.vsdi_visualization + + + +.. autofunction:: pipeline_vsdi::visualization.vsdi_visualization.timecourse_around + diff --git a/docs/generated/pipeline_vsdi.vsdi.loaders.extract_behavioural_data.rst b/docs/generated/pipeline_vsdi.vsdi.loaders.extract_behavioural_data.rst new file mode 100644 index 0000000..d8bba66 --- /dev/null +++ b/docs/generated/pipeline_vsdi.vsdi.loaders.extract_behavioural_data.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.vsdi.loaders.extract\_behavioural\_data +====================================================== + +.. currentmodule:: pipeline_vsdi.vsdi.loaders + + + +.. autofunction:: pipeline_vsdi::vsdi.loaders.extract_behavioural_data + diff --git a/docs/generated/pipeline_vsdi.vsdi.loaders.extract_lfp_data.rst b/docs/generated/pipeline_vsdi.vsdi.loaders.extract_lfp_data.rst new file mode 100644 index 0000000..1c304c2 --- /dev/null +++ b/docs/generated/pipeline_vsdi.vsdi.loaders.extract_lfp_data.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.vsdi.loaders.extract\_lfp\_data +============================================== + +.. currentmodule:: pipeline_vsdi.vsdi.loaders + + + +.. autofunction:: pipeline_vsdi::vsdi.loaders.extract_lfp_data + diff --git a/docs/generated/pipeline_vsdi.vsdi.loaders.read_data_fields.rst b/docs/generated/pipeline_vsdi.vsdi.loaders.read_data_fields.rst new file mode 100644 index 0000000..b89322e --- /dev/null +++ b/docs/generated/pipeline_vsdi.vsdi.loaders.read_data_fields.rst @@ -0,0 +1,11 @@ + + +pipeline\_vsdi.vsdi.loaders.read\_data\_fields +============================================== + +.. currentmodule:: pipeline_vsdi.vsdi.loaders + + + +.. autofunction:: pipeline_vsdi::vsdi.loaders.read_data_fields + diff --git a/docs/generated/pipeline_vsdi.vsdi.loaders.rst b/docs/generated/pipeline_vsdi.vsdi.loaders.rst new file mode 100644 index 0000000..9ae204f --- /dev/null +++ b/docs/generated/pipeline_vsdi.vsdi.loaders.rst @@ -0,0 +1,32 @@ +pipeline\_vsdi.vsdi.loaders +=========================== + +.. automodule:: pipeline_vsdi.vsdi.loaders + + + + + + + + .. rubric:: Functions + + .. autosummary:: + :toctree: + + extract_behavioural_data + extract_lfp_data + read_data_fields + + + + + + + + + + + + + diff --git a/docs/generated/pipeline_vsdi.vsdi.vsdi.DataLoader.clean_vsdi.rst b/docs/generated/pipeline_vsdi.vsdi.vsdi.DataLoader.clean_vsdi.rst new file mode 100644 index 0000000..fe55137 --- /dev/null +++ b/docs/generated/pipeline_vsdi.vsdi.vsdi.DataLoader.clean_vsdi.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.vsdi.vsdi.DataLoader.clean\_vsdi +=============================================== + +.. currentmodule:: pipeline_vsdi.vsdi.vsdi + +method + +.. automethod:: pipeline_vsdi::vsdi.vsdi.DataLoader.clean_vsdi + diff --git a/docs/generated/pipeline_vsdi.vsdi.vsdi.DataLoader.get_data.rst b/docs/generated/pipeline_vsdi.vsdi.vsdi.DataLoader.get_data.rst new file mode 100644 index 0000000..99a4ca6 --- /dev/null +++ b/docs/generated/pipeline_vsdi.vsdi.vsdi.DataLoader.get_data.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.vsdi.vsdi.DataLoader.get\_data +============================================= + +.. currentmodule:: pipeline_vsdi.vsdi.vsdi + +method + +.. automethod:: pipeline_vsdi::vsdi.vsdi.DataLoader.get_data + diff --git a/docs/generated/pipeline_vsdi.vsdi.vsdi.DataLoader.load_data.rst b/docs/generated/pipeline_vsdi.vsdi.vsdi.DataLoader.load_data.rst new file mode 100644 index 0000000..407ac3e --- /dev/null +++ b/docs/generated/pipeline_vsdi.vsdi.vsdi.DataLoader.load_data.rst @@ -0,0 +1,11 @@ +:orphan: + +pipeline\_vsdi.vsdi.vsdi.DataLoader.load\_data +============================================== + +.. currentmodule:: pipeline_vsdi.vsdi.vsdi + +method + +.. automethod:: pipeline_vsdi::vsdi.vsdi.DataLoader.load_data + diff --git a/docs/generated/pipeline_vsdi.vsdi.vsdi.DataLoader.rst b/docs/generated/pipeline_vsdi.vsdi.vsdi.DataLoader.rst new file mode 100644 index 0000000..8f84012 --- /dev/null +++ b/docs/generated/pipeline_vsdi.vsdi.vsdi.DataLoader.rst @@ -0,0 +1,21 @@ +pipeline\_vsdi.vsdi.vsdi.DataLoader +=================================== + +.. currentmodule:: pipeline_vsdi.vsdi.vsdi + +.. autoclass:: DataLoader + + + + .. HACK -- the point here is that we don't want this to appear in the output, but the autosummary should still generate the pages. + .. autosummary:: + :toctree: + + DataLoader.clean_vsdi + DataLoader.get_data + DataLoader.load_data + + + + + diff --git a/docs/generated/pipeline_vsdi.vsdi.vsdi.rst b/docs/generated/pipeline_vsdi.vsdi.vsdi.rst new file mode 100644 index 0000000..b6f1955 --- /dev/null +++ b/docs/generated/pipeline_vsdi.vsdi.vsdi.rst @@ -0,0 +1,30 @@ +pipeline\_vsdi.vsdi.vsdi +======================== + +.. automodule:: pipeline_vsdi.vsdi.vsdi + + + + + + + + + + + + .. rubric:: Classes + + .. autosummary:: + :toctree: + + DataLoader + + + + + + + + + diff --git a/docs/index.rst b/docs/index.rst index fec4ebe..59f47b7 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -9,8 +9,9 @@ VSDI Pipeline Preprocessing tools for voltage sensitive dye imaging data .. toctree:: - :maxdepth: 2 - :caption: Contents: - - modules + :maxdepth: 1 + pipeline_vsdi.preprocessing + pipeline_vsdi.dim_reduction + pipeline_vsdi.visualization + pipeline_vsdi.vsdi \ No newline at end of file diff --git a/docs/modules.rst b/docs/modules.rst deleted file mode 100644 index 6dcf6d2..0000000 --- a/docs/modules.rst +++ /dev/null @@ -1,10 +0,0 @@ -Pipeline Modules -================ - -.. toctree:: - :maxdepth: 4 - - dim_reduction - preprocessing - visualization - vsdi diff --git a/docs/pipeline_vsdi.dim_reduction.rst b/docs/pipeline_vsdi.dim_reduction.rst new file mode 100644 index 0000000..0454eb0 --- /dev/null +++ b/docs/pipeline_vsdi.dim_reduction.rst @@ -0,0 +1,14 @@ +Dimensionality Reduction +======================== + +.. automodule:: pipeline_vsdi.dim_reduction + +.. rubric:: Modules + +.. autosummary:: + :toctree: generated/ + :recursive: + + pipeline_vsdi.dim_reduction.VAE + pipeline_vsdi.dim_reduction.linear_dim_red + diff --git a/docs/pipeline_vsdi.preprocessing.rst b/docs/pipeline_vsdi.preprocessing.rst new file mode 100644 index 0000000..aa4b82b --- /dev/null +++ b/docs/pipeline_vsdi.preprocessing.rst @@ -0,0 +1,16 @@ +Preprocessing +============= + +.. automodule:: pipeline_vsdi.preprocessing + +.. rubric:: Modules + +.. autosummary:: + :toctree: generated/ + :recursive: + + pipeline_vsdi.preprocessing.behavior + pipeline_vsdi.preprocessing.clustering + pipeline_vsdi.preprocessing.utils + pipeline_vsdi.preprocessing.vsdi_preprocessing + diff --git a/docs/pipeline_vsdi.visualization.rst b/docs/pipeline_vsdi.visualization.rst new file mode 100644 index 0000000..b9c9ae3 --- /dev/null +++ b/docs/pipeline_vsdi.visualization.rst @@ -0,0 +1,13 @@ +Visualization +============= + +.. automodule:: pipeline_vsdi.visualization + +.. rubric:: Modules + +.. autosummary:: + :toctree: generated/ + :recursive: + + pipeline_vsdi.visualization.vsdi_visualization + diff --git a/docs/pipeline_vsdi.vsdi.rst b/docs/pipeline_vsdi.vsdi.rst new file mode 100644 index 0000000..447b4f8 --- /dev/null +++ b/docs/pipeline_vsdi.vsdi.rst @@ -0,0 +1,14 @@ +Data Handling +============= + +.. automodule:: pipeline_vsdi.vsdi + +.. rubric:: Modules + +.. autosummary:: + :toctree: generated/ + :recursive: + + pipeline_vsdi.vsdi.loaders + pipeline_vsdi.vsdi.vsdi + diff --git a/docs/preprocessing.rst b/docs/preprocessing.rst deleted file mode 100644 index 8166232..0000000 --- a/docs/preprocessing.rst +++ /dev/null @@ -1,34 +0,0 @@ -Preprocessing Tools -=================== - -preprocessing.clustering module -------------------------------- - -.. automodule:: preprocessing.clustering - :members: - :undoc-members: - :show-inheritance: - -preprocessing.behavior module ------------------------------ - -.. automodule:: preprocessing.behavior - :members: - :undoc-members: - :show-inheritance: - -preprocessing.utils module --------------------------- - -.. automodule:: preprocessing.utils - :members: - :undoc-members: - :show-inheritance: - -preprocessing.vsdi\_preprocessing module ----------------------------------------- - -.. automodule:: preprocessing.vsdi_preprocessing - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/visualization.rst b/docs/visualization.rst deleted file mode 100644 index e0bb26c..0000000 --- a/docs/visualization.rst +++ /dev/null @@ -1,18 +0,0 @@ -Visualization Tools -=================== - -visualization.vsdi\_visualization module ----------------------------------------- - -.. automodule:: visualization.vsdi_visualization - :members: - :undoc-members: - :show-inheritance: - -Module contents ---------------- - -.. automodule:: visualization - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/vsdi.rst b/docs/vsdi.rst deleted file mode 100644 index effe1c3..0000000 --- a/docs/vsdi.rst +++ /dev/null @@ -1,19 +0,0 @@ -Data Handling -============= - -vsdi.vsdi module ----------------- - -.. automodule:: vsdi.vsdi - :members: - :undoc-members: - :show-inheritance: - -vsdi.loaders module -------------------- - -.. automodule:: vsdi.loaders - :members: - :undoc-members: - :show-inheritance: - diff --git a/pipeline_vsdi/dim_reduction/VAE.py b/pipeline_vsdi/dim_reduction/VAE.py index 3f44e04..68740ae 100644 --- a/pipeline_vsdi/dim_reduction/VAE.py +++ b/pipeline_vsdi/dim_reduction/VAE.py @@ -7,70 +7,7 @@ from tqdm import tqdm from sklearn.linear_model import LinearRegression from random import shuffle - -class Conv_VAE(nn.Module): - def __init__(self, latent_dim): - super(Conv_VAE, self).__init__() - self.latent_dim = latent_dim - - # Encoder - self.encoder = nn.Sequential( - nn.Conv2d(1, 16, kernel_size=3, stride=1, padding=1), - nn.ReLU(), - nn.Conv2d(16, 32, kernel_size=3, stride=1, padding=1), - nn.ReLU(), - nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1), - nn.ReLU() - ) - - # Linear layer for mean and variance - self.fc_mu = nn.Linear(64 * 84 * 48, self.latent_dim) - self.fc_logvar = nn.Linear(64 * 84 * 48, self.latent_dim) - - # Decoder - self.decoder = nn.Sequential( - nn.Linear(self.latent_dim, 64 * 84 * 48), - nn.ReLU(), - nn.Unflatten(1, (64, 84, 48)), - nn.ConvTranspose2d(64, 32, kernel_size=3, stride=1, padding=1), - nn.ReLU(), - nn.ConvTranspose2d(32, 16, kernel_size=3, stride=1, padding=1), - nn.ReLU(), - nn.ConvTranspose2d(16, 1, kernel_size=3, stride=1, padding=1), - nn.Sigmoid() - ) - - def reparametrize(self, mu, logvar): - std = torch.exp(0.5 * logvar) - eps = torch.randn_like(std) - return mu + eps * std - - def forward(self, x): - # Encoder - encoded = self.encoder(x) - encoded = torch.flatten(encoded, start_dim=1) - - # Reparameterization - mu = self.fc_mu(encoded) - logvar = self.fc_logvar(encoded) - z = self.reparametrize(mu, logvar) - - # Decoder - reconstructed = self.decoder(z) - - return reconstructed, mu, logvar - - def backward(self, optimizer, criterion, x, y_true): - optimizer.zero_grad() - y_pred, mu, logvar = self.forward(x) - kl_div = -0.5 * torch.sum(1 + logvar - mu.pow(2) - logvar.exp()) - mse = criterion(y_pred, y_true) - loss = mse + kl_div - loss.backward() - optimizer.step() - return loss.item() - - + class Conv_AE(nn.Module): def __init__(self, latent_dim): super(Conv_AE, self).__init__() @@ -124,6 +61,7 @@ def backward(self, optimizer, criterion, x, y_true): optimizer.step() return loss.item() + def create_dataloader(dataset, batch_size=128, reshuffle_after_epoch=True): ''' Creates a DataLoader for Pytorch to train the autoencoder with the image data converted to a tensor. @@ -246,6 +184,7 @@ def find_max_activation_images(model, n_hidden, img_shape=[1, 84, 49]): return np.array(images) + def shuffle_2D_matrix(m): ''' Shuffles a matrix across both axis (not only the first axis like numpy.permutation() or random.shuffle()). @@ -265,6 +204,7 @@ def shuffle_2D_matrix(m): m_shuffled = m[ind_x, ind_y] return m_shuffled + def linear_decoding_score(embeddings, features, n_baseline=10000): ''' Computes the score of linear regression of embeddings --> features. Features will normally be position (x,y) diff --git a/pipeline_vsdi/dim_reduction/linear_dim_red.py b/pipeline_vsdi/dim_reduction/linear_dim_red.py index d1da105..4d29bf4 100644 --- a/pipeline_vsdi/dim_reduction/linear_dim_red.py +++ b/pipeline_vsdi/dim_reduction/linear_dim_red.py @@ -1,8 +1,104 @@ +""" +This module provides functions for performing dimensionality reduction on VSDI (Voltage-Sensitive Dye Imaging) data using PCA (Principal Component Analysis) and ICA (Independent Component Analysis). + +Dependencies: +- numpy +- sklearn + +Usage: +- Use the `pca` function to perform PCA on VSDI data and obtain the principal components and timecourses. +- Use the `pca_ica` function to perform PCA and ICA on VSDI data and obtain the fingerprint patterns, timecourses, and explained variance ratios. +""" + # Dimensionality reduction from sklearn.decomposition import PCA, FastICA +from sklearn.preprocessing import StandardScaler from sklearn.pipeline import Pipeline +def pca(vsdi, raw_mask=None, n_comp=10, normalize=True): + """ + Perform Principal Component Analysis (PCA) on vsdi data. + + The function reshapes the vsdi data, optionally applies a raw mask, and then performs PCA on the reshaped data. + It returns the principal components (also known as "fingerprints") and their corresponding timecourses. + + Parameters + ---------- + vsdi : ndarray + The input vsdi data to be analyzed. It should be a 3D numpy array with dimensions (height, width, time). + + raw_mask : ndarray, optional + A mask to be applied to the vsdi data. The mask should be a 2D numpy array with the same spatial dimensions + as the vsdi data. Pixels outside the mask are set to zero. If None, no mask is applied. Default is None. + + n_comp : int, optional + The number of principal components to compute. Default is 10. + + normalize : bool, optional + Whether to normalize the input data before performing PCA. If True, the data are normalized to have zero mean + and unit variance. Default is True. + + Returns + ------- + fingerprints : ndarray + The principal components of the vsdi data. This is a 2D numpy array where each row corresponds to a principal + component and each column corresponds to a pixel. The components are ordered by their explained variance, with + the component that explains the most variance first. + + timecourses : ndarray + The timecourses corresponding to each principal component. This is a 2D numpy array where each row corresponds + to a principal component and each column corresponds to a time point. + + Examples + -------- + >>> vsdi_data = np.random.rand(100, 100, 1000) # Mock vsdi data + >>> fingerprints, timecourses = pca(vsdi_data) + """ + # reshape vsdi data to (time, pixels) + X = vsdi.transpose(2, 0, 1) + # store original shape + # vsdi_shape = vsdi.shape + if raw_mask is not None: + # put out-of-mask values to zero + X = X[:, raw_mask] + else: + # flatten 2d pixels to array + X = X.reshape(vsdi.shape[0], vsdi.shape[1]*vsdi.shape[2]) + + # Create a pipeline with PCA + pipe = Pipeline([ + ('scaler', StandardScaler()), + ('pca', PCA(n_components=10)) + ]) + + # Fit the pipeline to vsdi data + out = pipe.fit(X) + fingerprints = out.named_steps['pca'].components_ + timecourses = fingerprints @ X.T + + return fingerprints, timecourses + + def pca_ica(vsdi, mask): + """ + Perform PCA and ICA on VSDI data. + + Parameters + ---------- + vsdi : ndarray + Array containing VSDI data. + mask : ndarray + Array representing the mask to be applied to the VSDI data. + + Returns + ------- + fingerprints : ndarray + Array containing the fingerprint patterns obtained from ICA. + timecourses : ndarray + Array containing the timecourses obtained from ICA. + explained_variance : ndarray + Array containing the explained variance ratios from PCA. + """ X = vsdi.transpose(2, 0, 1) X = X*mask X = X.reshape(X.shape[0], X.shape[1]*X.shape[2]) diff --git a/pipeline_vsdi/preprocessing/behavior.py b/pipeline_vsdi/preprocessing/behavior.py index 90fcf70..fd5f6e5 100644 --- a/pipeline_vsdi/preprocessing/behavior.py +++ b/pipeline_vsdi/preprocessing/behavior.py @@ -1,4 +1,36 @@ -# Data management +""" +This module provides a set of functions for the analysis of animal behavioral data. + +Functions: +--------- +make_design_matrix(b_data, event_sequences, fps=50): + Generates a design matrix based on the provided event sequences. + +subsets(Set): + Finds the starting indices of subsets of consecutive numbers within the provided set. + +get_trials(feature): + Finds the starting indices of trials within the provided design matrix vector. + +compute_lick_rate(data, trial_onsets, fps): + Compute the lick rate for each trial. + +store_indices(animals, days, sessions, outpath): + Store cumulative index (based on X matrix length) for each session, day, and animal, + as well as trial indices for CS+ and CS- trials in a nested dictionary structure. + +Example +---------- +This module can be used to compute lick rates and extract trial indices from behavioral data +for multiple animals over multiple days and sessions. + +>>> animals = ['Mouse1', 'Mouse2'] +>>> days = ['Day1', 'Day2'] +>>> sessions = ['Session1', 'Session2'] +>>> outpath = '/path/to/output/directory' +>>> indices_dict = store_indices(animals, days, sessions, outpath) +""" + import numpy as np def make_design_matrix(b_data, event_sequences, fps=50): @@ -133,7 +165,38 @@ def get_trials(feature): return feature_trials def compute_lick_rate(data, trial_onsets, fps): + """ + Compute the lick rate for each trial. + + For each trial, the function computes the number of licks during a 'baseline' period + of 1 second before CS presentation and during a 'trace' period of 1 second starting + 2 seconds after CS presentation. The lick rate for the trial is then computed as + the number of licks in the trace period minus the number of licks in the baseline period. + Parameters + ---------- + data : ndarray + 1D numpy array containing lick data. Each element corresponds to a frame, and its + value indicates whether a lick occurred in that frame (1) or not (0). + + trial_onsets : ndarray + 1D numpy array containing the onset times (in frames) of each trial. + + fps : int + Frame rate of the data (frames per second). + + Returns + ------- + lick_rates : list + List of lick rates for each trial. + + Examples + -------- + >>> lick_data = np.random.randint(0, 2, 600) # Mock lick data + >>> trial_onsets = np.array([100, 300, 500]) # Mock trial onset times + >>> fps = 30 # Frame rate + >>> lick_rates = compute_lick_rate(lick_data, trial_onsets, fps) + """ lick_rates = [] for i in range(len(trial_onsets)): @@ -150,14 +213,6 @@ def compute_lick_rate(data, trial_onsets, fps): return lick_rates -def compute_and_add_lick_rate(df, fps): - """ - Lick Rate (Hz) per frame using X dataframe version - """ - # Group by 'Animal', 'Day', 'Session' and apply rolling window calculation - df['Lick Rate (Hz)'] = df.groupby(['Animal', 'Day', 'Session'])['Lick'].transform(lambda x: x.rolling(fps, min_periods=1).sum()) - return df - def store_indices(animals, days, sessions, outpath): """ Store cumulative index (based on X matrix length) for each session, day, and animal, diff --git a/pipeline_vsdi/preprocessing/vsdi_preprocessing.py b/pipeline_vsdi/preprocessing/vsdi_preprocessing.py index e0edf3c..7ad86b9 100644 --- a/pipeline_vsdi/preprocessing/vsdi_preprocessing.py +++ b/pipeline_vsdi/preprocessing/vsdi_preprocessing.py @@ -25,6 +25,7 @@ def peak_distance(component, smooth_window_size, hist_nbins): return x_max + def check_bimodal(components, th=1.0, smooth_window_size=5, hist_nbins=1000): """ Test for bimodality using moving average to smooth the histogram diff --git a/pipeline_vsdi/vsdi/loaders.py b/pipeline_vsdi/vsdi/loaders.py index 4af5b6d..c1beb04 100644 --- a/pipeline_vsdi/vsdi/loaders.py +++ b/pipeline_vsdi/vsdi/loaders.py @@ -1,7 +1,56 @@ +""" +This module contains functions to read and extract data from ATC (Assistive Technology Comparison) data objects. + +The ATC data objects are expected to be a dictionary like objects that represent the contents of .mat files, +which contain various fields of data related to behavioural experiments. + +The key functions in the module include: + +- read_data_fields: This function reads and prints the names and shapes of data fields in the given ATC data object. + +- extract_behavioural_data: This function extracts specific behavioural data fields from an ATC data object. + +- extract_lfp_data: This function extracts the local field potential (LFP) data from the given ATC data object. + +Please refer to the individual function docstrings for more detailed information on their usage and output. + +Example usage: + +>>> import scipy.io +>>> atc_data = scipy.io.loadmat('data.mat') # Load .mat file +>>> read_data_fields(atc_data) +>>> extracted_data = extract_behavioural_data(atc_data) +>>> lfp_data = extract_lfp_data(atc_data) +""" + import numpy as np def read_data_fields(atc_data): + """ + Reads and prints the names and shapes of data fields in the given ATC data object. + + This function reads the fields from the input ATC data object and then prints out each field's name and shape. + + Parameters + ---------- + atc_data : dictionary + The input ATC data object which contains multiple fields. It's expected to be a dictionary + like object (such as .mat file) that contains data fields. + + Returns + ------- + None + + Prints + ------ + For each field in the ATC data object, its name and shape are printed to the console. + + Examples + -------- + >>> atc_data = loadmat('data.mat') # Load .mat file with scipy.io.loadmat + >>> read_data_fields(atc_data) + """ data = atc_data['Data_OE'][0][0] names = np.asarray(atc_data['Data_OE'][0][0].dtype.names) for i, k in enumerate(names): @@ -9,6 +58,41 @@ def read_data_fields(atc_data): def extract_behavioural_data(atc_data): + """ + Extracts specific behavioural data fields from an ATC data object. + + This function reads fields from the input ATC data, checks if the required fields are present, + and then extracts and flattens the required fields. + + Parameters + ---------- + atc_data : dictionary + The input ATC data object which contains multiple fields. It's expected to be a dictionary + like object (such as .mat file) that contains data fields. + + Returns + ------- + extracted_data : dictionary + A dictionary containing the extracted data for each of the required fields. Each field + is flattened and represented as a 1-D array. + + Raises + ------ + TypeError + If a required field is not found in the ATC data object, a TypeError is raised indicating + the missing field. + + Notes + ----- + The fields to be extracted are defined in the `to_extract` variable within the function. + Currently, these include 'CSp', 'CSn', 'Lick', and 'frames'. If other fields are needed, + this list should be updated accordingly. + + Examples + -------- + >>> atc_data = loadmat('data.mat') # Load .mat file with scipy.io.loadmat + >>> extracted_data = extract_behavioural_data(atc_data) + """ # reads daa fields in input .mat file names = np.asarray(atc_data['Data_OE'][0][0].dtype.names) # fields to extract @@ -27,6 +111,34 @@ def extract_behavioural_data(atc_data): def extract_lfp_data(atc_data): + """ + Extracts the local field potential (LFP) data from the given ATC data object. + + This function reads the input ATC data object, checks if it contains the 'HPC_LFP' field, + and then extracts and returns the 'HPC_LFP' data. The 'HPC_LFP' data are flattened and stacked vertically. + + Parameters + ---------- + atc_data : dictionary + The input ATC data object which contains multiple fields including 'HPC_LFP'. It's expected to be a + dictionary like object (such as .mat file) that contains data fields. + + Returns + ------- + lfp : ndarray + A 2-D numpy array that contains the extracted 'HPC_LFP' data. Each sub-array is flattened and + the sub-arrays are stacked vertically. + + Raises + ------ + TypeError + If the 'HPC_LFP' field is not found in the ATC data object. + + Examples + -------- + >>> atc_data = loadmat('data.mat') # Load .mat file with scipy.io.loadmat + >>> lfp_data = extract_lfp_data(atc_data) + """ names = np.asarray(atc_data['Data_OE'][0][0].dtype.names) lfp_name = 'HPC_LFP' if not lfp_name in names: From 0dc9bc3a20e1ffa70e8adcb13a1d4f04e22e278f Mon Sep 17 00:00:00 2001 From: dabadav Date: Wed, 14 Jun 2023 02:14:01 +0200 Subject: [PATCH 36/67] More Docs --- docs/pipeline_vsdi.dim_reduction.rst | 6 + pipeline_vsdi/dim_reduction/VAE.py | 127 +++++++++++++++++- pipeline_vsdi/dim_reduction/linear_dim_red.py | 18 ++- 3 files changed, 141 insertions(+), 10 deletions(-) diff --git a/docs/pipeline_vsdi.dim_reduction.rst b/docs/pipeline_vsdi.dim_reduction.rst index 0454eb0..f26f578 100644 --- a/docs/pipeline_vsdi.dim_reduction.rst +++ b/docs/pipeline_vsdi.dim_reduction.rst @@ -3,6 +3,12 @@ Dimensionality Reduction .. automodule:: pipeline_vsdi.dim_reduction +Encompasses both linear and nonlinear dimensionality reduction techniques: + +1. Dimensionality Reduction: This submodule offers functionalities for performing Principal Component Analysis (PCA) and Independent Component Analysis (ICA) on Voltage Sensitive Dye Imaging (VSDI) data, a type of data commonly used in neuroscience for imaging brain activity. + +2. Nonlinear Dimensionality Reduction: This submodule provides functionalities for training, analyzing, and performing various operations with Convolutional Autoencoders (Conv_AE). This is useful for the compression and reconstruction of image data, making it particularly valuable in fields like computer vision and medical imaging. + .. rubric:: Modules .. autosummary:: diff --git a/pipeline_vsdi/dim_reduction/VAE.py b/pipeline_vsdi/dim_reduction/VAE.py index 68740ae..4b25764 100644 --- a/pipeline_vsdi/dim_reduction/VAE.py +++ b/pipeline_vsdi/dim_reduction/VAE.py @@ -1,7 +1,27 @@ +""" +Module for Nonlinear Dimensionality Reduction. + +This module provides functionalities for training, analyzing and performing various operations with Convolutional Autoencoders (Conv_AE). + +Classes: + - Conv_AE: Defines a PyTorch model for a convolutional autoencoder, which includes an encoder and a decoder for image data compression and reconstruction, respectively. + +Functions: + - create_dataloader(dataset): Returns a PyTorch DataLoader prepared from a given dataset. + - train_autoencoder(model, dataloader, num_epochs): Trains the provided autoencoder model. + - predict(model, image): Returns the autoencoder's reconstruction of a given image. + - get_latent_vectors(model, dataloader): Returns latent representations of a given dataset. + - find_max_activation_images(model, dataloader): Identifies images that maximize the activation of each unit in the autoencoder's latent space. + - shuffle_2D_matrix(matrix): Shuffles a 2D matrix across both dimensions. + - linear_decoding_score(embeddings, features): Calculates the score of linear regression of embeddings to features. + - linear_decoding_error(embeddings, features): Computes the expected error of a linear decoder that uses the embeddings to predict certain features of the data. + +The module is specifically designed for the purpose of training a convolutional autoencoder to compress image data into a low-dimensional latent representation and evaluate the quality of these representations. +""" + import numpy as np import torch import torch.nn as nn -import torch.nn.functional as F import torch.optim as optim from torch.utils.data import DataLoader, TensorDataset from tqdm import tqdm @@ -9,7 +29,32 @@ from random import shuffle class Conv_AE(nn.Module): + """ + Convolutional Autoencoder (Conv_AE) Class. + + This class implements a convolutional autoencoder using PyTorch's nn.Module. + It includes an encoder and a decoder. The encoder compresses the input data + into a latent space, and the decoder reconstructs the original data from + the latent representation. The model is trained to minimize the difference + between the input and the output of the autoencoder. + + Methods + ------- + forward(x): + Passes the input through the encoder and decoder. + + backward(optimizer, criterion, x, y_true): + Computes the loss, performs backpropagation, and updates the model parameters. + """ def __init__(self, latent_dim): + """ + Initializes the Conv_AE class. + + Parameters + ---------- + latent_dim : int + Dimensionality of the latent space. + """ super(Conv_AE, self).__init__() self.latent_dim = latent_dim @@ -40,6 +85,22 @@ def __init__(self, latent_dim): ) def forward(self, x): + """ + Passes the input through the encoder and decoder. + + Parameters + ---------- + x : torch.Tensor + The input to the autoencoder. + + Returns + ------- + reconstructed : torch.Tensor + The reconstructed input produced by the decoder. + + h : torch.Tensor + The latent representation of the input. + """ # Encoder encoded = self.encoder(x) encoded = torch.flatten(encoded, start_dim=1) @@ -53,6 +114,29 @@ def forward(self, x): return reconstructed, h def backward(self, optimizer, criterion, x, y_true): + """ + Computes the loss, performs backpropagation, and updates the model parameters. + + Parameters + ---------- + optimizer : torch.optim.Optimizer + The optimizer used to update the model parameters. + + criterion : torch.nn.modules.loss._Loss + The loss function used to measure the difference between the + reconstructed input and the original input. + + x : torch.Tensor + The input to the autoencoder. + + y_true : torch.Tensor + The true values (same as the input for an autoencoder). + + Returns + ------- + loss.item() : float + The computed loss value. + """ optimizer.zero_grad() y_pred, _ = self.forward(x) mse = criterion(y_pred, y_true) @@ -80,9 +164,44 @@ def create_dataloader(dataset, batch_size=128, reshuffle_after_epoch=True): def train_autoencoder(model, train_loader, dataset=[], num_epochs=1000, learning_rate=1e-3, L2_weight_decay=0): - ''' - TO DO. - ''' + """ + Trains the autoencoder model. + + This function trains the autoencoder model using the Adam optimizer + and the Mean Squared Error loss function. It also tracks the history + of loss values for each epoch, and optionally, the evolution of the + latent vectors. + + Parameters + ---------- + model : Conv_AE + The autoencoder model to be trained. + + train_loader : torch.utils.data.DataLoader + The data loader that provides batches of training data. + + dataset : list, optional + If provided, this function will also track the evolution of the + latent vectors for each data point in this dataset. + + num_epochs : int, optional + The number of epochs for training the model. Default is 1000. + + learning_rate : float, optional + The learning rate for the Adam optimizer. Default is 1e-3. + + L2_weight_decay : float, optional + The weight decay (L2 penalty) for the Adam optimizer. Default is 0. + + Returns + ------- + history : list + A list containing the history of loss values for each epoch. + + embeddings : numpy.ndarray + A numpy array containing the evolution of the latent vectors + for each data point in the dataset (if provided). + """ optimizer = optim.Adam(model.parameters(), lr=learning_rate, weight_decay=L2_weight_decay) criterion = nn.MSELoss() diff --git a/pipeline_vsdi/dim_reduction/linear_dim_red.py b/pipeline_vsdi/dim_reduction/linear_dim_red.py index 4d29bf4..f678b9f 100644 --- a/pipeline_vsdi/dim_reduction/linear_dim_red.py +++ b/pipeline_vsdi/dim_reduction/linear_dim_red.py @@ -1,13 +1,19 @@ """ -This module provides functions for performing dimensionality reduction on VSDI (Voltage-Sensitive Dye Imaging) data using PCA (Principal Component Analysis) and ICA (Independent Component Analysis). +Linear Dimensionality Reduction Module. + +This module provides functionalities for performing Principal Component Analysis (PCA) and Independent Component Analysis (ICA) +on Voltage Sensitive Dye Imaging (VSDI) data. + +Functions: + - pca(vsdi, raw_mask=None, n_comp=10, normalize=True): Performs PCA on VSDI data and returns the principal components (fingerprints) and their corresponding timecourses. + - pca_ica(vsdi, mask): Performs PCA followed by ICA on VSDI data and returns the fingerprint patterns and their timecourses obtained from ICA, along with explained variance ratios from PCA. Dependencies: -- numpy -- sklearn + - sklearn.decomposition: PCA, FastICA + - sklearn.preprocessing: StandardScaler + - sklearn.pipeline: Pipeline -Usage: -- Use the `pca` function to perform PCA on VSDI data and obtain the principal components and timecourses. -- Use the `pca_ica` function to perform PCA and ICA on VSDI data and obtain the fingerprint patterns, timecourses, and explained variance ratios. +This module is designed for applying dimensionality reduction techniques to VSDI data, which is commonly used in neuroscience for imaging brain activity. """ # Dimensionality reduction From 24a8577455cc2f7f4e4a5c7b475d7bceb8ab75d9 Mon Sep 17 00:00:00 2001 From: dabadav Date: Wed, 14 Jun 2023 09:17:20 +0200 Subject: [PATCH 37/67] More Docs --- docs/_static/custom.css | 54 +++++++++++++ docs/_templates/breadcrumbs.html | 4 + docs/conf.py | 23 +++--- ...im_reduction.VAE.Conv_AE.T_destination.rst | 11 --- ...sdi.dim_reduction.VAE.Conv_AE.__call__.rst | 11 --- ...i.dim_reduction.VAE.Conv_AE.add_module.rst | 11 --- ...e_vsdi.dim_reduction.VAE.Conv_AE.apply.rst | 11 --- ...sdi.dim_reduction.VAE.Conv_AE.backward.rst | 11 --- ...sdi.dim_reduction.VAE.Conv_AE.bfloat16.rst | 11 --- ...vsdi.dim_reduction.VAE.Conv_AE.buffers.rst | 11 --- ..._reduction.VAE.Conv_AE.call_super_init.rst | 11 --- ...sdi.dim_reduction.VAE.Conv_AE.children.rst | 11 --- ...ine_vsdi.dim_reduction.VAE.Conv_AE.cpu.rst | 11 --- ...ne_vsdi.dim_reduction.VAE.Conv_AE.cuda.rst | 11 --- ..._vsdi.dim_reduction.VAE.Conv_AE.double.rst | 11 --- ...dim_reduction.VAE.Conv_AE.dump_patches.rst | 11 --- ...ne_vsdi.dim_reduction.VAE.Conv_AE.eval.rst | 11 --- ...i.dim_reduction.VAE.Conv_AE.extra_repr.rst | 11 --- ...e_vsdi.dim_reduction.VAE.Conv_AE.float.rst | 11 --- ...vsdi.dim_reduction.VAE.Conv_AE.forward.rst | 11 --- ...i.dim_reduction.VAE.Conv_AE.get_buffer.rst | 11 --- ..._reduction.VAE.Conv_AE.get_extra_state.rst | 11 --- ...im_reduction.VAE.Conv_AE.get_parameter.rst | 11 --- ...im_reduction.VAE.Conv_AE.get_submodule.rst | 11 --- ...ne_vsdi.dim_reduction.VAE.Conv_AE.half.rst | 11 --- ...ine_vsdi.dim_reduction.VAE.Conv_AE.ipu.rst | 11 --- ..._reduction.VAE.Conv_AE.load_state_dict.rst | 11 --- ...vsdi.dim_reduction.VAE.Conv_AE.modules.rst | 11 --- ...im_reduction.VAE.Conv_AE.named_buffers.rst | 11 --- ...m_reduction.VAE.Conv_AE.named_children.rst | 11 --- ...im_reduction.VAE.Conv_AE.named_modules.rst | 11 --- ...reduction.VAE.Conv_AE.named_parameters.rst | 11 --- ...i.dim_reduction.VAE.Conv_AE.parameters.rst | 11 --- ...ion.VAE.Conv_AE.register_backward_hook.rst | 11 --- ..._reduction.VAE.Conv_AE.register_buffer.rst | 11 --- ...tion.VAE.Conv_AE.register_forward_hook.rst | 11 --- ....VAE.Conv_AE.register_forward_pre_hook.rst | 11 --- ...AE.Conv_AE.register_full_backward_hook.rst | 11 --- ...onv_AE.register_full_backward_pre_hook.rst | 11 --- ..._AE.register_load_state_dict_post_hook.rst | 11 --- ..._reduction.VAE.Conv_AE.register_module.rst | 11 --- ...duction.VAE.Conv_AE.register_parameter.rst | 11 --- ...E.Conv_AE.register_state_dict_pre_hook.rst | 11 --- ...m_reduction.VAE.Conv_AE.requires_grad_.rst | 11 --- ...ipeline_vsdi.dim_reduction.VAE.Conv_AE.rst | 74 ------------------ ..._reduction.VAE.Conv_AE.set_extra_state.rst | 11 --- ...dim_reduction.VAE.Conv_AE.share_memory.rst | 11 --- ...i.dim_reduction.VAE.Conv_AE.state_dict.rst | 11 --- ...line_vsdi.dim_reduction.VAE.Conv_AE.to.rst | 11 --- ...sdi.dim_reduction.VAE.Conv_AE.to_empty.rst | 11 --- ...e_vsdi.dim_reduction.VAE.Conv_AE.train.rst | 11 --- ...sdi.dim_reduction.VAE.Conv_AE.training.rst | 11 --- ...ne_vsdi.dim_reduction.VAE.Conv_AE.type.rst | 11 --- ...ine_vsdi.dim_reduction.VAE.Conv_AE.xpu.rst | 11 --- ...di.dim_reduction.VAE.Conv_AE.zero_grad.rst | 11 --- ...m_reduction.VAE.Conv_VAE.T_destination.rst | 11 --- ...di.dim_reduction.VAE.Conv_VAE.__call__.rst | 11 --- ....dim_reduction.VAE.Conv_VAE.add_module.rst | 11 --- ..._vsdi.dim_reduction.VAE.Conv_VAE.apply.rst | 11 --- ...di.dim_reduction.VAE.Conv_VAE.backward.rst | 11 --- ...di.dim_reduction.VAE.Conv_VAE.bfloat16.rst | 11 --- ...sdi.dim_reduction.VAE.Conv_VAE.buffers.rst | 11 --- ...reduction.VAE.Conv_VAE.call_super_init.rst | 11 --- ...di.dim_reduction.VAE.Conv_VAE.children.rst | 11 --- ...ne_vsdi.dim_reduction.VAE.Conv_VAE.cpu.rst | 11 --- ...e_vsdi.dim_reduction.VAE.Conv_VAE.cuda.rst | 11 --- ...vsdi.dim_reduction.VAE.Conv_VAE.double.rst | 11 --- ...im_reduction.VAE.Conv_VAE.dump_patches.rst | 11 --- ...e_vsdi.dim_reduction.VAE.Conv_VAE.eval.rst | 11 --- ....dim_reduction.VAE.Conv_VAE.extra_repr.rst | 11 --- ..._vsdi.dim_reduction.VAE.Conv_VAE.float.rst | 11 --- ...sdi.dim_reduction.VAE.Conv_VAE.forward.rst | 11 --- ....dim_reduction.VAE.Conv_VAE.get_buffer.rst | 11 --- ...reduction.VAE.Conv_VAE.get_extra_state.rst | 11 --- ...m_reduction.VAE.Conv_VAE.get_parameter.rst | 11 --- ...m_reduction.VAE.Conv_VAE.get_submodule.rst | 11 --- ...e_vsdi.dim_reduction.VAE.Conv_VAE.half.rst | 11 --- ...ne_vsdi.dim_reduction.VAE.Conv_VAE.ipu.rst | 11 --- ...reduction.VAE.Conv_VAE.load_state_dict.rst | 11 --- ...sdi.dim_reduction.VAE.Conv_VAE.modules.rst | 11 --- ...m_reduction.VAE.Conv_VAE.named_buffers.rst | 11 --- ..._reduction.VAE.Conv_VAE.named_children.rst | 11 --- ...m_reduction.VAE.Conv_VAE.named_modules.rst | 11 --- ...eduction.VAE.Conv_VAE.named_parameters.rst | 11 --- ....dim_reduction.VAE.Conv_VAE.parameters.rst | 11 --- ...on.VAE.Conv_VAE.register_backward_hook.rst | 11 --- ...reduction.VAE.Conv_VAE.register_buffer.rst | 11 --- ...ion.VAE.Conv_VAE.register_forward_hook.rst | 11 --- ...VAE.Conv_VAE.register_forward_pre_hook.rst | 11 --- ...E.Conv_VAE.register_full_backward_hook.rst | 11 --- ...nv_VAE.register_full_backward_pre_hook.rst | 11 --- ...VAE.register_load_state_dict_post_hook.rst | 11 --- ...reduction.VAE.Conv_VAE.register_module.rst | 11 --- ...uction.VAE.Conv_VAE.register_parameter.rst | 11 --- ....Conv_VAE.register_state_dict_pre_hook.rst | 11 --- ...m_reduction.VAE.Conv_VAE.reparametrize.rst | 11 --- ..._reduction.VAE.Conv_VAE.requires_grad_.rst | 11 --- ...peline_vsdi.dim_reduction.VAE.Conv_VAE.rst | 75 ------------------- ...reduction.VAE.Conv_VAE.set_extra_state.rst | 11 --- ...im_reduction.VAE.Conv_VAE.share_memory.rst | 11 --- ....dim_reduction.VAE.Conv_VAE.state_dict.rst | 11 --- ...ine_vsdi.dim_reduction.VAE.Conv_VAE.to.rst | 11 --- ...di.dim_reduction.VAE.Conv_VAE.to_empty.rst | 11 --- ..._vsdi.dim_reduction.VAE.Conv_VAE.train.rst | 11 --- ...di.dim_reduction.VAE.Conv_VAE.training.rst | 11 --- ...e_vsdi.dim_reduction.VAE.Conv_VAE.type.rst | 11 --- ...ne_vsdi.dim_reduction.VAE.Conv_VAE.xpu.rst | 11 --- ...i.dim_reduction.VAE.Conv_VAE.zero_grad.rst | 11 --- ...di.dim_reduction.VAE.create_dataloader.rst | 11 --- ...duction.VAE.find_max_activation_images.rst | 11 --- ...i.dim_reduction.VAE.get_latent_vectors.rst | 11 --- ...im_reduction.VAE.linear_decoding_error.rst | 11 --- ...im_reduction.VAE.linear_decoding_score.rst | 11 --- ...ipeline_vsdi.dim_reduction.VAE.predict.rst | 11 --- .../pipeline_vsdi.dim_reduction.VAE.rst | 45 ----------- ...di.dim_reduction.VAE.shuffle_2D_matrix.rst | 11 --- ...di.dim_reduction.VAE.train_autoencoder.rst | 11 --- ...i.dim_reduction.linear_dim_red.pca_ica.rst | 11 --- ...line_vsdi.dim_reduction.linear_dim_red.rst | 30 -------- ...ing.behavior.compute_and_add_lick_rate.rst | 11 --- ...eprocessing.behavior.compute_lick_rate.rst | 11 --- ...vsdi.preprocessing.behavior.get_trials.rst | 11 --- ...processing.behavior.make_design_matrix.rst | 11 --- .../pipeline_vsdi.preprocessing.behavior.rst | 35 --------- ...i.preprocessing.behavior.store_indices.rst | 11 --- ...ne_vsdi.preprocessing.behavior.subsets.rst | 11 --- ...processing.clustering.cluster_and_plot.rst | 11 --- ...ing.clustering.compute_distance_matrix.rst | 11 --- ...pipeline_vsdi.preprocessing.clustering.rst | 31 -------- ...sdi.preprocessing.utils.clean_outliers.rst | 11 --- ...essing.utils.compute_and_add_lick_rate.rst | 11 --- ....preprocessing.utils.compute_lick_rate.rst | 11 --- ...sdi.preprocessing.utils.crop_to_bounds.rst | 11 --- ...e_vsdi.preprocessing.utils.filter_data.rst | 11 --- ..._vsdi.preprocessing.utils.filter_data2.rst | 11 --- ...ocessing.utils.find_bounding_rectangle.rst | 11 --- ...vsdi.preprocessing.utils.find_outliers.rst | 11 --- ...ne_vsdi.preprocessing.utils.get_trials.rst | 11 --- ...preprocessing.utils.make_design_matrix.rst | 11 --- ...sdi.preprocessing.utils.moving_average.rst | 11 --- ...sdi.preprocessing.utils.normalize_vsdi.rst | 11 --- ...eline_vsdi.preprocessing.utils.pca_ica.rst | 11 --- ...essing.utils.plot_decoding_performance.rst | 11 --- ...peline_vsdi.preprocessing.utils.resize.rst | 11 --- ..._vsdi.preprocessing.utils.resize_video.rst | 11 --- .../pipeline_vsdi.preprocessing.utils.rst | 51 ------------- ...ne_vsdi.preprocessing.utils.split_data.rst | 11 --- ...vsdi.preprocessing.utils.store_indices.rst | 11 --- ...eline_vsdi.preprocessing.utils.subsets.rst | 11 --- ...preprocessing.utils.train_SVM_baseline.rst | 11 --- ...reprocessing.utils.train_SVM_baseline2.rst | 11 --- ...vsdi.preprocessing.utils.train_SVM_day.rst | 11 --- ...ssing.vsdi_preprocessing.check_bimodal.rst | 11 --- ...di_preprocessing.clean_hemodynamic_pca.rst | 11 --- ....vsdi_preprocessing.clean_hemodynamics.rst | 11 --- ...sing.vsdi_preprocessing.clean_outliers.rst | 11 --- ...ssing.vsdi_preprocessing.design_matrix.rst | 11 --- ...ssing.vsdi_preprocessing.find_outliers.rst | 11 --- ...g.vsdi_preprocessing.find_outliers_old.rst | 11 --- ...i.preprocessing.vsdi_preprocessing.glm.rst | 11 --- ...cessing.vsdi_preprocessing.merge_masks.rst | 11 --- ...i.preprocessing.vsdi_preprocessing.pca.rst | 11 --- ...eprocessing.vsdi_preprocessing.pca_ica.rst | 11 --- ...ssing.vsdi_preprocessing.peak_distance.rst | 11 --- ..._vsdi.preprocessing.vsdi_preprocessing.rst | 41 ---------- ...ualization.convert_pvalue_to_asterisks.rst | 11 --- ...zation.vsdi_visualization.create_frame.rst | 11 --- ...ion.vsdi_visualization.fingerprint_gif.rst | 11 --- ...lization.vsdi_visualization.plot_betas.rst | 11 --- ...n.vsdi_visualization.plot_fingerprints.rst | 11 --- ...sualization.plot_timecourse_histograms.rst | 11 --- ...on.vsdi_visualization.plot_timecourses.rst | 11 --- ..._vsdi.visualization.vsdi_visualization.rst | 37 --------- ...n.vsdi_visualization.timecourse_around.rst | 11 --- ....vsdi.loaders.extract_behavioural_data.rst | 11 --- ...ine_vsdi.vsdi.loaders.extract_lfp_data.rst | 11 --- ...ine_vsdi.vsdi.loaders.read_data_fields.rst | 11 --- docs/generated/pipeline_vsdi.vsdi.loaders.rst | 32 -------- ...e_vsdi.vsdi.vsdi.DataLoader.clean_vsdi.rst | 11 --- ...ine_vsdi.vsdi.vsdi.DataLoader.get_data.rst | 11 --- ...ne_vsdi.vsdi.vsdi.DataLoader.load_data.rst | 11 --- .../pipeline_vsdi.vsdi.vsdi.DataLoader.rst | 21 ------ docs/generated/pipeline_vsdi.vsdi.vsdi.rst | 30 -------- .../autosummary/attribute.rst | 0 .../autosummary/base.rst | 0 .../autosummary/class.rst | 0 .../autosummary/member.rst | 0 .../autosummary/method.rst | 0 .../autosummary/minimal_module.rst | 0 .../autosummary/module.rst | 0 docs/pipeline_vsdi.dim_reduction.rst | 1 - docs/pipeline_vsdi.visualization.rst | 12 +-- pipeline_vsdi/dim_reduction/VAE.py | 2 +- 193 files changed, 74 insertions(+), 2372 deletions(-) create mode 100644 docs/_static/custom.css create mode 100644 docs/_templates/breadcrumbs.html delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.T_destination.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.__call__.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.add_module.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.apply.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.backward.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.bfloat16.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.buffers.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.call_super_init.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.children.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.cpu.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.cuda.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.double.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.dump_patches.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.eval.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.extra_repr.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.float.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.forward.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.get_buffer.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.get_extra_state.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.get_parameter.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.get_submodule.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.half.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.ipu.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.load_state_dict.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.modules.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.named_buffers.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.named_children.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.named_modules.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.named_parameters.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.parameters.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_backward_hook.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_buffer.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_forward_hook.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_forward_pre_hook.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_full_backward_hook.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_full_backward_pre_hook.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_load_state_dict_post_hook.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_module.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_parameter.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_state_dict_pre_hook.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.requires_grad_.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.set_extra_state.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.share_memory.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.state_dict.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.to.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.to_empty.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.train.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.training.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.type.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.xpu.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.zero_grad.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.T_destination.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.__call__.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.add_module.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.apply.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.backward.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.bfloat16.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.buffers.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.call_super_init.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.children.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.cpu.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.cuda.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.double.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.dump_patches.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.eval.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.extra_repr.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.float.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.forward.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.get_buffer.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.get_extra_state.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.get_parameter.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.get_submodule.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.half.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.ipu.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.load_state_dict.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.modules.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.named_buffers.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.named_children.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.named_modules.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.named_parameters.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.parameters.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_backward_hook.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_buffer.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_forward_hook.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_forward_pre_hook.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_full_backward_hook.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_full_backward_pre_hook.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_load_state_dict_post_hook.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_module.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_parameter.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_state_dict_pre_hook.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.reparametrize.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.requires_grad_.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.set_extra_state.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.share_memory.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.state_dict.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.to.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.to_empty.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.train.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.training.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.type.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.xpu.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.zero_grad.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.create_dataloader.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.find_max_activation_images.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.get_latent_vectors.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.linear_decoding_error.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.linear_decoding_score.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.predict.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.shuffle_2D_matrix.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.VAE.train_autoencoder.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.linear_dim_red.pca_ica.rst delete mode 100644 docs/generated/pipeline_vsdi.dim_reduction.linear_dim_red.rst delete mode 100644 docs/generated/pipeline_vsdi.preprocessing.behavior.compute_and_add_lick_rate.rst delete mode 100644 docs/generated/pipeline_vsdi.preprocessing.behavior.compute_lick_rate.rst delete mode 100644 docs/generated/pipeline_vsdi.preprocessing.behavior.get_trials.rst delete mode 100644 docs/generated/pipeline_vsdi.preprocessing.behavior.make_design_matrix.rst delete mode 100644 docs/generated/pipeline_vsdi.preprocessing.behavior.rst delete mode 100644 docs/generated/pipeline_vsdi.preprocessing.behavior.store_indices.rst delete mode 100644 docs/generated/pipeline_vsdi.preprocessing.behavior.subsets.rst delete mode 100644 docs/generated/pipeline_vsdi.preprocessing.clustering.cluster_and_plot.rst delete mode 100644 docs/generated/pipeline_vsdi.preprocessing.clustering.compute_distance_matrix.rst delete mode 100644 docs/generated/pipeline_vsdi.preprocessing.clustering.rst delete mode 100644 docs/generated/pipeline_vsdi.preprocessing.utils.clean_outliers.rst delete mode 100644 docs/generated/pipeline_vsdi.preprocessing.utils.compute_and_add_lick_rate.rst delete mode 100644 docs/generated/pipeline_vsdi.preprocessing.utils.compute_lick_rate.rst delete mode 100644 docs/generated/pipeline_vsdi.preprocessing.utils.crop_to_bounds.rst delete mode 100644 docs/generated/pipeline_vsdi.preprocessing.utils.filter_data.rst delete mode 100644 docs/generated/pipeline_vsdi.preprocessing.utils.filter_data2.rst delete mode 100644 docs/generated/pipeline_vsdi.preprocessing.utils.find_bounding_rectangle.rst delete mode 100644 docs/generated/pipeline_vsdi.preprocessing.utils.find_outliers.rst delete mode 100644 docs/generated/pipeline_vsdi.preprocessing.utils.get_trials.rst delete mode 100644 docs/generated/pipeline_vsdi.preprocessing.utils.make_design_matrix.rst delete mode 100644 docs/generated/pipeline_vsdi.preprocessing.utils.moving_average.rst delete mode 100644 docs/generated/pipeline_vsdi.preprocessing.utils.normalize_vsdi.rst delete mode 100644 docs/generated/pipeline_vsdi.preprocessing.utils.pca_ica.rst delete mode 100644 docs/generated/pipeline_vsdi.preprocessing.utils.plot_decoding_performance.rst delete mode 100644 docs/generated/pipeline_vsdi.preprocessing.utils.resize.rst delete mode 100644 docs/generated/pipeline_vsdi.preprocessing.utils.resize_video.rst delete mode 100644 docs/generated/pipeline_vsdi.preprocessing.utils.rst delete mode 100644 docs/generated/pipeline_vsdi.preprocessing.utils.split_data.rst delete mode 100644 docs/generated/pipeline_vsdi.preprocessing.utils.store_indices.rst delete mode 100644 docs/generated/pipeline_vsdi.preprocessing.utils.subsets.rst delete mode 100644 docs/generated/pipeline_vsdi.preprocessing.utils.train_SVM_baseline.rst delete mode 100644 docs/generated/pipeline_vsdi.preprocessing.utils.train_SVM_baseline2.rst delete mode 100644 docs/generated/pipeline_vsdi.preprocessing.utils.train_SVM_day.rst delete mode 100644 docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.check_bimodal.rst delete mode 100644 docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.clean_hemodynamic_pca.rst delete mode 100644 docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.clean_hemodynamics.rst delete mode 100644 docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.clean_outliers.rst delete mode 100644 docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.design_matrix.rst delete mode 100644 docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.find_outliers.rst delete mode 100644 docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.find_outliers_old.rst delete mode 100644 docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.glm.rst delete mode 100644 docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.merge_masks.rst delete mode 100644 docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.pca.rst delete mode 100644 docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.pca_ica.rst delete mode 100644 docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.peak_distance.rst delete mode 100644 docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.rst delete mode 100644 docs/generated/pipeline_vsdi.visualization.vsdi_visualization.convert_pvalue_to_asterisks.rst delete mode 100644 docs/generated/pipeline_vsdi.visualization.vsdi_visualization.create_frame.rst delete mode 100644 docs/generated/pipeline_vsdi.visualization.vsdi_visualization.fingerprint_gif.rst delete mode 100644 docs/generated/pipeline_vsdi.visualization.vsdi_visualization.plot_betas.rst delete mode 100644 docs/generated/pipeline_vsdi.visualization.vsdi_visualization.plot_fingerprints.rst delete mode 100644 docs/generated/pipeline_vsdi.visualization.vsdi_visualization.plot_timecourse_histograms.rst delete mode 100644 docs/generated/pipeline_vsdi.visualization.vsdi_visualization.plot_timecourses.rst delete mode 100644 docs/generated/pipeline_vsdi.visualization.vsdi_visualization.rst delete mode 100644 docs/generated/pipeline_vsdi.visualization.vsdi_visualization.timecourse_around.rst delete mode 100644 docs/generated/pipeline_vsdi.vsdi.loaders.extract_behavioural_data.rst delete mode 100644 docs/generated/pipeline_vsdi.vsdi.loaders.extract_lfp_data.rst delete mode 100644 docs/generated/pipeline_vsdi.vsdi.loaders.read_data_fields.rst delete mode 100644 docs/generated/pipeline_vsdi.vsdi.loaders.rst delete mode 100644 docs/generated/pipeline_vsdi.vsdi.vsdi.DataLoader.clean_vsdi.rst delete mode 100644 docs/generated/pipeline_vsdi.vsdi.vsdi.DataLoader.get_data.rst delete mode 100644 docs/generated/pipeline_vsdi.vsdi.vsdi.DataLoader.load_data.rst delete mode 100644 docs/generated/pipeline_vsdi.vsdi.vsdi.DataLoader.rst delete mode 100644 docs/generated/pipeline_vsdi.vsdi.vsdi.rst rename docs/{_templates => no_templates}/autosummary/attribute.rst (100%) rename docs/{_templates => no_templates}/autosummary/base.rst (100%) rename docs/{_templates => no_templates}/autosummary/class.rst (100%) rename docs/{_templates => no_templates}/autosummary/member.rst (100%) rename docs/{_templates => no_templates}/autosummary/method.rst (100%) rename docs/{_templates => no_templates}/autosummary/minimal_module.rst (100%) rename docs/{_templates => no_templates}/autosummary/module.rst (100%) diff --git a/docs/_static/custom.css b/docs/_static/custom.css new file mode 100644 index 0000000..4b90411 --- /dev/null +++ b/docs/_static/custom.css @@ -0,0 +1,54 @@ +/* Limit size of html logo */ +.wy-side-nav-search > a img.logo { + height: 80px; +} + +/* Hide "On Read the Docs", "On GitHub", and "Search" section from versions menu */ +div.rst-versions > div.rst-other-versions > div.injected > dl:nth-child(2) { + display: none; +} +div.rst-versions > div.rst-other-versions > div.injected > dl:nth-child(3) { + display: none; +} +div.rst-versions > div.rst-other-versions > div.injected > dl:nth-child(4) { + display: none; +} + +/* Sidebar selected style */ +.wy-menu-vertical li.current > a { + background: #ffffff; +} +.wy-menu-vertical li.current > ul { + background: #F0E3DF; +} + +/* Sidebar style */ +.wy-side-nav-search, +.wy-nav-top, +.wy-side-scroll { + background: #202029; +} + +.wy-nav-top, +.wy-side-nav-search a, .wy-side-nav-search a:visited, .wy-side-nav-search a:hover, +.wy-nav-top a, .wy-nav-top a:visited, .wy-nav-top a:hover, +.wy-side-scroll a, .wy-side-scroll a:visited, .wy-side-scroll a:hover { + color: #BE9B89 +} + +.rst-versions a, .rst-versions a:visited, .rst-versions a:hover { + color: #fcfcfc +} + +/* Make main content larger */ +body > div:nth-child(1) > section > div { + max-width: 1200px; +} + +/* Links */ +a, a:visited { + color: black; +} +a:hover { + color: #2980B9; +} \ No newline at end of file diff --git a/docs/_templates/breadcrumbs.html b/docs/_templates/breadcrumbs.html new file mode 100644 index 0000000..339f008 --- /dev/null +++ b/docs/_templates/breadcrumbs.html @@ -0,0 +1,4 @@ +{%- extends "sphinx_rtd_theme/breadcrumbs.html" %} + +{% block breadcrumbs_aside %} +{% endblock %} \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py index 26bf1ee..373b10b 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -18,10 +18,12 @@ # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration -extensions = ['sphinx.ext.autodoc', - 'numpydoc', - 'sphinx.ext.autosummary', - 'sphinx_design'] +# extensions = ['sphinx.ext.autodoc', +# 'numpydoc', +# 'sphinx.ext.autosummary', +# 'sphinx_design'] +extensions = ["sphinx.ext.napoleon", "autodocsumm"] +autodoc_default_options = {"autosummary": True} templates_path = ['_templates'] exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] @@ -31,19 +33,20 @@ # -- Options for HTML output ------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output -# html_theme = 'sphinx_rtd_theme' -html_theme = 'pydata_sphinx_theme' +html_theme = 'sphinx_rtd_theme' +# html_theme = 'pydata_sphinx_theme' +# html_context = {"default_mode": "light"} html_favicon = '_static/favicon/favicon.ico' html_logo = '_static/favicon/favicon.ico' -html_context = {"default_mode": "light"} html_show_sourcelink = False html_static_path = ['_static'] +def setup(app): + app.add_css_file("custom.css") # ----------------------------------------------------------------------------- # Autosummary # ----------------------------------------------------------------------------- - # Make numpydoc to generate plots for example sections -numpydoc_use_plots = True -autosummary_generate = True \ No newline at end of file +# numpydoc_use_plots = True +# autosummary_generate = True \ No newline at end of file diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.T_destination.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.T_destination.rst deleted file mode 100644 index 10fc3c2..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.T_destination.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.T\_destination -========================================================= - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -attribute - -.. autoattribute:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.T_destination - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.__call__.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.__call__.rst deleted file mode 100644 index 1b8e911..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.__call__.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.\_\_call\_\_ -======================================================= - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.__call__ - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.add_module.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.add_module.rst deleted file mode 100644 index 10be954..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.add_module.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.add\_module -====================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.add_module - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.apply.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.apply.rst deleted file mode 100644 index 417d24a..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.apply.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.apply -================================================ - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.apply - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.backward.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.backward.rst deleted file mode 100644 index f697f94..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.backward.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.backward -=================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.backward - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.bfloat16.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.bfloat16.rst deleted file mode 100644 index ed4f01b..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.bfloat16.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.bfloat16 -=================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.bfloat16 - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.buffers.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.buffers.rst deleted file mode 100644 index 01b545d..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.buffers.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.buffers -================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.buffers - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.call_super_init.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.call_super_init.rst deleted file mode 100644 index 343514b..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.call_super_init.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.call\_super\_init -============================================================ - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -attribute - -.. autoattribute:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.call_super_init - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.children.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.children.rst deleted file mode 100644 index 072aca1..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.children.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.children -=================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.children - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.cpu.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.cpu.rst deleted file mode 100644 index ecfd8c9..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.cpu.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.cpu -============================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.cpu - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.cuda.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.cuda.rst deleted file mode 100644 index acdb2fb..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.cuda.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.cuda -=============================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.cuda - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.double.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.double.rst deleted file mode 100644 index 0cff1d7..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.double.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.double -================================================= - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.double - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.dump_patches.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.dump_patches.rst deleted file mode 100644 index cfbac28..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.dump_patches.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.dump\_patches -======================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -attribute - -.. autoattribute:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.dump_patches - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.eval.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.eval.rst deleted file mode 100644 index ab93916..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.eval.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.eval -=============================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.eval - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.extra_repr.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.extra_repr.rst deleted file mode 100644 index 69b768c..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.extra_repr.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.extra\_repr -====================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.extra_repr - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.float.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.float.rst deleted file mode 100644 index 66aa9c3..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.float.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.float -================================================ - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.float - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.forward.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.forward.rst deleted file mode 100644 index 0acd635..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.forward.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.forward -================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.forward - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.get_buffer.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.get_buffer.rst deleted file mode 100644 index 53064e4..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.get_buffer.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.get\_buffer -====================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.get_buffer - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.get_extra_state.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.get_extra_state.rst deleted file mode 100644 index 3b3a1f4..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.get_extra_state.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.get\_extra\_state -============================================================ - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.get_extra_state - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.get_parameter.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.get_parameter.rst deleted file mode 100644 index 546d9dc..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.get_parameter.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.get\_parameter -========================================================= - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.get_parameter - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.get_submodule.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.get_submodule.rst deleted file mode 100644 index 082ebc3..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.get_submodule.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.get\_submodule -========================================================= - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.get_submodule - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.half.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.half.rst deleted file mode 100644 index ff98501..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.half.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.half -=============================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.half - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.ipu.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.ipu.rst deleted file mode 100644 index 925d251..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.ipu.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.ipu -============================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.ipu - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.load_state_dict.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.load_state_dict.rst deleted file mode 100644 index e463bca..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.load_state_dict.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.load\_state\_dict -============================================================ - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.load_state_dict - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.modules.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.modules.rst deleted file mode 100644 index b39e153..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.modules.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.modules -================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.modules - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.named_buffers.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.named_buffers.rst deleted file mode 100644 index 1abbe7f..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.named_buffers.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.named\_buffers -========================================================= - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.named_buffers - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.named_children.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.named_children.rst deleted file mode 100644 index 6c9e2c7..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.named_children.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.named\_children -========================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.named_children - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.named_modules.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.named_modules.rst deleted file mode 100644 index 975dbde..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.named_modules.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.named\_modules -========================================================= - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.named_modules - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.named_parameters.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.named_parameters.rst deleted file mode 100644 index d6fda55..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.named_parameters.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.named\_parameters -============================================================ - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.named_parameters - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.parameters.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.parameters.rst deleted file mode 100644 index 74e23d2..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.parameters.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.parameters -===================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.parameters - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_backward_hook.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_backward_hook.rst deleted file mode 100644 index 06b91fc..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_backward_hook.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.register\_backward\_hook -=================================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.register_backward_hook - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_buffer.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_buffer.rst deleted file mode 100644 index 86d9eec..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_buffer.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.register\_buffer -=========================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.register_buffer - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_forward_hook.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_forward_hook.rst deleted file mode 100644 index 9d8bf7d..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_forward_hook.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.register\_forward\_hook -================================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.register_forward_hook - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_forward_pre_hook.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_forward_pre_hook.rst deleted file mode 100644 index 9345ebb..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_forward_pre_hook.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.register\_forward\_pre\_hook -======================================================================= - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.register_forward_pre_hook - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_full_backward_hook.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_full_backward_hook.rst deleted file mode 100644 index d94770c..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_full_backward_hook.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.register\_full\_backward\_hook -========================================================================= - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.register_full_backward_hook - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_full_backward_pre_hook.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_full_backward_pre_hook.rst deleted file mode 100644 index a8d64f8..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_full_backward_pre_hook.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.register\_full\_backward\_pre\_hook -============================================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.register_full_backward_pre_hook - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_load_state_dict_post_hook.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_load_state_dict_post_hook.rst deleted file mode 100644 index e4f762e..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_load_state_dict_post_hook.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.register\_load\_state\_dict\_post\_hook -================================================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.register_load_state_dict_post_hook - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_module.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_module.rst deleted file mode 100644 index 17c80dd..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_module.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.register\_module -=========================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.register_module - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_parameter.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_parameter.rst deleted file mode 100644 index 1cffd71..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_parameter.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.register\_parameter -============================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.register_parameter - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_state_dict_pre_hook.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_state_dict_pre_hook.rst deleted file mode 100644 index 91ca8a4..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.register_state_dict_pre_hook.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.register\_state\_dict\_pre\_hook -=========================================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.register_state_dict_pre_hook - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.requires_grad_.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.requires_grad_.rst deleted file mode 100644 index 435438e..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.requires_grad_.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.requires\_grad\_ -=========================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.requires_grad_ - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.rst deleted file mode 100644 index 454aef1..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.rst +++ /dev/null @@ -1,74 +0,0 @@ -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE -========================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -.. autoclass:: Conv_AE - - - - .. HACK -- the point here is that we don't want this to appear in the output, but the autosummary should still generate the pages. - .. autosummary:: - :toctree: - - Conv_AE.__call__ - Conv_AE.add_module - Conv_AE.apply - Conv_AE.backward - Conv_AE.bfloat16 - Conv_AE.buffers - Conv_AE.children - Conv_AE.cpu - Conv_AE.cuda - Conv_AE.double - Conv_AE.eval - Conv_AE.extra_repr - Conv_AE.float - Conv_AE.forward - Conv_AE.get_buffer - Conv_AE.get_extra_state - Conv_AE.get_parameter - Conv_AE.get_submodule - Conv_AE.half - Conv_AE.ipu - Conv_AE.load_state_dict - Conv_AE.modules - Conv_AE.named_buffers - Conv_AE.named_children - Conv_AE.named_modules - Conv_AE.named_parameters - Conv_AE.parameters - Conv_AE.register_backward_hook - Conv_AE.register_buffer - Conv_AE.register_forward_hook - Conv_AE.register_forward_pre_hook - Conv_AE.register_full_backward_hook - Conv_AE.register_full_backward_pre_hook - Conv_AE.register_load_state_dict_post_hook - Conv_AE.register_module - Conv_AE.register_parameter - Conv_AE.register_state_dict_pre_hook - Conv_AE.requires_grad_ - Conv_AE.set_extra_state - Conv_AE.share_memory - Conv_AE.state_dict - Conv_AE.to - Conv_AE.to_empty - Conv_AE.train - Conv_AE.type - Conv_AE.xpu - Conv_AE.zero_grad - - - - - - .. HACK -- the point here is that we don't want this to appear in the output, but the autosummary should still generate the pages. - .. autosummary:: - :toctree: - - Conv_AE.T_destination - Conv_AE.call_super_init - Conv_AE.dump_patches - Conv_AE.training - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.set_extra_state.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.set_extra_state.rst deleted file mode 100644 index e4e6cf8..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.set_extra_state.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.set\_extra\_state -============================================================ - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.set_extra_state - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.share_memory.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.share_memory.rst deleted file mode 100644 index d23ff9c..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.share_memory.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.share\_memory -======================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.share_memory - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.state_dict.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.state_dict.rst deleted file mode 100644 index 0509c5e..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.state_dict.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.state\_dict -====================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.state_dict - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.to.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.to.rst deleted file mode 100644 index 3c09b03..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.to.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.to -============================================= - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.to - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.to_empty.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.to_empty.rst deleted file mode 100644 index 3eab20c..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.to_empty.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.to\_empty -==================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.to_empty - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.train.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.train.rst deleted file mode 100644 index c53ce4d..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.train.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.train -================================================ - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.train - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.training.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.training.rst deleted file mode 100644 index 2d822f0..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.training.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.training -=================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -attribute - -.. autoattribute:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.training - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.type.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.type.rst deleted file mode 100644 index 0a37668..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.type.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.type -=============================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.type - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.xpu.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.xpu.rst deleted file mode 100644 index 3360eea..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.xpu.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.xpu -============================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.xpu - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.zero_grad.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.zero_grad.rst deleted file mode 100644 index 417abea..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_AE.zero_grad.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_AE.zero\_grad -===================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_AE.zero_grad - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.T_destination.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.T_destination.rst deleted file mode 100644 index 59e1770..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.T_destination.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.T\_destination -========================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -attribute - -.. autoattribute:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.T_destination - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.__call__.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.__call__.rst deleted file mode 100644 index 93fc1e6..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.__call__.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.\_\_call\_\_ -======================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.__call__ - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.add_module.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.add_module.rst deleted file mode 100644 index 75925d1..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.add_module.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.add\_module -======================================================= - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.add_module - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.apply.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.apply.rst deleted file mode 100644 index 1d986dc..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.apply.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.apply -================================================= - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.apply - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.backward.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.backward.rst deleted file mode 100644 index 599a357..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.backward.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.backward -==================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.backward - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.bfloat16.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.bfloat16.rst deleted file mode 100644 index 74bf063..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.bfloat16.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.bfloat16 -==================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.bfloat16 - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.buffers.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.buffers.rst deleted file mode 100644 index 6a08452..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.buffers.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.buffers -=================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.buffers - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.call_super_init.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.call_super_init.rst deleted file mode 100644 index 6dc09be..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.call_super_init.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.call\_super\_init -============================================================= - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -attribute - -.. autoattribute:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.call_super_init - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.children.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.children.rst deleted file mode 100644 index be49d9c..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.children.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.children -==================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.children - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.cpu.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.cpu.rst deleted file mode 100644 index 48cc945..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.cpu.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.cpu -=============================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.cpu - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.cuda.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.cuda.rst deleted file mode 100644 index b1b50c3..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.cuda.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.cuda -================================================ - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.cuda - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.double.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.double.rst deleted file mode 100644 index 533e932..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.double.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.double -================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.double - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.dump_patches.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.dump_patches.rst deleted file mode 100644 index 955f34d..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.dump_patches.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.dump\_patches -========================================================= - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -attribute - -.. autoattribute:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.dump_patches - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.eval.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.eval.rst deleted file mode 100644 index c582981..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.eval.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.eval -================================================ - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.eval - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.extra_repr.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.extra_repr.rst deleted file mode 100644 index 595df1b..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.extra_repr.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.extra\_repr -======================================================= - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.extra_repr - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.float.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.float.rst deleted file mode 100644 index 7d46c70..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.float.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.float -================================================= - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.float - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.forward.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.forward.rst deleted file mode 100644 index e10dc46..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.forward.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.forward -=================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.forward - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.get_buffer.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.get_buffer.rst deleted file mode 100644 index c8c751f..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.get_buffer.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.get\_buffer -======================================================= - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.get_buffer - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.get_extra_state.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.get_extra_state.rst deleted file mode 100644 index 00f3267..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.get_extra_state.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.get\_extra\_state -============================================================= - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.get_extra_state - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.get_parameter.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.get_parameter.rst deleted file mode 100644 index 93038c0..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.get_parameter.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.get\_parameter -========================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.get_parameter - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.get_submodule.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.get_submodule.rst deleted file mode 100644 index bbf8422..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.get_submodule.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.get\_submodule -========================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.get_submodule - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.half.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.half.rst deleted file mode 100644 index 4d5aaff..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.half.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.half -================================================ - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.half - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.ipu.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.ipu.rst deleted file mode 100644 index ff535bb..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.ipu.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.ipu -=============================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.ipu - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.load_state_dict.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.load_state_dict.rst deleted file mode 100644 index c0440b8..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.load_state_dict.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.load\_state\_dict -============================================================= - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.load_state_dict - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.modules.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.modules.rst deleted file mode 100644 index 2b23564..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.modules.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.modules -=================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.modules - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.named_buffers.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.named_buffers.rst deleted file mode 100644 index b0f2845..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.named_buffers.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.named\_buffers -========================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.named_buffers - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.named_children.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.named_children.rst deleted file mode 100644 index b50b92a..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.named_children.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.named\_children -=========================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.named_children - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.named_modules.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.named_modules.rst deleted file mode 100644 index 2959a8a..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.named_modules.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.named\_modules -========================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.named_modules - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.named_parameters.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.named_parameters.rst deleted file mode 100644 index 2839633..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.named_parameters.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.named\_parameters -============================================================= - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.named_parameters - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.parameters.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.parameters.rst deleted file mode 100644 index 29274dd..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.parameters.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.parameters -====================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.parameters - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_backward_hook.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_backward_hook.rst deleted file mode 100644 index a61bf48..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_backward_hook.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.register\_backward\_hook -==================================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.register_backward_hook - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_buffer.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_buffer.rst deleted file mode 100644 index 48114bd..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_buffer.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.register\_buffer -============================================================ - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.register_buffer - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_forward_hook.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_forward_hook.rst deleted file mode 100644 index 93fd82e..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_forward_hook.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.register\_forward\_hook -=================================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.register_forward_hook - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_forward_pre_hook.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_forward_pre_hook.rst deleted file mode 100644 index 1563962..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_forward_pre_hook.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.register\_forward\_pre\_hook -======================================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.register_forward_pre_hook - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_full_backward_hook.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_full_backward_hook.rst deleted file mode 100644 index 2a387f1..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_full_backward_hook.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.register\_full\_backward\_hook -========================================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.register_full_backward_hook - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_full_backward_pre_hook.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_full_backward_pre_hook.rst deleted file mode 100644 index 79e902a..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_full_backward_pre_hook.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.register\_full\_backward\_pre\_hook -=============================================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.register_full_backward_pre_hook - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_load_state_dict_post_hook.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_load_state_dict_post_hook.rst deleted file mode 100644 index 9df898c..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_load_state_dict_post_hook.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.register\_load\_state\_dict\_post\_hook -=================================================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.register_load_state_dict_post_hook - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_module.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_module.rst deleted file mode 100644 index b1d5d72..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_module.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.register\_module -============================================================ - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.register_module - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_parameter.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_parameter.rst deleted file mode 100644 index 7e5526e..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_parameter.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.register\_parameter -=============================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.register_parameter - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_state_dict_pre_hook.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_state_dict_pre_hook.rst deleted file mode 100644 index e123741..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.register_state_dict_pre_hook.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.register\_state\_dict\_pre\_hook -============================================================================ - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.register_state_dict_pre_hook - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.reparametrize.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.reparametrize.rst deleted file mode 100644 index 88a572b..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.reparametrize.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.reparametrize -========================================================= - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.reparametrize - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.requires_grad_.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.requires_grad_.rst deleted file mode 100644 index 3e3166d..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.requires_grad_.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.requires\_grad\_ -============================================================ - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.requires_grad_ - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.rst deleted file mode 100644 index ddd8b45..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.rst +++ /dev/null @@ -1,75 +0,0 @@ -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE -=========================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -.. autoclass:: Conv_VAE - - - - .. HACK -- the point here is that we don't want this to appear in the output, but the autosummary should still generate the pages. - .. autosummary:: - :toctree: - - Conv_VAE.__call__ - Conv_VAE.add_module - Conv_VAE.apply - Conv_VAE.backward - Conv_VAE.bfloat16 - Conv_VAE.buffers - Conv_VAE.children - Conv_VAE.cpu - Conv_VAE.cuda - Conv_VAE.double - Conv_VAE.eval - Conv_VAE.extra_repr - Conv_VAE.float - Conv_VAE.forward - Conv_VAE.get_buffer - Conv_VAE.get_extra_state - Conv_VAE.get_parameter - Conv_VAE.get_submodule - Conv_VAE.half - Conv_VAE.ipu - Conv_VAE.load_state_dict - Conv_VAE.modules - Conv_VAE.named_buffers - Conv_VAE.named_children - Conv_VAE.named_modules - Conv_VAE.named_parameters - Conv_VAE.parameters - Conv_VAE.register_backward_hook - Conv_VAE.register_buffer - Conv_VAE.register_forward_hook - Conv_VAE.register_forward_pre_hook - Conv_VAE.register_full_backward_hook - Conv_VAE.register_full_backward_pre_hook - Conv_VAE.register_load_state_dict_post_hook - Conv_VAE.register_module - Conv_VAE.register_parameter - Conv_VAE.register_state_dict_pre_hook - Conv_VAE.reparametrize - Conv_VAE.requires_grad_ - Conv_VAE.set_extra_state - Conv_VAE.share_memory - Conv_VAE.state_dict - Conv_VAE.to - Conv_VAE.to_empty - Conv_VAE.train - Conv_VAE.type - Conv_VAE.xpu - Conv_VAE.zero_grad - - - - - - .. HACK -- the point here is that we don't want this to appear in the output, but the autosummary should still generate the pages. - .. autosummary:: - :toctree: - - Conv_VAE.T_destination - Conv_VAE.call_super_init - Conv_VAE.dump_patches - Conv_VAE.training - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.set_extra_state.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.set_extra_state.rst deleted file mode 100644 index 54da3fe..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.set_extra_state.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.set\_extra\_state -============================================================= - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.set_extra_state - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.share_memory.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.share_memory.rst deleted file mode 100644 index 5e2e1eb..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.share_memory.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.share\_memory -========================================================= - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.share_memory - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.state_dict.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.state_dict.rst deleted file mode 100644 index 3b60cf9..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.state_dict.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.state\_dict -======================================================= - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.state_dict - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.to.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.to.rst deleted file mode 100644 index 84e8a5b..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.to.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.to -============================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.to - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.to_empty.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.to_empty.rst deleted file mode 100644 index d6066d6..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.to_empty.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.to\_empty -===================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.to_empty - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.train.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.train.rst deleted file mode 100644 index db40345..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.train.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.train -================================================= - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.train - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.training.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.training.rst deleted file mode 100644 index 8d80109..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.training.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.training -==================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -attribute - -.. autoattribute:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.training - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.type.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.type.rst deleted file mode 100644 index a6b9cb2..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.type.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.type -================================================ - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.type - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.xpu.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.xpu.rst deleted file mode 100644 index ad75874..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.xpu.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.xpu -=============================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.xpu - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.zero_grad.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.zero_grad.rst deleted file mode 100644 index c7b8a17..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.Conv_VAE.zero_grad.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.dim\_reduction.VAE.Conv\_VAE.zero\_grad -====================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - -method - -.. automethod:: pipeline_vsdi::dim_reduction.VAE.Conv_VAE.zero_grad - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.create_dataloader.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.create_dataloader.rst deleted file mode 100644 index 65190ad..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.create_dataloader.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.dim\_reduction.VAE.create\_dataloader -==================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - - - -.. autofunction:: pipeline_vsdi::dim_reduction.VAE.create_dataloader - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.find_max_activation_images.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.find_max_activation_images.rst deleted file mode 100644 index 3c520aa..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.find_max_activation_images.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.dim\_reduction.VAE.find\_max\_activation\_images -=============================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - - - -.. autofunction:: pipeline_vsdi::dim_reduction.VAE.find_max_activation_images - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.get_latent_vectors.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.get_latent_vectors.rst deleted file mode 100644 index a465bcc..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.get_latent_vectors.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.dim\_reduction.VAE.get\_latent\_vectors -====================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - - - -.. autofunction:: pipeline_vsdi::dim_reduction.VAE.get_latent_vectors - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.linear_decoding_error.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.linear_decoding_error.rst deleted file mode 100644 index 77f6d99..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.linear_decoding_error.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.dim\_reduction.VAE.linear\_decoding\_error -========================================================= - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - - - -.. autofunction:: pipeline_vsdi::dim_reduction.VAE.linear_decoding_error - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.linear_decoding_score.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.linear_decoding_score.rst deleted file mode 100644 index 12ca020..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.linear_decoding_score.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.dim\_reduction.VAE.linear\_decoding\_score -========================================================= - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - - - -.. autofunction:: pipeline_vsdi::dim_reduction.VAE.linear_decoding_score - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.predict.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.predict.rst deleted file mode 100644 index 65eaf61..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.predict.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.dim\_reduction.VAE.predict -========================================= - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - - - -.. autofunction:: pipeline_vsdi::dim_reduction.VAE.predict - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.rst deleted file mode 100644 index 55852ec..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.rst +++ /dev/null @@ -1,45 +0,0 @@ -pipeline\_vsdi.dim\_reduction.VAE -================================= - -.. automodule:: pipeline_vsdi.dim_reduction.VAE - - - - - - - - .. rubric:: Functions - - .. autosummary:: - :toctree: - - create_dataloader - find_max_activation_images - get_latent_vectors - linear_decoding_error - linear_decoding_score - predict - shuffle_2D_matrix - train_autoencoder - - - - - - .. rubric:: Classes - - .. autosummary:: - :toctree: - - Conv_AE - Conv_VAE - - - - - - - - - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.shuffle_2D_matrix.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.shuffle_2D_matrix.rst deleted file mode 100644 index 0f4d6b3..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.shuffle_2D_matrix.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.dim\_reduction.VAE.shuffle\_2D\_matrix -===================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - - - -.. autofunction:: pipeline_vsdi::dim_reduction.VAE.shuffle_2D_matrix - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.VAE.train_autoencoder.rst b/docs/generated/pipeline_vsdi.dim_reduction.VAE.train_autoencoder.rst deleted file mode 100644 index 5503325..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.VAE.train_autoencoder.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.dim\_reduction.VAE.train\_autoencoder -==================================================== - -.. currentmodule:: pipeline_vsdi.dim_reduction.VAE - - - -.. autofunction:: pipeline_vsdi::dim_reduction.VAE.train_autoencoder - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.linear_dim_red.pca_ica.rst b/docs/generated/pipeline_vsdi.dim_reduction.linear_dim_red.pca_ica.rst deleted file mode 100644 index f9de2ff..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.linear_dim_red.pca_ica.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.dim\_reduction.linear\_dim\_red.pca\_ica -======================================================= - -.. currentmodule:: pipeline_vsdi.dim_reduction.linear_dim_red - - - -.. autofunction:: pipeline_vsdi::dim_reduction.linear_dim_red.pca_ica - diff --git a/docs/generated/pipeline_vsdi.dim_reduction.linear_dim_red.rst b/docs/generated/pipeline_vsdi.dim_reduction.linear_dim_red.rst deleted file mode 100644 index 9057649..0000000 --- a/docs/generated/pipeline_vsdi.dim_reduction.linear_dim_red.rst +++ /dev/null @@ -1,30 +0,0 @@ -pipeline\_vsdi.dim\_reduction.linear\_dim\_red -============================================== - -.. automodule:: pipeline_vsdi.dim_reduction.linear_dim_red - - - - - - - - .. rubric:: Functions - - .. autosummary:: - :toctree: - - pca_ica - - - - - - - - - - - - - diff --git a/docs/generated/pipeline_vsdi.preprocessing.behavior.compute_and_add_lick_rate.rst b/docs/generated/pipeline_vsdi.preprocessing.behavior.compute_and_add_lick_rate.rst deleted file mode 100644 index 71753d3..0000000 --- a/docs/generated/pipeline_vsdi.preprocessing.behavior.compute_and_add_lick_rate.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.preprocessing.behavior.compute\_and\_add\_lick\_rate -=================================================================== - -.. currentmodule:: pipeline_vsdi.preprocessing.behavior - - - -.. autofunction:: pipeline_vsdi::preprocessing.behavior.compute_and_add_lick_rate - diff --git a/docs/generated/pipeline_vsdi.preprocessing.behavior.compute_lick_rate.rst b/docs/generated/pipeline_vsdi.preprocessing.behavior.compute_lick_rate.rst deleted file mode 100644 index 716f9a6..0000000 --- a/docs/generated/pipeline_vsdi.preprocessing.behavior.compute_lick_rate.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.preprocessing.behavior.compute\_lick\_rate -========================================================= - -.. currentmodule:: pipeline_vsdi.preprocessing.behavior - - - -.. autofunction:: pipeline_vsdi::preprocessing.behavior.compute_lick_rate - diff --git a/docs/generated/pipeline_vsdi.preprocessing.behavior.get_trials.rst b/docs/generated/pipeline_vsdi.preprocessing.behavior.get_trials.rst deleted file mode 100644 index db14ace..0000000 --- a/docs/generated/pipeline_vsdi.preprocessing.behavior.get_trials.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.preprocessing.behavior.get\_trials -================================================= - -.. currentmodule:: pipeline_vsdi.preprocessing.behavior - - - -.. autofunction:: pipeline_vsdi::preprocessing.behavior.get_trials - diff --git a/docs/generated/pipeline_vsdi.preprocessing.behavior.make_design_matrix.rst b/docs/generated/pipeline_vsdi.preprocessing.behavior.make_design_matrix.rst deleted file mode 100644 index c68bc60..0000000 --- a/docs/generated/pipeline_vsdi.preprocessing.behavior.make_design_matrix.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.preprocessing.behavior.make\_design\_matrix -========================================================== - -.. currentmodule:: pipeline_vsdi.preprocessing.behavior - - - -.. autofunction:: pipeline_vsdi::preprocessing.behavior.make_design_matrix - diff --git a/docs/generated/pipeline_vsdi.preprocessing.behavior.rst b/docs/generated/pipeline_vsdi.preprocessing.behavior.rst deleted file mode 100644 index 13f3e45..0000000 --- a/docs/generated/pipeline_vsdi.preprocessing.behavior.rst +++ /dev/null @@ -1,35 +0,0 @@ -pipeline\_vsdi.preprocessing.behavior -===================================== - -.. automodule:: pipeline_vsdi.preprocessing.behavior - - - - - - - - .. rubric:: Functions - - .. autosummary:: - :toctree: - - compute_and_add_lick_rate - compute_lick_rate - get_trials - make_design_matrix - store_indices - subsets - - - - - - - - - - - - - diff --git a/docs/generated/pipeline_vsdi.preprocessing.behavior.store_indices.rst b/docs/generated/pipeline_vsdi.preprocessing.behavior.store_indices.rst deleted file mode 100644 index e5c77b8..0000000 --- a/docs/generated/pipeline_vsdi.preprocessing.behavior.store_indices.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.preprocessing.behavior.store\_indices -==================================================== - -.. currentmodule:: pipeline_vsdi.preprocessing.behavior - - - -.. autofunction:: pipeline_vsdi::preprocessing.behavior.store_indices - diff --git a/docs/generated/pipeline_vsdi.preprocessing.behavior.subsets.rst b/docs/generated/pipeline_vsdi.preprocessing.behavior.subsets.rst deleted file mode 100644 index 33a9ae7..0000000 --- a/docs/generated/pipeline_vsdi.preprocessing.behavior.subsets.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.preprocessing.behavior.subsets -============================================= - -.. currentmodule:: pipeline_vsdi.preprocessing.behavior - - - -.. autofunction:: pipeline_vsdi::preprocessing.behavior.subsets - diff --git a/docs/generated/pipeline_vsdi.preprocessing.clustering.cluster_and_plot.rst b/docs/generated/pipeline_vsdi.preprocessing.clustering.cluster_and_plot.rst deleted file mode 100644 index 94b6c84..0000000 --- a/docs/generated/pipeline_vsdi.preprocessing.clustering.cluster_and_plot.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.preprocessing.clustering.cluster\_and\_plot -========================================================== - -.. currentmodule:: pipeline_vsdi.preprocessing.clustering - - - -.. autofunction:: pipeline_vsdi::preprocessing.clustering.cluster_and_plot - diff --git a/docs/generated/pipeline_vsdi.preprocessing.clustering.compute_distance_matrix.rst b/docs/generated/pipeline_vsdi.preprocessing.clustering.compute_distance_matrix.rst deleted file mode 100644 index d285cb5..0000000 --- a/docs/generated/pipeline_vsdi.preprocessing.clustering.compute_distance_matrix.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.preprocessing.clustering.compute\_distance\_matrix -================================================================= - -.. currentmodule:: pipeline_vsdi.preprocessing.clustering - - - -.. autofunction:: pipeline_vsdi::preprocessing.clustering.compute_distance_matrix - diff --git a/docs/generated/pipeline_vsdi.preprocessing.clustering.rst b/docs/generated/pipeline_vsdi.preprocessing.clustering.rst deleted file mode 100644 index c2215e7..0000000 --- a/docs/generated/pipeline_vsdi.preprocessing.clustering.rst +++ /dev/null @@ -1,31 +0,0 @@ -pipeline\_vsdi.preprocessing.clustering -======================================= - -.. automodule:: pipeline_vsdi.preprocessing.clustering - - - - - - - - .. rubric:: Functions - - .. autosummary:: - :toctree: - - cluster_and_plot - compute_distance_matrix - - - - - - - - - - - - - diff --git a/docs/generated/pipeline_vsdi.preprocessing.utils.clean_outliers.rst b/docs/generated/pipeline_vsdi.preprocessing.utils.clean_outliers.rst deleted file mode 100644 index e22bc0d..0000000 --- a/docs/generated/pipeline_vsdi.preprocessing.utils.clean_outliers.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.preprocessing.utils.clean\_outliers -================================================== - -.. currentmodule:: pipeline_vsdi.preprocessing.utils - - - -.. autofunction:: pipeline_vsdi::preprocessing.utils.clean_outliers - diff --git a/docs/generated/pipeline_vsdi.preprocessing.utils.compute_and_add_lick_rate.rst b/docs/generated/pipeline_vsdi.preprocessing.utils.compute_and_add_lick_rate.rst deleted file mode 100644 index 17979db..0000000 --- a/docs/generated/pipeline_vsdi.preprocessing.utils.compute_and_add_lick_rate.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.preprocessing.utils.compute\_and\_add\_lick\_rate -================================================================ - -.. currentmodule:: pipeline_vsdi.preprocessing.utils - - - -.. autofunction:: pipeline_vsdi::preprocessing.utils.compute_and_add_lick_rate - diff --git a/docs/generated/pipeline_vsdi.preprocessing.utils.compute_lick_rate.rst b/docs/generated/pipeline_vsdi.preprocessing.utils.compute_lick_rate.rst deleted file mode 100644 index 64c38d6..0000000 --- a/docs/generated/pipeline_vsdi.preprocessing.utils.compute_lick_rate.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.preprocessing.utils.compute\_lick\_rate -====================================================== - -.. currentmodule:: pipeline_vsdi.preprocessing.utils - - - -.. autofunction:: pipeline_vsdi::preprocessing.utils.compute_lick_rate - diff --git a/docs/generated/pipeline_vsdi.preprocessing.utils.crop_to_bounds.rst b/docs/generated/pipeline_vsdi.preprocessing.utils.crop_to_bounds.rst deleted file mode 100644 index a2e2251..0000000 --- a/docs/generated/pipeline_vsdi.preprocessing.utils.crop_to_bounds.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.preprocessing.utils.crop\_to\_bounds -=================================================== - -.. currentmodule:: pipeline_vsdi.preprocessing.utils - - - -.. autofunction:: pipeline_vsdi::preprocessing.utils.crop_to_bounds - diff --git a/docs/generated/pipeline_vsdi.preprocessing.utils.filter_data.rst b/docs/generated/pipeline_vsdi.preprocessing.utils.filter_data.rst deleted file mode 100644 index c76cd9e..0000000 --- a/docs/generated/pipeline_vsdi.preprocessing.utils.filter_data.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.preprocessing.utils.filter\_data -=============================================== - -.. currentmodule:: pipeline_vsdi.preprocessing.utils - - - -.. autofunction:: pipeline_vsdi::preprocessing.utils.filter_data - diff --git a/docs/generated/pipeline_vsdi.preprocessing.utils.filter_data2.rst b/docs/generated/pipeline_vsdi.preprocessing.utils.filter_data2.rst deleted file mode 100644 index 79418eb..0000000 --- a/docs/generated/pipeline_vsdi.preprocessing.utils.filter_data2.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.preprocessing.utils.filter\_data2 -================================================ - -.. currentmodule:: pipeline_vsdi.preprocessing.utils - - - -.. autofunction:: pipeline_vsdi::preprocessing.utils.filter_data2 - diff --git a/docs/generated/pipeline_vsdi.preprocessing.utils.find_bounding_rectangle.rst b/docs/generated/pipeline_vsdi.preprocessing.utils.find_bounding_rectangle.rst deleted file mode 100644 index 032ae2f..0000000 --- a/docs/generated/pipeline_vsdi.preprocessing.utils.find_bounding_rectangle.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.preprocessing.utils.find\_bounding\_rectangle -============================================================ - -.. currentmodule:: pipeline_vsdi.preprocessing.utils - - - -.. autofunction:: pipeline_vsdi::preprocessing.utils.find_bounding_rectangle - diff --git a/docs/generated/pipeline_vsdi.preprocessing.utils.find_outliers.rst b/docs/generated/pipeline_vsdi.preprocessing.utils.find_outliers.rst deleted file mode 100644 index ac1e395..0000000 --- a/docs/generated/pipeline_vsdi.preprocessing.utils.find_outliers.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.preprocessing.utils.find\_outliers -================================================= - -.. currentmodule:: pipeline_vsdi.preprocessing.utils - - - -.. autofunction:: pipeline_vsdi::preprocessing.utils.find_outliers - diff --git a/docs/generated/pipeline_vsdi.preprocessing.utils.get_trials.rst b/docs/generated/pipeline_vsdi.preprocessing.utils.get_trials.rst deleted file mode 100644 index 4969458..0000000 --- a/docs/generated/pipeline_vsdi.preprocessing.utils.get_trials.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.preprocessing.utils.get\_trials -============================================== - -.. currentmodule:: pipeline_vsdi.preprocessing.utils - - - -.. autofunction:: pipeline_vsdi::preprocessing.utils.get_trials - diff --git a/docs/generated/pipeline_vsdi.preprocessing.utils.make_design_matrix.rst b/docs/generated/pipeline_vsdi.preprocessing.utils.make_design_matrix.rst deleted file mode 100644 index 850e13e..0000000 --- a/docs/generated/pipeline_vsdi.preprocessing.utils.make_design_matrix.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.preprocessing.utils.make\_design\_matrix -======================================================= - -.. currentmodule:: pipeline_vsdi.preprocessing.utils - - - -.. autofunction:: pipeline_vsdi::preprocessing.utils.make_design_matrix - diff --git a/docs/generated/pipeline_vsdi.preprocessing.utils.moving_average.rst b/docs/generated/pipeline_vsdi.preprocessing.utils.moving_average.rst deleted file mode 100644 index b8fe2fb..0000000 --- a/docs/generated/pipeline_vsdi.preprocessing.utils.moving_average.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.preprocessing.utils.moving\_average -================================================== - -.. currentmodule:: pipeline_vsdi.preprocessing.utils - - - -.. autofunction:: pipeline_vsdi::preprocessing.utils.moving_average - diff --git a/docs/generated/pipeline_vsdi.preprocessing.utils.normalize_vsdi.rst b/docs/generated/pipeline_vsdi.preprocessing.utils.normalize_vsdi.rst deleted file mode 100644 index 9885839..0000000 --- a/docs/generated/pipeline_vsdi.preprocessing.utils.normalize_vsdi.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.preprocessing.utils.normalize\_vsdi -================================================== - -.. currentmodule:: pipeline_vsdi.preprocessing.utils - - - -.. autofunction:: pipeline_vsdi::preprocessing.utils.normalize_vsdi - diff --git a/docs/generated/pipeline_vsdi.preprocessing.utils.pca_ica.rst b/docs/generated/pipeline_vsdi.preprocessing.utils.pca_ica.rst deleted file mode 100644 index 13be0de..0000000 --- a/docs/generated/pipeline_vsdi.preprocessing.utils.pca_ica.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.preprocessing.utils.pca\_ica -=========================================== - -.. currentmodule:: pipeline_vsdi.preprocessing.utils - - - -.. autofunction:: pipeline_vsdi::preprocessing.utils.pca_ica - diff --git a/docs/generated/pipeline_vsdi.preprocessing.utils.plot_decoding_performance.rst b/docs/generated/pipeline_vsdi.preprocessing.utils.plot_decoding_performance.rst deleted file mode 100644 index 083f709..0000000 --- a/docs/generated/pipeline_vsdi.preprocessing.utils.plot_decoding_performance.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.preprocessing.utils.plot\_decoding\_performance -============================================================== - -.. currentmodule:: pipeline_vsdi.preprocessing.utils - - - -.. autofunction:: pipeline_vsdi::preprocessing.utils.plot_decoding_performance - diff --git a/docs/generated/pipeline_vsdi.preprocessing.utils.resize.rst b/docs/generated/pipeline_vsdi.preprocessing.utils.resize.rst deleted file mode 100644 index 17d8b32..0000000 --- a/docs/generated/pipeline_vsdi.preprocessing.utils.resize.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.preprocessing.utils.resize -========================================= - -.. currentmodule:: pipeline_vsdi.preprocessing.utils - - - -.. autofunction:: pipeline_vsdi::preprocessing.utils.resize - diff --git a/docs/generated/pipeline_vsdi.preprocessing.utils.resize_video.rst b/docs/generated/pipeline_vsdi.preprocessing.utils.resize_video.rst deleted file mode 100644 index 10b6f91..0000000 --- a/docs/generated/pipeline_vsdi.preprocessing.utils.resize_video.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.preprocessing.utils.resize\_video -================================================ - -.. currentmodule:: pipeline_vsdi.preprocessing.utils - - - -.. autofunction:: pipeline_vsdi::preprocessing.utils.resize_video - diff --git a/docs/generated/pipeline_vsdi.preprocessing.utils.rst b/docs/generated/pipeline_vsdi.preprocessing.utils.rst deleted file mode 100644 index 8fd7c8a..0000000 --- a/docs/generated/pipeline_vsdi.preprocessing.utils.rst +++ /dev/null @@ -1,51 +0,0 @@ -pipeline\_vsdi.preprocessing.utils -================================== - -.. automodule:: pipeline_vsdi.preprocessing.utils - - - - - - - - .. rubric:: Functions - - .. autosummary:: - :toctree: - - clean_outliers - compute_and_add_lick_rate - compute_lick_rate - crop_to_bounds - filter_data - filter_data2 - find_bounding_rectangle - find_outliers - get_trials - make_design_matrix - moving_average - normalize_vsdi - pca_ica - plot_decoding_performance - resize - resize_video - split_data - store_indices - subsets - train_SVM_baseline - train_SVM_baseline2 - train_SVM_day - - - - - - - - - - - - - diff --git a/docs/generated/pipeline_vsdi.preprocessing.utils.split_data.rst b/docs/generated/pipeline_vsdi.preprocessing.utils.split_data.rst deleted file mode 100644 index f3197ab..0000000 --- a/docs/generated/pipeline_vsdi.preprocessing.utils.split_data.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.preprocessing.utils.split\_data -============================================== - -.. currentmodule:: pipeline_vsdi.preprocessing.utils - - - -.. autofunction:: pipeline_vsdi::preprocessing.utils.split_data - diff --git a/docs/generated/pipeline_vsdi.preprocessing.utils.store_indices.rst b/docs/generated/pipeline_vsdi.preprocessing.utils.store_indices.rst deleted file mode 100644 index b92a829..0000000 --- a/docs/generated/pipeline_vsdi.preprocessing.utils.store_indices.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.preprocessing.utils.store\_indices -================================================= - -.. currentmodule:: pipeline_vsdi.preprocessing.utils - - - -.. autofunction:: pipeline_vsdi::preprocessing.utils.store_indices - diff --git a/docs/generated/pipeline_vsdi.preprocessing.utils.subsets.rst b/docs/generated/pipeline_vsdi.preprocessing.utils.subsets.rst deleted file mode 100644 index 39e9f76..0000000 --- a/docs/generated/pipeline_vsdi.preprocessing.utils.subsets.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.preprocessing.utils.subsets -========================================== - -.. currentmodule:: pipeline_vsdi.preprocessing.utils - - - -.. autofunction:: pipeline_vsdi::preprocessing.utils.subsets - diff --git a/docs/generated/pipeline_vsdi.preprocessing.utils.train_SVM_baseline.rst b/docs/generated/pipeline_vsdi.preprocessing.utils.train_SVM_baseline.rst deleted file mode 100644 index eab9d07..0000000 --- a/docs/generated/pipeline_vsdi.preprocessing.utils.train_SVM_baseline.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.preprocessing.utils.train\_SVM\_baseline -======================================================= - -.. currentmodule:: pipeline_vsdi.preprocessing.utils - - - -.. autofunction:: pipeline_vsdi::preprocessing.utils.train_SVM_baseline - diff --git a/docs/generated/pipeline_vsdi.preprocessing.utils.train_SVM_baseline2.rst b/docs/generated/pipeline_vsdi.preprocessing.utils.train_SVM_baseline2.rst deleted file mode 100644 index 87744c0..0000000 --- a/docs/generated/pipeline_vsdi.preprocessing.utils.train_SVM_baseline2.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.preprocessing.utils.train\_SVM\_baseline2 -======================================================== - -.. currentmodule:: pipeline_vsdi.preprocessing.utils - - - -.. autofunction:: pipeline_vsdi::preprocessing.utils.train_SVM_baseline2 - diff --git a/docs/generated/pipeline_vsdi.preprocessing.utils.train_SVM_day.rst b/docs/generated/pipeline_vsdi.preprocessing.utils.train_SVM_day.rst deleted file mode 100644 index 06c7bdd..0000000 --- a/docs/generated/pipeline_vsdi.preprocessing.utils.train_SVM_day.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.preprocessing.utils.train\_SVM\_day -================================================== - -.. currentmodule:: pipeline_vsdi.preprocessing.utils - - - -.. autofunction:: pipeline_vsdi::preprocessing.utils.train_SVM_day - diff --git a/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.check_bimodal.rst b/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.check_bimodal.rst deleted file mode 100644 index 573d3a3..0000000 --- a/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.check_bimodal.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.preprocessing.vsdi\_preprocessing.check\_bimodal -=============================================================== - -.. currentmodule:: pipeline_vsdi.preprocessing.vsdi_preprocessing - - - -.. autofunction:: pipeline_vsdi::preprocessing.vsdi_preprocessing.check_bimodal - diff --git a/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.clean_hemodynamic_pca.rst b/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.clean_hemodynamic_pca.rst deleted file mode 100644 index 2995aa5..0000000 --- a/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.clean_hemodynamic_pca.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.preprocessing.vsdi\_preprocessing.clean\_hemodynamic\_pca -======================================================================== - -.. currentmodule:: pipeline_vsdi.preprocessing.vsdi_preprocessing - - - -.. autofunction:: pipeline_vsdi::preprocessing.vsdi_preprocessing.clean_hemodynamic_pca - diff --git a/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.clean_hemodynamics.rst b/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.clean_hemodynamics.rst deleted file mode 100644 index 21b10d6..0000000 --- a/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.clean_hemodynamics.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.preprocessing.vsdi\_preprocessing.clean\_hemodynamics -==================================================================== - -.. currentmodule:: pipeline_vsdi.preprocessing.vsdi_preprocessing - - - -.. autofunction:: pipeline_vsdi::preprocessing.vsdi_preprocessing.clean_hemodynamics - diff --git a/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.clean_outliers.rst b/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.clean_outliers.rst deleted file mode 100644 index 1165729..0000000 --- a/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.clean_outliers.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.preprocessing.vsdi\_preprocessing.clean\_outliers -================================================================ - -.. currentmodule:: pipeline_vsdi.preprocessing.vsdi_preprocessing - - - -.. autofunction:: pipeline_vsdi::preprocessing.vsdi_preprocessing.clean_outliers - diff --git a/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.design_matrix.rst b/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.design_matrix.rst deleted file mode 100644 index 512d8ec..0000000 --- a/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.design_matrix.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.preprocessing.vsdi\_preprocessing.design\_matrix -=============================================================== - -.. currentmodule:: pipeline_vsdi.preprocessing.vsdi_preprocessing - - - -.. autofunction:: pipeline_vsdi::preprocessing.vsdi_preprocessing.design_matrix - diff --git a/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.find_outliers.rst b/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.find_outliers.rst deleted file mode 100644 index 0f2f303..0000000 --- a/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.find_outliers.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.preprocessing.vsdi\_preprocessing.find\_outliers -=============================================================== - -.. currentmodule:: pipeline_vsdi.preprocessing.vsdi_preprocessing - - - -.. autofunction:: pipeline_vsdi::preprocessing.vsdi_preprocessing.find_outliers - diff --git a/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.find_outliers_old.rst b/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.find_outliers_old.rst deleted file mode 100644 index e7ba18a..0000000 --- a/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.find_outliers_old.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.preprocessing.vsdi\_preprocessing.find\_outliers\_old -==================================================================== - -.. currentmodule:: pipeline_vsdi.preprocessing.vsdi_preprocessing - - - -.. autofunction:: pipeline_vsdi::preprocessing.vsdi_preprocessing.find_outliers_old - diff --git a/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.glm.rst b/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.glm.rst deleted file mode 100644 index 25e10ef..0000000 --- a/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.glm.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.preprocessing.vsdi\_preprocessing.glm -==================================================== - -.. currentmodule:: pipeline_vsdi.preprocessing.vsdi_preprocessing - - - -.. autofunction:: pipeline_vsdi::preprocessing.vsdi_preprocessing.glm - diff --git a/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.merge_masks.rst b/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.merge_masks.rst deleted file mode 100644 index 3a8c8e0..0000000 --- a/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.merge_masks.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.preprocessing.vsdi\_preprocessing.merge\_masks -============================================================= - -.. currentmodule:: pipeline_vsdi.preprocessing.vsdi_preprocessing - - - -.. autofunction:: pipeline_vsdi::preprocessing.vsdi_preprocessing.merge_masks - diff --git a/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.pca.rst b/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.pca.rst deleted file mode 100644 index 831a605..0000000 --- a/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.pca.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.preprocessing.vsdi\_preprocessing.pca -==================================================== - -.. currentmodule:: pipeline_vsdi.preprocessing.vsdi_preprocessing - - - -.. autofunction:: pipeline_vsdi::preprocessing.vsdi_preprocessing.pca - diff --git a/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.pca_ica.rst b/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.pca_ica.rst deleted file mode 100644 index 19c863d..0000000 --- a/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.pca_ica.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.preprocessing.vsdi\_preprocessing.pca\_ica -========================================================= - -.. currentmodule:: pipeline_vsdi.preprocessing.vsdi_preprocessing - - - -.. autofunction:: pipeline_vsdi::preprocessing.vsdi_preprocessing.pca_ica - diff --git a/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.peak_distance.rst b/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.peak_distance.rst deleted file mode 100644 index ad1eaf3..0000000 --- a/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.peak_distance.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.preprocessing.vsdi\_preprocessing.peak\_distance -=============================================================== - -.. currentmodule:: pipeline_vsdi.preprocessing.vsdi_preprocessing - - - -.. autofunction:: pipeline_vsdi::preprocessing.vsdi_preprocessing.peak_distance - diff --git a/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.rst b/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.rst deleted file mode 100644 index a0e3bf1..0000000 --- a/docs/generated/pipeline_vsdi.preprocessing.vsdi_preprocessing.rst +++ /dev/null @@ -1,41 +0,0 @@ -pipeline\_vsdi.preprocessing.vsdi\_preprocessing -================================================ - -.. automodule:: pipeline_vsdi.preprocessing.vsdi_preprocessing - - - - - - - - .. rubric:: Functions - - .. autosummary:: - :toctree: - - check_bimodal - clean_hemodynamic_pca - clean_hemodynamics - clean_outliers - design_matrix - find_outliers - find_outliers_old - glm - merge_masks - pca - pca_ica - peak_distance - - - - - - - - - - - - - diff --git a/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.convert_pvalue_to_asterisks.rst b/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.convert_pvalue_to_asterisks.rst deleted file mode 100644 index 6c5e535..0000000 --- a/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.convert_pvalue_to_asterisks.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.visualization.vsdi\_visualization.convert\_pvalue\_to\_asterisks -=============================================================================== - -.. currentmodule:: pipeline_vsdi.visualization.vsdi_visualization - - - -.. autofunction:: pipeline_vsdi::visualization.vsdi_visualization.convert_pvalue_to_asterisks - diff --git a/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.create_frame.rst b/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.create_frame.rst deleted file mode 100644 index 9426a5b..0000000 --- a/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.create_frame.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.visualization.vsdi\_visualization.create\_frame -============================================================== - -.. currentmodule:: pipeline_vsdi.visualization.vsdi_visualization - - - -.. autofunction:: pipeline_vsdi::visualization.vsdi_visualization.create_frame - diff --git a/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.fingerprint_gif.rst b/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.fingerprint_gif.rst deleted file mode 100644 index 7f5876c..0000000 --- a/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.fingerprint_gif.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.visualization.vsdi\_visualization.fingerprint\_gif -================================================================= - -.. currentmodule:: pipeline_vsdi.visualization.vsdi_visualization - - - -.. autofunction:: pipeline_vsdi::visualization.vsdi_visualization.fingerprint_gif - diff --git a/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.plot_betas.rst b/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.plot_betas.rst deleted file mode 100644 index e7f5bef..0000000 --- a/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.plot_betas.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.visualization.vsdi\_visualization.plot\_betas -============================================================ - -.. currentmodule:: pipeline_vsdi.visualization.vsdi_visualization - - - -.. autofunction:: pipeline_vsdi::visualization.vsdi_visualization.plot_betas - diff --git a/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.plot_fingerprints.rst b/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.plot_fingerprints.rst deleted file mode 100644 index 272f7da..0000000 --- a/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.plot_fingerprints.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.visualization.vsdi\_visualization.plot\_fingerprints -=================================================================== - -.. currentmodule:: pipeline_vsdi.visualization.vsdi_visualization - - - -.. autofunction:: pipeline_vsdi::visualization.vsdi_visualization.plot_fingerprints - diff --git a/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.plot_timecourse_histograms.rst b/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.plot_timecourse_histograms.rst deleted file mode 100644 index 23ab357..0000000 --- a/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.plot_timecourse_histograms.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.visualization.vsdi\_visualization.plot\_timecourse\_histograms -============================================================================= - -.. currentmodule:: pipeline_vsdi.visualization.vsdi_visualization - - - -.. autofunction:: pipeline_vsdi::visualization.vsdi_visualization.plot_timecourse_histograms - diff --git a/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.plot_timecourses.rst b/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.plot_timecourses.rst deleted file mode 100644 index 032de86..0000000 --- a/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.plot_timecourses.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.visualization.vsdi\_visualization.plot\_timecourses -================================================================== - -.. currentmodule:: pipeline_vsdi.visualization.vsdi_visualization - - - -.. autofunction:: pipeline_vsdi::visualization.vsdi_visualization.plot_timecourses - diff --git a/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.rst b/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.rst deleted file mode 100644 index 2d88a0e..0000000 --- a/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.rst +++ /dev/null @@ -1,37 +0,0 @@ -pipeline\_vsdi.visualization.vsdi\_visualization -================================================ - -.. automodule:: pipeline_vsdi.visualization.vsdi_visualization - - - - - - - - .. rubric:: Functions - - .. autosummary:: - :toctree: - - convert_pvalue_to_asterisks - create_frame - fingerprint_gif - plot_betas - plot_fingerprints - plot_timecourse_histograms - plot_timecourses - timecourse_around - - - - - - - - - - - - - diff --git a/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.timecourse_around.rst b/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.timecourse_around.rst deleted file mode 100644 index 3ba1894..0000000 --- a/docs/generated/pipeline_vsdi.visualization.vsdi_visualization.timecourse_around.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.visualization.vsdi\_visualization.timecourse\_around -=================================================================== - -.. currentmodule:: pipeline_vsdi.visualization.vsdi_visualization - - - -.. autofunction:: pipeline_vsdi::visualization.vsdi_visualization.timecourse_around - diff --git a/docs/generated/pipeline_vsdi.vsdi.loaders.extract_behavioural_data.rst b/docs/generated/pipeline_vsdi.vsdi.loaders.extract_behavioural_data.rst deleted file mode 100644 index d8bba66..0000000 --- a/docs/generated/pipeline_vsdi.vsdi.loaders.extract_behavioural_data.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.vsdi.loaders.extract\_behavioural\_data -====================================================== - -.. currentmodule:: pipeline_vsdi.vsdi.loaders - - - -.. autofunction:: pipeline_vsdi::vsdi.loaders.extract_behavioural_data - diff --git a/docs/generated/pipeline_vsdi.vsdi.loaders.extract_lfp_data.rst b/docs/generated/pipeline_vsdi.vsdi.loaders.extract_lfp_data.rst deleted file mode 100644 index 1c304c2..0000000 --- a/docs/generated/pipeline_vsdi.vsdi.loaders.extract_lfp_data.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.vsdi.loaders.extract\_lfp\_data -============================================== - -.. currentmodule:: pipeline_vsdi.vsdi.loaders - - - -.. autofunction:: pipeline_vsdi::vsdi.loaders.extract_lfp_data - diff --git a/docs/generated/pipeline_vsdi.vsdi.loaders.read_data_fields.rst b/docs/generated/pipeline_vsdi.vsdi.loaders.read_data_fields.rst deleted file mode 100644 index b89322e..0000000 --- a/docs/generated/pipeline_vsdi.vsdi.loaders.read_data_fields.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -pipeline\_vsdi.vsdi.loaders.read\_data\_fields -============================================== - -.. currentmodule:: pipeline_vsdi.vsdi.loaders - - - -.. autofunction:: pipeline_vsdi::vsdi.loaders.read_data_fields - diff --git a/docs/generated/pipeline_vsdi.vsdi.loaders.rst b/docs/generated/pipeline_vsdi.vsdi.loaders.rst deleted file mode 100644 index 9ae204f..0000000 --- a/docs/generated/pipeline_vsdi.vsdi.loaders.rst +++ /dev/null @@ -1,32 +0,0 @@ -pipeline\_vsdi.vsdi.loaders -=========================== - -.. automodule:: pipeline_vsdi.vsdi.loaders - - - - - - - - .. rubric:: Functions - - .. autosummary:: - :toctree: - - extract_behavioural_data - extract_lfp_data - read_data_fields - - - - - - - - - - - - - diff --git a/docs/generated/pipeline_vsdi.vsdi.vsdi.DataLoader.clean_vsdi.rst b/docs/generated/pipeline_vsdi.vsdi.vsdi.DataLoader.clean_vsdi.rst deleted file mode 100644 index fe55137..0000000 --- a/docs/generated/pipeline_vsdi.vsdi.vsdi.DataLoader.clean_vsdi.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.vsdi.vsdi.DataLoader.clean\_vsdi -=============================================== - -.. currentmodule:: pipeline_vsdi.vsdi.vsdi - -method - -.. automethod:: pipeline_vsdi::vsdi.vsdi.DataLoader.clean_vsdi - diff --git a/docs/generated/pipeline_vsdi.vsdi.vsdi.DataLoader.get_data.rst b/docs/generated/pipeline_vsdi.vsdi.vsdi.DataLoader.get_data.rst deleted file mode 100644 index 99a4ca6..0000000 --- a/docs/generated/pipeline_vsdi.vsdi.vsdi.DataLoader.get_data.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.vsdi.vsdi.DataLoader.get\_data -============================================= - -.. currentmodule:: pipeline_vsdi.vsdi.vsdi - -method - -.. automethod:: pipeline_vsdi::vsdi.vsdi.DataLoader.get_data - diff --git a/docs/generated/pipeline_vsdi.vsdi.vsdi.DataLoader.load_data.rst b/docs/generated/pipeline_vsdi.vsdi.vsdi.DataLoader.load_data.rst deleted file mode 100644 index 407ac3e..0000000 --- a/docs/generated/pipeline_vsdi.vsdi.vsdi.DataLoader.load_data.rst +++ /dev/null @@ -1,11 +0,0 @@ -:orphan: - -pipeline\_vsdi.vsdi.vsdi.DataLoader.load\_data -============================================== - -.. currentmodule:: pipeline_vsdi.vsdi.vsdi - -method - -.. automethod:: pipeline_vsdi::vsdi.vsdi.DataLoader.load_data - diff --git a/docs/generated/pipeline_vsdi.vsdi.vsdi.DataLoader.rst b/docs/generated/pipeline_vsdi.vsdi.vsdi.DataLoader.rst deleted file mode 100644 index 8f84012..0000000 --- a/docs/generated/pipeline_vsdi.vsdi.vsdi.DataLoader.rst +++ /dev/null @@ -1,21 +0,0 @@ -pipeline\_vsdi.vsdi.vsdi.DataLoader -=================================== - -.. currentmodule:: pipeline_vsdi.vsdi.vsdi - -.. autoclass:: DataLoader - - - - .. HACK -- the point here is that we don't want this to appear in the output, but the autosummary should still generate the pages. - .. autosummary:: - :toctree: - - DataLoader.clean_vsdi - DataLoader.get_data - DataLoader.load_data - - - - - diff --git a/docs/generated/pipeline_vsdi.vsdi.vsdi.rst b/docs/generated/pipeline_vsdi.vsdi.vsdi.rst deleted file mode 100644 index b6f1955..0000000 --- a/docs/generated/pipeline_vsdi.vsdi.vsdi.rst +++ /dev/null @@ -1,30 +0,0 @@ -pipeline\_vsdi.vsdi.vsdi -======================== - -.. automodule:: pipeline_vsdi.vsdi.vsdi - - - - - - - - - - - - .. rubric:: Classes - - .. autosummary:: - :toctree: - - DataLoader - - - - - - - - - diff --git a/docs/_templates/autosummary/attribute.rst b/docs/no_templates/autosummary/attribute.rst similarity index 100% rename from docs/_templates/autosummary/attribute.rst rename to docs/no_templates/autosummary/attribute.rst diff --git a/docs/_templates/autosummary/base.rst b/docs/no_templates/autosummary/base.rst similarity index 100% rename from docs/_templates/autosummary/base.rst rename to docs/no_templates/autosummary/base.rst diff --git a/docs/_templates/autosummary/class.rst b/docs/no_templates/autosummary/class.rst similarity index 100% rename from docs/_templates/autosummary/class.rst rename to docs/no_templates/autosummary/class.rst diff --git a/docs/_templates/autosummary/member.rst b/docs/no_templates/autosummary/member.rst similarity index 100% rename from docs/_templates/autosummary/member.rst rename to docs/no_templates/autosummary/member.rst diff --git a/docs/_templates/autosummary/method.rst b/docs/no_templates/autosummary/method.rst similarity index 100% rename from docs/_templates/autosummary/method.rst rename to docs/no_templates/autosummary/method.rst diff --git a/docs/_templates/autosummary/minimal_module.rst b/docs/no_templates/autosummary/minimal_module.rst similarity index 100% rename from docs/_templates/autosummary/minimal_module.rst rename to docs/no_templates/autosummary/minimal_module.rst diff --git a/docs/_templates/autosummary/module.rst b/docs/no_templates/autosummary/module.rst similarity index 100% rename from docs/_templates/autosummary/module.rst rename to docs/no_templates/autosummary/module.rst diff --git a/docs/pipeline_vsdi.dim_reduction.rst b/docs/pipeline_vsdi.dim_reduction.rst index f26f578..078e56c 100644 --- a/docs/pipeline_vsdi.dim_reduction.rst +++ b/docs/pipeline_vsdi.dim_reduction.rst @@ -13,7 +13,6 @@ Encompasses both linear and nonlinear dimensionality reduction techniques: .. autosummary:: :toctree: generated/ - :recursive: pipeline_vsdi.dim_reduction.VAE pipeline_vsdi.dim_reduction.linear_dim_red diff --git a/docs/pipeline_vsdi.visualization.rst b/docs/pipeline_vsdi.visualization.rst index b9c9ae3..64c8da9 100644 --- a/docs/pipeline_vsdi.visualization.rst +++ b/docs/pipeline_vsdi.visualization.rst @@ -1,13 +1,5 @@ Visualization ============= -.. automodule:: pipeline_vsdi.visualization - -.. rubric:: Modules - -.. autosummary:: - :toctree: generated/ - :recursive: - - pipeline_vsdi.visualization.vsdi_visualization - +.. automodule:: pipeline_vsdi.visualization.vsdi_visualization + :members: \ No newline at end of file diff --git a/pipeline_vsdi/dim_reduction/VAE.py b/pipeline_vsdi/dim_reduction/VAE.py index 4b25764..eb4a310 100644 --- a/pipeline_vsdi/dim_reduction/VAE.py +++ b/pipeline_vsdi/dim_reduction/VAE.py @@ -374,4 +374,4 @@ def linear_decoding_error(embeddings, features, norm=1): dist = np.sqrt(np.sum((pred - features)**2, axis=1)) mean_dist = np.mean(dist) / norm - return mean_dist \ No newline at end of file + return mean_dist From 4d4bfa891cd79a94ea5d3400c5aea5bc36411147 Mon Sep 17 00:00:00 2001 From: dabadav Date: Wed, 14 Jun 2023 10:32:03 +0200 Subject: [PATCH 38/67] More Docs --- docs/_static/custom.css | 2 +- docs/components/dim_reduction.rst | 14 ++++ .../dim_reduction/dim_reduction.linear.rst | 5 ++ .../dim_reduction.non_linear.rst | 5 ++ docs/components/preprocessing.rst | 6 ++ .../visualization.rst} | 0 docs/components/vsdi.rst | 8 +++ docs/components/vsdi/vsdi.loaders.rst | 6 ++ docs/components/vsdi/vsdi.vsdi.rst | 6 ++ docs/deploy/deployment.rst | 64 +++++++++++++++++++ docs/index.rst | 16 +++-- docs/no_templates/autosummary/attribute.rst | 13 ---- docs/no_templates/autosummary/base.rst | 17 ----- docs/no_templates/autosummary/class.rst | 27 -------- docs/no_templates/autosummary/member.rst | 13 ---- docs/no_templates/autosummary/method.rst | 13 ---- .../autosummary/minimal_module.rst | 8 --- docs/no_templates/autosummary/module.rst | 40 ------------ docs/pipeline_vsdi.dim_reduction.rst | 19 ------ docs/pipeline_vsdi.preprocessing.rst | 16 ----- docs/pipeline_vsdi.vsdi.rst | 14 ---- 21 files changed, 127 insertions(+), 185 deletions(-) create mode 100644 docs/components/dim_reduction.rst create mode 100644 docs/components/dim_reduction/dim_reduction.linear.rst create mode 100644 docs/components/dim_reduction/dim_reduction.non_linear.rst create mode 100644 docs/components/preprocessing.rst rename docs/{pipeline_vsdi.visualization.rst => components/visualization.rst} (100%) create mode 100644 docs/components/vsdi.rst create mode 100644 docs/components/vsdi/vsdi.loaders.rst create mode 100644 docs/components/vsdi/vsdi.vsdi.rst create mode 100644 docs/deploy/deployment.rst delete mode 100644 docs/no_templates/autosummary/attribute.rst delete mode 100644 docs/no_templates/autosummary/base.rst delete mode 100644 docs/no_templates/autosummary/class.rst delete mode 100644 docs/no_templates/autosummary/member.rst delete mode 100644 docs/no_templates/autosummary/method.rst delete mode 100644 docs/no_templates/autosummary/minimal_module.rst delete mode 100644 docs/no_templates/autosummary/module.rst delete mode 100644 docs/pipeline_vsdi.dim_reduction.rst delete mode 100644 docs/pipeline_vsdi.preprocessing.rst delete mode 100644 docs/pipeline_vsdi.vsdi.rst diff --git a/docs/_static/custom.css b/docs/_static/custom.css index 4b90411..61fa393 100644 --- a/docs/_static/custom.css +++ b/docs/_static/custom.css @@ -33,7 +33,7 @@ div.rst-versions > div.rst-other-versions > div.injected > dl:nth-child(4) { .wy-side-nav-search a, .wy-side-nav-search a:visited, .wy-side-nav-search a:hover, .wy-nav-top a, .wy-nav-top a:visited, .wy-nav-top a:hover, .wy-side-scroll a, .wy-side-scroll a:visited, .wy-side-scroll a:hover { - color: #BE9B89 + color: #F0F4F4 } .rst-versions a, .rst-versions a:visited, .rst-versions a:hover { diff --git a/docs/components/dim_reduction.rst b/docs/components/dim_reduction.rst new file mode 100644 index 0000000..24d45c6 --- /dev/null +++ b/docs/components/dim_reduction.rst @@ -0,0 +1,14 @@ +Dimensionality Reduction +======================== + +Encompasses both linear and nonlinear dimensionality reduction techniques: + +1. Linear Dimensionality Reduction: This submodule offers functionalities for performing Principal Component Analysis (PCA) and Independent Component Analysis (ICA) on Voltage Sensitive Dye Imaging (VSDI) data. + +2. Nonlinear Dimensionality Reduction: This submodule provides functionalities for training, analyzing, and performing various operations with Convolutional Autoencoders (Conv_AE). + +.. toctree:: + :maxdepth: 1 + + dim_reduction/dim_reduction.linear + dim_reduction/dim_reduction.non_linear \ No newline at end of file diff --git a/docs/components/dim_reduction/dim_reduction.linear.rst b/docs/components/dim_reduction/dim_reduction.linear.rst new file mode 100644 index 0000000..3ddf595 --- /dev/null +++ b/docs/components/dim_reduction/dim_reduction.linear.rst @@ -0,0 +1,5 @@ +Linear Dimensionality Reduction +=============================== + +.. automodule:: pipeline_vsdi.dim_reduction.linear_dim_red + :members: diff --git a/docs/components/dim_reduction/dim_reduction.non_linear.rst b/docs/components/dim_reduction/dim_reduction.non_linear.rst new file mode 100644 index 0000000..bf6855f --- /dev/null +++ b/docs/components/dim_reduction/dim_reduction.non_linear.rst @@ -0,0 +1,5 @@ +Nonlinear Dimensionality Reduction +================================== + +.. automodule:: pipeline_vsdi.dim_reduction.VAE + :members: diff --git a/docs/components/preprocessing.rst b/docs/components/preprocessing.rst new file mode 100644 index 0000000..f625b63 --- /dev/null +++ b/docs/components/preprocessing.rst @@ -0,0 +1,6 @@ +Preprocessing +============= + +.. automodule:: pipeline_vsdi.preprocessing + :members: + diff --git a/docs/pipeline_vsdi.visualization.rst b/docs/components/visualization.rst similarity index 100% rename from docs/pipeline_vsdi.visualization.rst rename to docs/components/visualization.rst diff --git a/docs/components/vsdi.rst b/docs/components/vsdi.rst new file mode 100644 index 0000000..1bf8f0e --- /dev/null +++ b/docs/components/vsdi.rst @@ -0,0 +1,8 @@ +Data Handling +============= + +.. toctree:: + :maxdepth: 1 + + vsdi/vsdi.loaders + vsdi/vsdi.vsdi \ No newline at end of file diff --git a/docs/components/vsdi/vsdi.loaders.rst b/docs/components/vsdi/vsdi.loaders.rst new file mode 100644 index 0000000..7a487e5 --- /dev/null +++ b/docs/components/vsdi/vsdi.loaders.rst @@ -0,0 +1,6 @@ +Loaders +======= + + +.. automodule:: pipeline_vsdi.vsdi.loaders + :members: \ No newline at end of file diff --git a/docs/components/vsdi/vsdi.vsdi.rst b/docs/components/vsdi/vsdi.vsdi.rst new file mode 100644 index 0000000..8722f73 --- /dev/null +++ b/docs/components/vsdi/vsdi.vsdi.rst @@ -0,0 +1,6 @@ +Data Handling +============= + + +.. automodule:: pipeline_vsdi.vsdi.vsdi + :members: \ No newline at end of file diff --git a/docs/deploy/deployment.rst b/docs/deploy/deployment.rst new file mode 100644 index 0000000..ffd9871 --- /dev/null +++ b/docs/deploy/deployment.rst @@ -0,0 +1,64 @@ +*************************************** +Creating Virtual Environment +*************************************** + +During deployment, it is always recommended to create a virtual environment simulating the deployment environment. +Running application on virtual environment helps to check if there are are any missing package or conflicting +package versions. + +.. note:: The following instructions are tested on Windows + +Creating VE using Anaconda +-------------------------- + +This is the recommended way to create and manage your virtual environments. +Virtual environments can be created on conda command line with + +:: + + conda create -n environment_name python=3.6 + +Virtual environment only needs to be created once, to view the full list of virtual environments and their locations + +:: + + conda env list + +The following lines can activate, deactivate and delete the created virtual environment + +:: + + conda activate environment_name + conda deactivate + conda env remove --name environment_name + + +Creating VE using Shell Command +------------------------------- + +Virtual environments can be created on command line with + +:: + + python -m venv environment_name + +The following lines can activate, deactivate and delete the created virtual environment + +:: + + source environment_name/Scripts/activate + deactivate + rm -r environment_name/ + + +Creating VE using Python Code +------------------------------- + +Virtual environments can be created using Python code by + +.. code:: Python + + import venv + venv.create("environment_name") + +Activation, deactivation and deletion of created virtual environment is done via the shell command, same as above. \ No newline at end of file diff --git a/docs/index.rst b/docs/index.rst index 59f47b7..d99dcc2 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -10,8 +10,16 @@ Preprocessing tools for voltage sensitive dye imaging data .. toctree:: :maxdepth: 1 + :caption: Setup Documentation - pipeline_vsdi.preprocessing - pipeline_vsdi.dim_reduction - pipeline_vsdi.visualization - pipeline_vsdi.vsdi \ No newline at end of file + deploy/deployment + +.. toctree:: + :maxdepth: 1 + :caption: Code Documentation + + components/vsdi + components/preprocessing + components/dim_reduction + components/visualization + \ No newline at end of file diff --git a/docs/no_templates/autosummary/attribute.rst b/docs/no_templates/autosummary/attribute.rst deleted file mode 100644 index 17d065e..0000000 --- a/docs/no_templates/autosummary/attribute.rst +++ /dev/null @@ -1,13 +0,0 @@ -:orphan: - -{{ fullname | escape | underline}} - -.. currentmodule:: {{ module }} - -attribute - -.. auto{{ objtype }}:: {{ fullname | replace("pipeline_vsdi.", "pipeline_vsdi::") }} - -{# In the fullname (e.g. `numpy.ma.MaskedArray.methodname`), the module name -is ambiguous. Using a `::` separator (e.g. `numpy::ma.MaskedArray.methodname`) -specifies `numpy` as the module name. #} diff --git a/docs/no_templates/autosummary/base.rst b/docs/no_templates/autosummary/base.rst deleted file mode 100644 index ec7846d..0000000 --- a/docs/no_templates/autosummary/base.rst +++ /dev/null @@ -1,17 +0,0 @@ -{% if objtype == 'property' %} -:orphan: -{% endif %} - -{{ fullname | escape | underline}} - -.. currentmodule:: {{ module }} - -{% if objtype == 'property' %} -property -{% endif %} - -.. auto{{ objtype }}:: {{ fullname | replace("pipeline_vsdi.", "pipeline_vsdi::") }} - -{# In the fullname (e.g. `numpy.ma.MaskedArray.methodname`), the module name -is ambiguous. Using a `::` separator (e.g. `numpy::ma.MaskedArray.methodname`) -specifies `numpy` as the module name. #} diff --git a/docs/no_templates/autosummary/class.rst b/docs/no_templates/autosummary/class.rst deleted file mode 100644 index 64c1b11..0000000 --- a/docs/no_templates/autosummary/class.rst +++ /dev/null @@ -1,27 +0,0 @@ -{% extends "!autosummary/class.rst" %} - -{% block methods %} -{% if methods %} - .. HACK -- the point here is that we don't want this to appear in the output, but the autosummary should still generate the pages. - .. autosummary:: - :toctree: - {% for item in all_methods %} - {%- if not item.startswith('_') or item in ['__call__'] %} - {{ name }}.{{ item }} - {%- endif -%} - {%- endfor %} -{% endif %} -{% endblock %} - -{% block attributes %} -{% if attributes %} - .. HACK -- the point here is that we don't want this to appear in the output, but the autosummary should still generate the pages. - .. autosummary:: - :toctree: - {% for item in all_attributes %} - {%- if not item.startswith('_') %} - {{ name }}.{{ item }} - {%- endif -%} - {%- endfor %} -{% endif %} -{% endblock %} diff --git a/docs/no_templates/autosummary/member.rst b/docs/no_templates/autosummary/member.rst deleted file mode 100644 index c216dc2..0000000 --- a/docs/no_templates/autosummary/member.rst +++ /dev/null @@ -1,13 +0,0 @@ -:orphan: - -{{ fullname | escape | underline}} - -.. currentmodule:: {{ module }} - -member - -.. auto{{ objtype }}:: {{ fullname | replace("pipeline_vsdi.", "pipeline_vsdi::") }} - -{# In the fullname (e.g. `numpy.ma.MaskedArray.methodname`), the module name -is ambiguous. Using a `::` separator (e.g. `numpy::ma.MaskedArray.methodname`) -specifies `numpy` as the module name. #} diff --git a/docs/no_templates/autosummary/method.rst b/docs/no_templates/autosummary/method.rst deleted file mode 100644 index 5e64545..0000000 --- a/docs/no_templates/autosummary/method.rst +++ /dev/null @@ -1,13 +0,0 @@ -:orphan: - -{{ fullname | escape | underline}} - -.. currentmodule:: {{ module }} - -method - -.. auto{{ objtype }}:: {{ fullname | replace("pipeline_vsdi.", "pipeline_vsdi::") }} - -{# In the fullname (e.g. `numpy.ma.MaskedArray.methodname`), the module name -is ambiguous. Using a `::` separator (e.g. `numpy::ma.MaskedArray.methodname`) -specifies `pipeline_vsdi` as the module name. #} diff --git a/docs/no_templates/autosummary/minimal_module.rst b/docs/no_templates/autosummary/minimal_module.rst deleted file mode 100644 index f0d9f00..0000000 --- a/docs/no_templates/autosummary/minimal_module.rst +++ /dev/null @@ -1,8 +0,0 @@ -{{ fullname | escape | underline}} - -.. automodule:: {{ fullname }} - - {% block docstring %} - {% endblock %} - - diff --git a/docs/no_templates/autosummary/module.rst b/docs/no_templates/autosummary/module.rst deleted file mode 100644 index e1f428d..0000000 --- a/docs/no_templates/autosummary/module.rst +++ /dev/null @@ -1,40 +0,0 @@ -{% extends "!autosummary/module.rst" %} - -{# This file is almost the same as the default, but adds :toctree: to the autosummary directives. - The original can be found at `sphinx/ext/autosummary/templates/autosummary/module.rst`. #} - -{% block attributes %} -{% if attributes %} - .. rubric:: Module Attributes - - .. autosummary:: - :toctree: - {% for item in attributes %} - {{ item }} - {%- endfor %} -{% endif %} -{% endblock %} - -{% block functions %} -{% if functions %} - .. rubric:: Functions - - .. autosummary:: - :toctree: - {% for item in functions %} - {{ item }} - {%- endfor %} -{% endif %} -{% endblock %} - -{% block classes %} -{% if classes %} - .. rubric:: Classes - - .. autosummary:: - :toctree: - {% for item in classes %} - {{ item }} - {%- endfor %} -{% endif %} -{% endblock %} diff --git a/docs/pipeline_vsdi.dim_reduction.rst b/docs/pipeline_vsdi.dim_reduction.rst deleted file mode 100644 index 078e56c..0000000 --- a/docs/pipeline_vsdi.dim_reduction.rst +++ /dev/null @@ -1,19 +0,0 @@ -Dimensionality Reduction -======================== - -.. automodule:: pipeline_vsdi.dim_reduction - -Encompasses both linear and nonlinear dimensionality reduction techniques: - -1. Dimensionality Reduction: This submodule offers functionalities for performing Principal Component Analysis (PCA) and Independent Component Analysis (ICA) on Voltage Sensitive Dye Imaging (VSDI) data, a type of data commonly used in neuroscience for imaging brain activity. - -2. Nonlinear Dimensionality Reduction: This submodule provides functionalities for training, analyzing, and performing various operations with Convolutional Autoencoders (Conv_AE). This is useful for the compression and reconstruction of image data, making it particularly valuable in fields like computer vision and medical imaging. - -.. rubric:: Modules - -.. autosummary:: - :toctree: generated/ - - pipeline_vsdi.dim_reduction.VAE - pipeline_vsdi.dim_reduction.linear_dim_red - diff --git a/docs/pipeline_vsdi.preprocessing.rst b/docs/pipeline_vsdi.preprocessing.rst deleted file mode 100644 index aa4b82b..0000000 --- a/docs/pipeline_vsdi.preprocessing.rst +++ /dev/null @@ -1,16 +0,0 @@ -Preprocessing -============= - -.. automodule:: pipeline_vsdi.preprocessing - -.. rubric:: Modules - -.. autosummary:: - :toctree: generated/ - :recursive: - - pipeline_vsdi.preprocessing.behavior - pipeline_vsdi.preprocessing.clustering - pipeline_vsdi.preprocessing.utils - pipeline_vsdi.preprocessing.vsdi_preprocessing - diff --git a/docs/pipeline_vsdi.vsdi.rst b/docs/pipeline_vsdi.vsdi.rst deleted file mode 100644 index 447b4f8..0000000 --- a/docs/pipeline_vsdi.vsdi.rst +++ /dev/null @@ -1,14 +0,0 @@ -Data Handling -============= - -.. automodule:: pipeline_vsdi.vsdi - -.. rubric:: Modules - -.. autosummary:: - :toctree: generated/ - :recursive: - - pipeline_vsdi.vsdi.loaders - pipeline_vsdi.vsdi.vsdi - From 78e6300d89839256646cfb01c8b6790eeb499e52 Mon Sep 17 00:00:00 2001 From: dabadav Date: Thu, 15 Jun 2023 22:35:09 +0200 Subject: [PATCH 39/67] Restructure modules --- .DS_Store | Bin 6148 -> 0 bytes docs/Makefile | 4 +- docs/components/dim_reduction.rst | 14 - .../dim_reduction/dim_reduction.linear.rst | 5 - .../dim_reduction.non_linear.rst | 5 - docs/components/preprocessing.rst | 6 - docs/components/visualization.rst | 5 - docs/components/vsdi.rst | 8 - docs/components/vsdi/vsdi.loaders.rst | 6 - docs/components/vsdi/vsdi.vsdi.rst | 6 - docs/deploy/deployment.rst | 64 --- docs/make.bat | 4 +- docs/{ => source}/_static/custom.css | 0 docs/{ => source}/_static/favicon/favicon.ico | Bin docs/source/_templates/apidoc.rst | 6 + docs/{ => source}/_templates/breadcrumbs.html | 0 docs/{ => source}/conf.py | 14 +- docs/{ => source}/index.rst | 17 +- docs/source/vsdi.VAE.rst | 7 + docs/source/vsdi.io.rst | 7 + docs/source/vsdi.linear_dim_red.rst | 7 + docs/source/vsdi.rst | 23 ++ docs/source/vsdi.session.rst | 7 + docs/source/vsdi.utils.rst | 7 + docs/source/vsdi.visualization.rst | 7 + pipeline_vsdi/dim_reduction/__init__.py | 0 pipeline_vsdi/preprocessing/__init__.py | 0 pipeline_vsdi/preprocessing/behavior.py | 257 ------------ pipeline_vsdi/preprocessing/clustering.py | 46 --- .../preprocessing/vsdi_preprocessing.py | 378 ------------------ pipeline_vsdi/visualization/__init__.py | 0 pipeline_vsdi/vsdi/__init__.py | 0 pyproject.toml | 2 +- {pipeline_vsdi/dim_reduction => vsdi}/VAE.py | 26 +- {pipeline_vsdi => vsdi}/__init__.py | 0 pipeline_vsdi/vsdi/loaders.py => vsdi/io.py | 0 .../dim_reduction => vsdi}/linear_dim_red.py | 0 pipeline_vsdi/vsdi/vsdi.py => vsdi/session.py | 4 +- .../preprocessing => vsdi}/utils.py | 256 +++++++++++- .../visualization.py | 0 40 files changed, 338 insertions(+), 860 deletions(-) delete mode 100644 .DS_Store delete mode 100644 docs/components/dim_reduction.rst delete mode 100644 docs/components/dim_reduction/dim_reduction.linear.rst delete mode 100644 docs/components/dim_reduction/dim_reduction.non_linear.rst delete mode 100644 docs/components/preprocessing.rst delete mode 100644 docs/components/visualization.rst delete mode 100644 docs/components/vsdi.rst delete mode 100644 docs/components/vsdi/vsdi.loaders.rst delete mode 100644 docs/components/vsdi/vsdi.vsdi.rst delete mode 100644 docs/deploy/deployment.rst mode change 100755 => 100644 docs/make.bat rename docs/{ => source}/_static/custom.css (100%) rename docs/{ => source}/_static/favicon/favicon.ico (100%) create mode 100644 docs/source/_templates/apidoc.rst rename docs/{ => source}/_templates/breadcrumbs.html (100%) rename docs/{ => source}/conf.py (86%) rename docs/{ => source}/index.rst (67%) create mode 100644 docs/source/vsdi.VAE.rst create mode 100644 docs/source/vsdi.io.rst create mode 100644 docs/source/vsdi.linear_dim_red.rst create mode 100644 docs/source/vsdi.rst create mode 100644 docs/source/vsdi.session.rst create mode 100644 docs/source/vsdi.utils.rst create mode 100644 docs/source/vsdi.visualization.rst delete mode 100644 pipeline_vsdi/dim_reduction/__init__.py delete mode 100644 pipeline_vsdi/preprocessing/__init__.py delete mode 100644 pipeline_vsdi/preprocessing/behavior.py delete mode 100644 pipeline_vsdi/preprocessing/clustering.py delete mode 100644 pipeline_vsdi/preprocessing/vsdi_preprocessing.py delete mode 100644 pipeline_vsdi/visualization/__init__.py delete mode 100644 pipeline_vsdi/vsdi/__init__.py rename {pipeline_vsdi/dim_reduction => vsdi}/VAE.py (87%) rename {pipeline_vsdi => vsdi}/__init__.py (100%) rename pipeline_vsdi/vsdi/loaders.py => vsdi/io.py (100%) rename {pipeline_vsdi/dim_reduction => vsdi}/linear_dim_red.py (100%) rename pipeline_vsdi/vsdi/vsdi.py => vsdi/session.py (98%) rename {pipeline_vsdi/preprocessing => vsdi}/utils.py (68%) rename pipeline_vsdi/visualization/vsdi_visualization.py => vsdi/visualization.py (100%) diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index fea5745d115a944dd539b61a92e21a108ba82717..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK!Ab)$5S{3%sUq~C=rQ26V6`HMm$lZT7gzM4QoC-^#cfi$TYD(NUiBON55K^> zC%?vnGf4_+t9THRl7Y#aBr{3pwMjYvz^dJ74WI}B9F@?U#b$)iJn4{3*b$m!dW{Y= zA%ZSkKsMy<1{?#9f&az;o!xmnvoW-w4)4!z3<_k}OWR?hLiBnJ+ew^eIGRN>!#I4=Y)EPN+sdIZiGj1vsW)J>?)ZxV%hBIfH-QR%jt0}Bh{;_ zu8dM08<+`R;Dvf|so&qIltiVnd0P_wt@UzAY@mHx;EOA(+XwaQq$SmzVU*zoq-EaX z0PfNFCc&GaBNHVr(Ti3nfW)*jyv9OA1=o;{2L&S%OD@-f3)N~5m>QjaOVw)j7rLh4u3-<_1kTFk5^uyEC&D3e&se z`a-({^9{PzG2j^Z$iSrO7U})p`?~)B803160mr~tF~Gc9P^)4}_H7+Xj^0{NUL 2>NUL if errorlevel 9009 ( diff --git a/docs/_static/custom.css b/docs/source/_static/custom.css similarity index 100% rename from docs/_static/custom.css rename to docs/source/_static/custom.css diff --git a/docs/_static/favicon/favicon.ico b/docs/source/_static/favicon/favicon.ico similarity index 100% rename from docs/_static/favicon/favicon.ico rename to docs/source/_static/favicon/favicon.ico diff --git a/docs/source/_templates/apidoc.rst b/docs/source/_templates/apidoc.rst new file mode 100644 index 0000000..18460ed --- /dev/null +++ b/docs/source/_templates/apidoc.rst @@ -0,0 +1,6 @@ +{{ fullname | escape | underline }} + +.. automodule:: {{ fullname }} + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_templates/breadcrumbs.html b/docs/source/_templates/breadcrumbs.html similarity index 100% rename from docs/_templates/breadcrumbs.html rename to docs/source/_templates/breadcrumbs.html diff --git a/docs/conf.py b/docs/source/conf.py similarity index 86% rename from docs/conf.py rename to docs/source/conf.py index 373b10b..1ac006f 100644 --- a/docs/conf.py +++ b/docs/source/conf.py @@ -8,7 +8,7 @@ import os import sys -sys.path.insert(0, os.path.abspath('../pipeline_vsdi')) +sys.path.insert(0, os.path.abspath('../..')) project = 'VSDI Pipeline' copyright = '2023, NeuroNetMem' @@ -19,11 +19,12 @@ # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration # extensions = ['sphinx.ext.autodoc', -# 'numpydoc', -# 'sphinx.ext.autosummary', -# 'sphinx_design'] -extensions = ["sphinx.ext.napoleon", "autodocsumm"] +extensions = ["autodocsumm", + "numpydoc", + "sphinx.ext.graphviz"] + autodoc_default_options = {"autosummary": True} +numpydoc_show_class_members = False templates_path = ['_templates'] exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] @@ -43,10 +44,11 @@ def setup(app): app.add_css_file("custom.css") + # ----------------------------------------------------------------------------- # Autosummary # ----------------------------------------------------------------------------- # Make numpydoc to generate plots for example sections # numpydoc_use_plots = True -# autosummary_generate = True \ No newline at end of file +# autosummary_generate = True diff --git a/docs/index.rst b/docs/source/index.rst similarity index 67% rename from docs/index.rst rename to docs/source/index.rst index d99dcc2..23cf903 100644 --- a/docs/index.rst +++ b/docs/source/index.rst @@ -8,18 +8,13 @@ VSDI Pipeline Preprocessing tools for voltage sensitive dye imaging data -.. toctree:: - :maxdepth: 1 - :caption: Setup Documentation - - deploy/deployment - .. toctree:: :maxdepth: 1 :caption: Code Documentation - components/vsdi - components/preprocessing - components/dim_reduction - components/visualization - \ No newline at end of file + vsdi.io + vsdi.linear_dim_red + vsdi.session + vsdi.utils + vsdi.VAE + vsdi.visualization diff --git a/docs/source/vsdi.VAE.rst b/docs/source/vsdi.VAE.rst new file mode 100644 index 0000000..0321b88 --- /dev/null +++ b/docs/source/vsdi.VAE.rst @@ -0,0 +1,7 @@ +vsdi.VAE module +=============== + +.. automodule:: vsdi.VAE + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/source/vsdi.io.rst b/docs/source/vsdi.io.rst new file mode 100644 index 0000000..9890cee --- /dev/null +++ b/docs/source/vsdi.io.rst @@ -0,0 +1,7 @@ +vsdi.io module +============== + +.. automodule:: vsdi.io + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/source/vsdi.linear_dim_red.rst b/docs/source/vsdi.linear_dim_red.rst new file mode 100644 index 0000000..68b9536 --- /dev/null +++ b/docs/source/vsdi.linear_dim_red.rst @@ -0,0 +1,7 @@ +vsdi.linear\_dim\_red module +============================ + +.. automodule:: vsdi.linear_dim_red + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/source/vsdi.rst b/docs/source/vsdi.rst new file mode 100644 index 0000000..134bdd1 --- /dev/null +++ b/docs/source/vsdi.rst @@ -0,0 +1,23 @@ +vsdi package +============ + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + vsdi.VAE + vsdi.io + vsdi.linear_dim_red + vsdi.session + vsdi.utils + vsdi.visualization + +Module contents +--------------- + +.. automodule:: vsdi + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/source/vsdi.session.rst b/docs/source/vsdi.session.rst new file mode 100644 index 0000000..74836e1 --- /dev/null +++ b/docs/source/vsdi.session.rst @@ -0,0 +1,7 @@ +vsdi.session module +=================== + +.. automodule:: vsdi.session + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/source/vsdi.utils.rst b/docs/source/vsdi.utils.rst new file mode 100644 index 0000000..88f56a3 --- /dev/null +++ b/docs/source/vsdi.utils.rst @@ -0,0 +1,7 @@ +vsdi.utils module +================= + +.. automodule:: vsdi.utils + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/source/vsdi.visualization.rst b/docs/source/vsdi.visualization.rst new file mode 100644 index 0000000..b540d0e --- /dev/null +++ b/docs/source/vsdi.visualization.rst @@ -0,0 +1,7 @@ +vsdi.visualization module +========================= + +.. automodule:: vsdi.visualization + :members: + :undoc-members: + :show-inheritance: diff --git a/pipeline_vsdi/dim_reduction/__init__.py b/pipeline_vsdi/dim_reduction/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/pipeline_vsdi/preprocessing/__init__.py b/pipeline_vsdi/preprocessing/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/pipeline_vsdi/preprocessing/behavior.py b/pipeline_vsdi/preprocessing/behavior.py deleted file mode 100644 index fd5f6e5..0000000 --- a/pipeline_vsdi/preprocessing/behavior.py +++ /dev/null @@ -1,257 +0,0 @@ -""" -This module provides a set of functions for the analysis of animal behavioral data. - -Functions: ---------- -make_design_matrix(b_data, event_sequences, fps=50): - Generates a design matrix based on the provided event sequences. - -subsets(Set): - Finds the starting indices of subsets of consecutive numbers within the provided set. - -get_trials(feature): - Finds the starting indices of trials within the provided design matrix vector. - -compute_lick_rate(data, trial_onsets, fps): - Compute the lick rate for each trial. - -store_indices(animals, days, sessions, outpath): - Store cumulative index (based on X matrix length) for each session, day, and animal, - as well as trial indices for CS+ and CS- trials in a nested dictionary structure. - -Example ----------- -This module can be used to compute lick rates and extract trial indices from behavioral data -for multiple animals over multiple days and sessions. - ->>> animals = ['Mouse1', 'Mouse2'] ->>> days = ['Day1', 'Day2'] ->>> sessions = ['Session1', 'Session2'] ->>> outpath = '/path/to/output/directory' ->>> indices_dict = store_indices(animals, days, sessions, outpath) -""" - -import numpy as np - -def make_design_matrix(b_data, event_sequences, fps=50): - """ - Generates a design matrix based on the provided event sequences. - - The design matrix contains rows corresponding to frames and columns corresponding to events. Each column index in the output matrix represents an event in the event sequences. The number of columns in the design matrix equals the maximum column index specified in the event sequences plus one. - - Parameters - ---------- - event_sequences : dict - A dictionary where keys are event names and values are lists of tuples. Each tuple contains the name of an event, the duration of the event in seconds, and the column index in the output matrix. - - Returns - ------- - matrix : ndarray - Design matrix where each row corresponds to a frame and each column corresponds to an event. - - Examples - -------- - >>> event_sequences = { - ... 'Lick': [('Lick', 1, 5)], - ... 'CSp': [('CS+', 2, 0), ('CS+ Trace', 1, 1), ('Reward', 1, 4)], - ... 'CSn': [('CS-', 2, 2), ('CS- Trace', 1, 3)], - ... } - >>> design_matrix(event_sequences) - # Output: - # matrix with columns: - # 0: CS+ (2s) - # 1: CS+ trace (1s) - # 2: CS- (2s) - # 3: CS- trace (1s) - # 4: Reward (1s) - # 5: Lick - """ - frames = b_data['frames'] - length = len(frames) - n_columns = max(col for seq in event_sequences.values() for _, _, col in seq) + 1 - X = np.zeros((length, n_columns)) - - for event, sequence in event_sequences.items(): - event_data = b_data[event] - - for i in range(len(event_data)): - - frame = np.argmin(np.abs(frames - event_data[i])) - - for event_name, duration, column in sequence: - duration_unit = fps * duration if fps * duration != 0 else 1 # extreme case for licks - X[frame:(frame + int(duration_unit)), column] = 1 - frame += fps * duration - - return X - -def subsets(Set): - """ - Finds the starting indices of subsets of consecutive numbers within the provided set. - - This function identifies series of consecutive numbers (subsets) within the input set. - It returns a numpy array of the starting indices of each identified subset. - - Parameters - ---------- - Set : list or array-like - List or array-like object containing the series of numbers to be partitioned into subsets. - - Returns - ------- - subsets : ndarray - A numpy array containing the starting indices of each identified subset of consecutive numbers. - - Examples - -------- - >>> subsets([1, 2, 3, 5, 6, 8, 9, 10]) - # Output: array([1, 5, 8]) - - Notes - ----- - The subsets are defined as series of consecutive numbers. For example, in the array - [1, 2, 3, 5, 6, 8, 9, 10], the subsets of consecutive numbers are [1, 2, 3], [5, 6] - and [8, 9, 10], so the function returns the starting points [1, 5, 8]. - """ - subsets = [] - start = 0 - end = 0 - - # Iterate over array - while end < len(Set): - - # Get first and last frame of each subset - while end + 1 < len(Set) and Set[end + 1] - Set[start] == end - start + 1: - end += 1 - - # Save first and last frame of each outlier subset - subsets.append(Set[start]) - start = end = end + 1 - - return np.array(subsets) - -def get_trials(feature): - """ - Finds the starting indices of trials within the provided design matrix vector. - - This function identifies the start of each trial within the input design matrix vector, - where trials are defined as sequences where the feature equals 1. - - Parameters - ---------- - feature : list or array-like - List or array-like object representing a design matrix vector. The start of each - trial is defined as the index where the feature value equals 1. - - Returns - ------- - feature_trials : ndarray - A numpy array containing the starting indices of each identified trial. - - Examples - -------- - >>> get_trials([0, 0, 1, 1, 1, 0, 0, 1, 1, 0]) - # Output: array([2, 7]) - - Notes - ----- - The trials are defined as sequences where the feature equals 1. For example, in the array - [0, 0, 1, 1, 1, 0, 0, 1, 1, 0], the trials are [1, 1, 1] and [1, 1], so the function - returns the starting points [2, 7]. - """ - # Find the indices where feature is 1 - feature_trials = subsets(np.where(feature == 1)[0]) - - return feature_trials - -def compute_lick_rate(data, trial_onsets, fps): - """ - Compute the lick rate for each trial. - - For each trial, the function computes the number of licks during a 'baseline' period - of 1 second before CS presentation and during a 'trace' period of 1 second starting - 2 seconds after CS presentation. The lick rate for the trial is then computed as - the number of licks in the trace period minus the number of licks in the baseline period. - - Parameters - ---------- - data : ndarray - 1D numpy array containing lick data. Each element corresponds to a frame, and its - value indicates whether a lick occurred in that frame (1) or not (0). - - trial_onsets : ndarray - 1D numpy array containing the onset times (in frames) of each trial. - - fps : int - Frame rate of the data (frames per second). - - Returns - ------- - lick_rates : list - List of lick rates for each trial. - - Examples - -------- - >>> lick_data = np.random.randint(0, 2, 600) # Mock lick data - >>> trial_onsets = np.array([100, 300, 500]) # Mock trial onset times - >>> fps = 30 # Frame rate - >>> lick_rates = compute_lick_rate(lick_data, trial_onsets, fps) - """ - lick_rates = [] - - for i in range(len(trial_onsets)): - - trial_start = trial_onsets[i] - # Baseline -1 s before CS presentation - baseline_licks = np.sum(data[(trial_start-fps):trial_start]) - # Number of licks in trace period - trace_licks = np.sum(data[trial_start+(2*fps):trial_start+(3*fps)]) - # Corrected lick rate - lick_rate = trace_licks - baseline_licks - - lick_rates.append(lick_rate) - - return lick_rates - -def store_indices(animals, days, sessions, outpath): - """ - Store cumulative index (based on X matrix length) for each session, day, and animal, - as well as trial indices for CS+ and CS- trials in a nested dictionary structure. - - :param animals: List of animal names - :param days: List of days - :param sessions: List of sessions - :param outpath: Path to the output directory - :return: A nested dictionary containing the cumulative indices and trial indices - """ - # Initialize an empty dictionary - X = {animal: {day: {} for day in days} for animal in animals} - - # Iterate over all animals, days, and sessions - for animal in animals: - for day in days: - # Initialize the cumulative count - cumulative_count = 0 - - for session in sessions: - # Load design matrix - X_matrix = np.loadtxt(outpath.joinpath(f"X_{animal}_{day}_{session}.csv"), delimiter=",") - - # Here we are assuming 'CS+' info is in column 0 and 'CS-' info is in column 2 - trial_types = ['CS+', 'CS-'] - for trial_type, column in zip(trial_types, [0, 2]): - feature = X_matrix[:, column] - trial_indices = get_trials(feature) - - # Store the trial indices in the nested dictionary - if session not in X[animal][day]: - X[animal][day][session] = {} - X[animal][day][session][trial_type] = trial_indices - - # Update the cumulative count - cumulative_count += len(X_matrix) - - # Store the cumulative count in the nested dictionary - X[animal][day][session]['Cumulative Index'] = cumulative_count - - return X diff --git a/pipeline_vsdi/preprocessing/clustering.py b/pipeline_vsdi/preprocessing/clustering.py deleted file mode 100644 index e138467..0000000 --- a/pipeline_vsdi/preprocessing/clustering.py +++ /dev/null @@ -1,46 +0,0 @@ -import numpy as np -from scipy.spatial.distance import pdist, squareform -from sklearn.cluster import KMeans -from sklearn.manifold import TSNE -import matplotlib.pyplot as plt - -def compute_distance_matrix(arr_list): - """ - Given a list of 2D arrays, compute the pairwise distance matrix using Pearson correlation. - """ - # Get the number of arrays in the list - n_arrays = len(arr_list) - # Create an empty distance matrix with shape (n_arrays, n_arrays) - dist_mat = np.zeros((n_arrays, n_arrays)) - # Compute the pairwise distance between all pairs of arrays using Pearson correlation - for i in range(n_arrays): - for j in range(i+1, n_arrays): - corr = np.corrcoef(arr_list[i], arr_list[j])[0, 1] - dist = 1 - np.abs(corr) - dist_mat[i, j] = dist - dist_mat[j, i] = dist - # Return the distance matrix - return dist_mat - -def cluster_and_plot(arr_list, kind='betas'): - """ - Given a list of 2D arrays, compute the pairwise distance matrix, cluster it using k-means, - and plot the t-SNE projection of the distance matrix, colored by the cluster labels. - """ - # Compute the distance matrix using Pearson correlation - dist_mat = compute_distance_matrix(arr_list) - # Set the number of clusters for k-means - n_clusters = 10 - # Apply k-means clustering to the distance matrix - kmeans = KMeans(n_clusters=n_clusters) - labels = kmeans.fit_predict(dist_mat) - # Compute the t-SNE projection of the distance matrix - tsne = TSNE(n_components=2, perplexity=30, random_state=42) - emb = tsne.fit_transform(dist_mat) - # Plot the t-SNE projection, coloring each point by its cluster label - fig, ax = plt.subplots(figsize=(8, 8)) - scatter = ax.scatter(emb[:,0], emb[:,1], c=labels, cmap='viridis') - legend = ax.legend(*scatter.legend_elements(), loc="lower left", title="Clusters") - ax.add_artist(legend) - ax.set_title(f"t-SNE projection of {kind} distance matrix") - plt.show() diff --git a/pipeline_vsdi/preprocessing/vsdi_preprocessing.py b/pipeline_vsdi/preprocessing/vsdi_preprocessing.py deleted file mode 100644 index 7ad86b9..0000000 --- a/pipeline_vsdi/preprocessing/vsdi_preprocessing.py +++ /dev/null @@ -1,378 +0,0 @@ -########################################################## -######################## PACKAGES ######################## -########################################################## -import numpy as np -from sklearn.decomposition import PCA, FastICA -from sklearn.preprocessing import StandardScaler -from sklearn.pipeline import Pipeline -import scipy.stats as stats -import statsmodels.api as sm - -########################################################## - -def peak_distance(component, smooth_window_size, hist_nbins): - # Create a histogram - n, bins = np.histogram(component, bins=hist_nbins) - # Define the window size for the moving average - window_size = smooth_window_size - # Create the moving average kernel - kernel = np.ones(window_size) / window_size - # Convolve the histogram data with the moving average kernel - smoothed = np.convolve(n, kernel, mode='same') - bins_adjusted = bins[:-1] - # Find the x-axis location of the highest point in the histogram - x_max = bins_adjusted[np.argmax(smoothed)] - - return x_max - - -def check_bimodal(components, th=1.0, smooth_window_size=5, hist_nbins=1000): - """ - Test for bimodality using moving average to smooth the histogram - and get the x-axis location of the highest point in the histogram - - Parameters - ---------- - components : numpy ndarray (components, time) - Timecourse of a single component - threshold : float - Threshold for bimodal distribution identification (distance from peak to zero) - - Returns - ------- - bimodal_components : list - List of components that are bimodal (1 if bimodal, 0 if not) - """ - # Initialize bimodal_components list - bimodal_components = np.zeros(components.shape[0]) - for i in range(components.shape[0]): - # Get peak distance - x_max = peak_distance(components[i], smooth_window_size, hist_nbins) - # Check if peak distance is above threshold - if abs(x_max) > th: - bimodal_components[i] = 1 - - return bimodal_components - - -def clean_hemodynamic_pca(vsdi, n_components=50, bimodal_th=1, - smooth_window=5, hist_nbins=1000, verbose=False): - """ - Clean hemodynamic noise from vsdi data - - Parameters - ---------- - vsdi : numpy array - vsdi data in format (time, pixels_y, pixels_X) - n_components : int - Number of components to keep after PCA - bimodal_th : float - Threshold for bimodal distribution identification - smooth_window : int - Window size for smoothing the histogram of timecourse distribution - hist_nbins : int - Number of bins for histogram of timecourse distribution - - Returns - ------- - clean_vsdi : numpy array in the same format as vsdi input - vsdi data with hemodynamic noise removed - """ - # reshape vsdi data to (time, pixels) - vsdi = vsdi.transpose(2, 0, 1) - # store original shape - vsdi_shape = vsdi.shape - # flatten 2d pixels to array - vsdi = vsdi.reshape(vsdi.shape[0], vsdi.shape[1]*vsdi.shape[2]) - - # put out-of-mask values to zero - - # run PCA - pca = PCA(n_components=n_components) - # fit PCA to vsdi data and project it to the new space - timecourses = pca.fit_transform(vsdi) - - # get bimodal components indexes - bad_components = check_bimodal(timecourses.T, th=bimodal_th, - smooth_window_size=smooth_window, - hist_nbins=hist_nbins) - - if verbose: - with open('log.txt', 'a') as f: - # Print explained variance ratio - f.write( - f'{sum(pca.explained_variance_ratio_[np.where(bad_components)]):.4f} ') - # Print number of components - f.write(f'{sum(bad_components):.0f}\n') - - # get clean timecourses and components - good_timecourses = timecourses[:, np.logical_not(bad_components)] - good_components = pca.components_[np.logical_not(bad_components)] - - # reconstruct vsdi data - clean_vsdi = good_timecourses @ good_components - clean_vsdi = clean_vsdi.reshape( - vsdi_shape[0], vsdi_shape[1], vsdi_shape[2]) - clean_vsdi = clean_vsdi.transpose(1, 2, 0) - - return clean_vsdi - - -def clean_hemodynamics(vsdi, n_components=50, bimodal_th=0.8, ica_max_iter=200, - smooth_window=5, hist_nbins=1000, verbose=False): - """ - Clean hemodynamic noise from vsdi data - - Parameters - ---------- - vsdi : numpy array - vsdi data in format (time, pixels_y, pixels_X) - n_components : int - Number of components to keep after PCA - bimodal_th : float - Threshold for bimodal distribution identification - smooth_window : int - Window size for smoothing the histogram of timecourse distribution - hist_nbins : int - Number of bins for histogram of timecourse distribution - - Returns - ------- - clean_vsdi : numpy array in the same format as vsdi input - vsdi data with hemodynamic noise removed - """ - # reshape vsdi data to (time, pixels) - X = vsdi.transpose(2, 0, 1) - # store original shape - vsdi_shape = vsdi.shape - # flatten 2d pixels to array - X = X.reshape(vsdi.shape[0], vsdi.shape[1]*vsdi.shape[2]) - - # Create a pipeline with PCA and ICA - pipe = Pipeline([ - ('pca', PCA(n_components=n_components)), - ('ica', FastICA(n_components=n_components, max_iter=ica_max_iter, - random_state=88, whiten='unit-variance')) - ]) - - # Fit the pipeline to vsdi data - timecourses = pipe.fit_transform(X) - - # get bimodal components indexes - bad_components = check_bimodal(timecourses.T, th=bimodal_th, - smooth_window_size=smooth_window, - hist_nbins=hist_nbins) - - if verbose: - with open('log.txt', 'a') as f: - # Print number of components - f.write(f'{sum(bad_components):.0f}\n') - - # get clean timecourses and components - good_timecourses = timecourses[:, np.logical_not(bad_components)] - good_components = pipe.named_steps['ica'].components_[ - np.logical_not(bad_components)] - - # reconstruct vsdi data - clean_vsdi = good_components @ pipe.named_steps['pca'].components_ - clean_vsdi = good_timecourses @ clean_vsdi - clean_vsdi = clean_vsdi.reshape( - vsdi_shape[0], vsdi_shape[1], vsdi_shape[2]) - - return clean_vsdi - - -def find_outliers_old(vsdi, mean_vsdi, std_vsdi, nsigma=4): - # Get index of outliers from vsdi presenting average activity higher than 4 sigma - outliers = np.argwhere((mean_vsdi > nsigma*std_vsdi) - | (mean_vsdi < -nsigma*std_vsdi)).ravel() - - subsets = [] - start = 0 - end = 0 - - # Iterate over array - while end < len(outliers): - # Get first and last frame of each subset - while end + 1 < len(outliers) and outliers[end + 1] - outliers[start] == end - start + 1: - end += 1 - # Save first and last frame of each outlier subset - subsets.append((outliers[start], outliers[end])) - start = end = end + 1 - - return np.array(subsets) - - -def find_outliers(vsdi, nsigma=6): - mean_vsdi = np.mean(vsdi, axis=(0, 1)) - # How many standard deviations away a value is from the mean - zscore = stats.zscore(mean_vsdi, axis=0, ddof=0, nan_policy='propagate') - # Get index of outliers from vsdi presenting average activity higher than 4 sigma - outliers = np.argwhere((zscore > nsigma) | (zscore < -nsigma)).ravel() - - subsets = [] - start = 0 - end = 0 - - # Iterate over array - while end < len(outliers): - # Get first and last frame of each subset - while end + 1 < len(outliers) and outliers[end + 1] - outliers[start] == end - start + 1: - end += 1 - # Save first and last frame of each outlier subset - subsets.append((outliers[start], outliers[end])) - start = end = end + 1 - - return np.array(subsets) - - -def clean_outliers(vsdi, nsigma=6): - """ - Correct outliers in VSDI data - - Parameters - ---------- - vsdi : numpy ndarray - vsdi data in format (h, w, time) - nsigma : float - Number of standard deviations to consider an outlier - - Returns - ------- - vsdi : numpy ndarray - vsdi data with outliers corrected - """ - vsdi = vsdi.copy() - # Get first and last frame of each subset - outliers_subsets = find_outliers(vsdi, nsigma) - - # Set outlier frames to the mean between the previous and next frame - for i in range(len(outliers_subsets)): - start = outliers_subsets[i][0] - end = outliers_subsets[i][1] - if start == 0: - vsdi[:, :, start:end+1] = np.tile(vsdi[:, :, end+1] - [:, :, np.newaxis], (1, 1, end - start + 1)) - elif end == vsdi.shape[2]-1: - vsdi[:, :, start:end+1] = np.tile(vsdi[:, :, start-1] - [:, :, np.newaxis], (1, 1, end - start + 1)) - else: - average = np.divide(np.add( - vsdi[:, :, (start-1)][:, :, np.newaxis], vsdi[:, :, (end+1)][:, :, np.newaxis]), 2) - vsdi[:, :, start:end+1] = average - return vsdi - - -def design_matrix(b_data): - # Design matrix - # Returns a matrix of size (time, 6) with the following columns: - # 0: CS+ (2s) - # 1: CS+ trace (1s) - # 2: CS- (2s) - # 3: CS- trace (1s) - # 4: Reward (1s) - # 5: Lick - - fps = 50 - - Lick = b_data['Lick'] - CSp = b_data['CSp'] - CSn = b_data['CSn'] - frames = b_data['frames'] - - length = len(frames) - X = np.zeros((length, 6)) - - # Iterate over lick events - for i in range(len(Lick)): - frame = np.argmin(np.abs(frames - Lick[i])) - X[frame:frame+4, 5] = 1 - - # Iterate over CSp events - for i in range(len(CSp)): - frame = np.argmin(np.abs(frames - CSp[i])) - X[frame:frame + (fps * 2), 0] = 1 - frame += (fps * 2) + 1 - X[frame:frame + (fps * 1), 1] = 1 - frame += (fps * 1) + 1 - X[frame:frame + (fps * 1), 4] = 1 - - # Iterate over CSn events - for i in range(len(CSn)): - frame = np.argmin(np.abs(frames - CSn[i])) - X[frame:frame + (fps * 2), 2] = 1 - frame += (fps * 2) + 1 - X[frame:frame + (fps * 1), 3] = 1 - - return X - - -def pca(vsdi, raw_mask=None, n_comp=10, normalize=True): - # reshape vsdi data to (time, pixels) - X = vsdi.transpose(2, 0, 1) - # store original shape - # vsdi_shape = vsdi.shape - if raw_mask is not None: - # put out-of-mask values to zero - X = X[:, raw_mask] - else: - # flatten 2d pixels to array - X = X.reshape(vsdi.shape[0], vsdi.shape[1]*vsdi.shape[2]) - - # Create a pipeline with PCA - pipe = Pipeline([ - ('scaler', StandardScaler()), - ('pca', PCA(n_components=10)) - ]) - - # Fit the pipeline to vsdi data - out = pipe.fit(X) - fingerprints = out.named_steps['pca'].components_ - timecourses = fingerprints @ X.T - - return fingerprints, timecourses - - -def pca_ica(vsdi, raw_mask, n_comp=10,z_score = True,ica_random_state=42,ica_max_iter=200): - # reshape vsdi data to (time, pixels) - X = vsdi.transpose(2, 0, 1) - X = X*raw_mask - X = X.reshape(X.shape[0], X.shape[1]*X.shape[2]) - - if z_score: - X = StandardScaler().fit_transform(X) - - - # Create a pipeline with PCA and ICA - pipe = Pipeline([('pca', PCA(n_components=n_comp)), - ('ica', FastICA(n_components=n_comp, max_iter=ica_max_iter, - random_state=ica_random_state, whiten='unit-variance')) - ]) - - out = pipe.fit(X) - fingerprints = out.named_steps["ica"].components_ @ out.named_steps["pca"].components_ - timecourses = fingerprints @ X.T - - return fingerprints.reshape(n_comp,raw_mask.shape[0],raw_mask.shape[1]), timecourses - - -def glm(Y, X): - # Fit Gaussian GLMs - X = sm.add_constant(X) - model = sm.GLM(Y, X, family=sm.families.Gaussian()) - results = model.fit() - - return results - - -def merge_masks(masks, threshold=0.5): - """ - Merge masks by voting majority / logical OR - - Input: masks (n_masks, h, w) - Output: mask_mean (h, w) - """ - mask_mean = np.mean(masks, axis=0) - mask_mean[mask_mean > threshold] = 1 - mask_mean[mask_mean <= threshold] = 0 - return mask_mean diff --git a/pipeline_vsdi/visualization/__init__.py b/pipeline_vsdi/visualization/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/pipeline_vsdi/vsdi/__init__.py b/pipeline_vsdi/vsdi/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/pyproject.toml b/pyproject.toml index 16e8b03..c32924b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,5 +1,5 @@ [tool.poetry] -name = "pipeline_vsdi" +name = "vsdi" version = "0.1.0" description = "Preprocessing tools for voltage sensitive dye imaging data" authors = ["NeuroNetMem"] diff --git a/pipeline_vsdi/dim_reduction/VAE.py b/vsdi/VAE.py similarity index 87% rename from pipeline_vsdi/dim_reduction/VAE.py rename to vsdi/VAE.py index eb4a310..2cf32ce 100644 --- a/pipeline_vsdi/dim_reduction/VAE.py +++ b/vsdi/VAE.py @@ -1,22 +1,7 @@ """ Module for Nonlinear Dimensionality Reduction. -This module provides functionalities for training, analyzing and performing various operations with Convolutional Autoencoders (Conv_AE). - -Classes: - - Conv_AE: Defines a PyTorch model for a convolutional autoencoder, which includes an encoder and a decoder for image data compression and reconstruction, respectively. - -Functions: - - create_dataloader(dataset): Returns a PyTorch DataLoader prepared from a given dataset. - - train_autoencoder(model, dataloader, num_epochs): Trains the provided autoencoder model. - - predict(model, image): Returns the autoencoder's reconstruction of a given image. - - get_latent_vectors(model, dataloader): Returns latent representations of a given dataset. - - find_max_activation_images(model, dataloader): Identifies images that maximize the activation of each unit in the autoencoder's latent space. - - shuffle_2D_matrix(matrix): Shuffles a 2D matrix across both dimensions. - - linear_decoding_score(embeddings, features): Calculates the score of linear regression of embeddings to features. - - linear_decoding_error(embeddings, features): Computes the expected error of a linear decoder that uses the embeddings to predict certain features of the data. - -The module is specifically designed for the purpose of training a convolutional autoencoder to compress image data into a low-dimensional latent representation and evaluate the quality of these representations. +This module provides functionalities for training, analyzing and performing various operations with Convolutional Autoencoders (Conv_AE). The module is specifically designed for the purpose of training a convolutional autoencoder to compress image data into a low-dimensional latent representation and evaluate the quality of these representations. """ import numpy as np @@ -37,14 +22,6 @@ class Conv_AE(nn.Module): into a latent space, and the decoder reconstructs the original data from the latent representation. The model is trained to minimize the difference between the input and the output of the autoencoder. - - Methods - ------- - forward(x): - Passes the input through the encoder and decoder. - - backward(optimizer, criterion, x, y_true): - Computes the loss, performs backpropagation, and updates the model parameters. """ def __init__(self, latent_dim): """ @@ -375,3 +352,4 @@ def linear_decoding_error(embeddings, features, norm=1): mean_dist = np.mean(dist) / norm return mean_dist + diff --git a/pipeline_vsdi/__init__.py b/vsdi/__init__.py similarity index 100% rename from pipeline_vsdi/__init__.py rename to vsdi/__init__.py diff --git a/pipeline_vsdi/vsdi/loaders.py b/vsdi/io.py similarity index 100% rename from pipeline_vsdi/vsdi/loaders.py rename to vsdi/io.py diff --git a/pipeline_vsdi/dim_reduction/linear_dim_red.py b/vsdi/linear_dim_red.py similarity index 100% rename from pipeline_vsdi/dim_reduction/linear_dim_red.py rename to vsdi/linear_dim_red.py diff --git a/pipeline_vsdi/vsdi/vsdi.py b/vsdi/session.py similarity index 98% rename from pipeline_vsdi/vsdi/vsdi.py rename to vsdi/session.py index e085693..f082be0 100644 --- a/pipeline_vsdi/vsdi/vsdi.py +++ b/vsdi/session.py @@ -19,8 +19,8 @@ from scipy.io import loadmat import h5py -import pipeline_vsdi.vsdi.loaders as loaders -from pipeline_vsdi.preprocessing.behavior import make_design_matrix +import vsdi.io as loaders +from vsdi.utils import make_design_matrix class DataLoader: """ diff --git a/pipeline_vsdi/preprocessing/utils.py b/vsdi/utils.py similarity index 68% rename from pipeline_vsdi/preprocessing/utils.py rename to vsdi/utils.py index f25a312..3bf0f21 100644 --- a/pipeline_vsdi/preprocessing/utils.py +++ b/vsdi/utils.py @@ -40,6 +40,234 @@ import warnings from sklearn.exceptions import ConvergenceWarning +################ +### BEHAVIOR ### +################ + +def make_design_matrix(b_data, event_sequences, fps=50): + """ + Generates a design matrix based on the provided event sequences. + + The design matrix contains rows corresponding to frames and columns corresponding to events. Each column index in the output matrix represents an event in the event sequences. The number of columns in the design matrix equals the maximum column index specified in the event sequences plus one. + + Parameters + ---------- + event_sequences : dict + A dictionary where keys are event names and values are lists of tuples. Each tuple contains the name of an event, the duration of the event in seconds, and the column index in the output matrix. + + Returns + ------- + matrix : ndarray + Design matrix where each row corresponds to a frame and each column corresponds to an event. + + Examples + -------- + >>> event_sequences = { + ... 'Lick': [('Lick', 1, 5)], + ... 'CSp': [('CS+', 2, 0), ('CS+ Trace', 1, 1), ('Reward', 1, 4)], + ... 'CSn': [('CS-', 2, 2), ('CS- Trace', 1, 3)], + ... } + >>> design_matrix(event_sequences) + # Output: + # matrix with columns: + # 0: CS+ (2s) + # 1: CS+ trace (1s) + # 2: CS- (2s) + # 3: CS- trace (1s) + # 4: Reward (1s) + # 5: Lick + """ + frames = b_data['frames'] + length = len(frames) + n_columns = max(col for seq in event_sequences.values() for _, _, col in seq) + 1 + X = np.zeros((length, n_columns)) + + for event, sequence in event_sequences.items(): + event_data = b_data[event] + + for i in range(len(event_data)): + + frame = np.argmin(np.abs(frames - event_data[i])) + + for event_name, duration, column in sequence: + duration_unit = fps * duration if fps * duration != 0 else 1 # extreme case for licks + X[frame:(frame + int(duration_unit)), column] = 1 + frame += fps * duration + + return X + +def subsets(Set): + """ + Finds the starting indices of subsets of consecutive numbers within the provided set. + + This function identifies series of consecutive numbers (subsets) within the input set. + It returns a numpy array of the starting indices of each identified subset. + + Parameters + ---------- + Set : list or array-like + List or array-like object containing the series of numbers to be partitioned into subsets. + + Returns + ------- + subsets : ndarray + A numpy array containing the starting indices of each identified subset of consecutive numbers. + + Examples + -------- + >>> subsets([1, 2, 3, 5, 6, 8, 9, 10]) + # Output: array([1, 5, 8]) + + Notes + ----- + The subsets are defined as series of consecutive numbers. For example, in the array + [1, 2, 3, 5, 6, 8, 9, 10], the subsets of consecutive numbers are [1, 2, 3], [5, 6] + and [8, 9, 10], so the function returns the starting points [1, 5, 8]. + """ + subsets = [] + start = 0 + end = 0 + + # Iterate over array + while end < len(Set): + + # Get first and last frame of each subset + while end + 1 < len(Set) and Set[end + 1] - Set[start] == end - start + 1: + end += 1 + + # Save first and last frame of each outlier subset + subsets.append(Set[start]) + start = end = end + 1 + + return np.array(subsets) + +def get_trials(feature): + """ + Finds the starting indices of trials within the provided design matrix vector. + + This function identifies the start of each trial within the input design matrix vector, + where trials are defined as sequences where the feature equals 1. + + Parameters + ---------- + feature : list or array-like + List or array-like object representing a design matrix vector. The start of each + trial is defined as the index where the feature value equals 1. + + Returns + ------- + feature_trials : ndarray + A numpy array containing the starting indices of each identified trial. + + Examples + -------- + >>> get_trials([0, 0, 1, 1, 1, 0, 0, 1, 1, 0]) + # Output: array([2, 7]) + + Notes + ----- + The trials are defined as sequences where the feature equals 1. For example, in the array + [0, 0, 1, 1, 1, 0, 0, 1, 1, 0], the trials are [1, 1, 1] and [1, 1], so the function + returns the starting points [2, 7]. + """ + # Find the indices where feature is 1 + feature_trials = subsets(np.where(feature == 1)[0]) + + return feature_trials + +def compute_lick_rate(data, trial_onsets, fps): + """ + Compute the lick rate for each trial. + + For each trial, the function computes the number of licks during a 'baseline' period + of 1 second before CS presentation and during a 'trace' period of 1 second starting + 2 seconds after CS presentation. The lick rate for the trial is then computed as + the number of licks in the trace period minus the number of licks in the baseline period. + + Parameters + ---------- + data : ndarray + 1D numpy array containing lick data. Each element corresponds to a frame, and its + value indicates whether a lick occurred in that frame (1) or not (0). + + trial_onsets : ndarray + 1D numpy array containing the onset times (in frames) of each trial. + + fps : int + Frame rate of the data (frames per second). + + Returns + ------- + lick_rates : list + List of lick rates for each trial. + + Examples + -------- + >>> lick_data = np.random.randint(0, 2, 600) # Mock lick data + >>> trial_onsets = np.array([100, 300, 500]) # Mock trial onset times + >>> fps = 30 # Frame rate + >>> lick_rates = compute_lick_rate(lick_data, trial_onsets, fps) + """ + lick_rates = [] + + for i in range(len(trial_onsets)): + + trial_start = trial_onsets[i] + # Baseline -1 s before CS presentation + baseline_licks = np.sum(data[(trial_start-fps):trial_start]) + # Number of licks in trace period + trace_licks = np.sum(data[trial_start+(2*fps):trial_start+(3*fps)]) + # Corrected lick rate + lick_rate = trace_licks - baseline_licks + + lick_rates.append(lick_rate) + + return lick_rates + +def store_indices(animals, days, sessions, outpath): + """ + Store cumulative index (based on X matrix length) for each session, day, and animal, + as well as trial indices for CS+ and CS- trials in a nested dictionary structure. + + :param animals: List of animal names + :param days: List of days + :param sessions: List of sessions + :param outpath: Path to the output directory + :return: A nested dictionary containing the cumulative indices and trial indices + """ + # Initialize an empty dictionary + X = {animal: {day: {} for day in days} for animal in animals} + + # Iterate over all animals, days, and sessions + for animal in animals: + for day in days: + # Initialize the cumulative count + cumulative_count = 0 + + for session in sessions: + # Load design matrix + X_matrix = np.loadtxt(outpath.joinpath(f"X_{animal}_{day}_{session}.csv"), delimiter=",") + + # Here we are assuming 'CS+' info is in column 0 and 'CS-' info is in column 2 + trial_types = ['CS+', 'CS-'] + for trial_type, column in zip(trial_types, [0, 2]): + feature = X_matrix[:, column] + trial_indices = get_trials(feature) + + # Store the trial indices in the nested dictionary + if session not in X[animal][day]: + X[animal][day][session] = {} + X[animal][day][session][trial_type] = trial_indices + + # Update the cumulative count + cumulative_count += len(X_matrix) + + # Store the cumulative count in the nested dictionary + X[animal][day][session]['Cumulative Index'] = cumulative_count + + return X + + ############ ### VSDI ### ############ @@ -243,35 +471,39 @@ def split_data(data, labels, axis=-1, attr=1): """ Splits the provided data based on the given labels. - The function partitions a multidimensional data array into smaller slices, based on the shapes provided in the labels list. The slices are then stored in a dictionary, where the keys are determined by the `attr` attribute of the info list. + The function partitions a multidimensional data array into smaller slices, + based on the shapes provided in the labels list. The slices are then stored in a dictionary, + where the keys are determined by the `attr` attribute of the info list. Parameters ---------- data : ndarray - Multidimensional array to be partitioned. + Multidimensional array to be partitioned. labels : list - List of tuples, where each tuple contains an info list and a shape integer. Example: - [ - (['A07', 'Day1', 'ATC1'], 30000), - (['A07', 'Day1', 'ATC2'], 30000) - ] + List of tuples, where each tuple contains an info list and a shape integer. + Example: + [ + (['A07', 'Day1', 'ATC1'], 30000), + (['A07', 'Day1', 'ATC2'], 30000) + ] axis : int, optional - The axis along which the data array is to be sliced, by default -1 (the last axis). + The axis along which the data array is to be sliced, by default -1 (the last axis). attr : int, optional - The index of the attribute in the info list that will be used as a key in the resulting dictionary, by default 1 (the second item). + The index of the attribute in the info list that will be used as a key in the resulting dictionary, + by default 1 (the second item). Returns ------- partitioned_data : dict - A dictionary where keys are the extracted attribute from the info list, and values are the partitioned slices of the input data. + A dictionary where keys are the extracted attribute from the info list, + and values are the partitioned slices of the input data. Examples -------- >>> data = np.arange(60000).reshape((2, 30000)) >>> labels = [(['A07', 'Day1', 'ATC1'], 30000), (['A07', 'Day1', 'ATC2'], 30000)] >>> split_data(data, labels, axis=0, attr=1) - # Output: - # {'Day1': [array([0, 1, ..., 29998, 29999]), array([30000, 30001, ..., 59998, 59999])]} + {'Day1': [array([0, 1, ..., 29998, 29999]), array([30000, 30001, ..., 59998, 59999])]} """ # Start index for slicing start = 0 diff --git a/pipeline_vsdi/visualization/vsdi_visualization.py b/vsdi/visualization.py similarity index 100% rename from pipeline_vsdi/visualization/vsdi_visualization.py rename to vsdi/visualization.py From 6f266d73ccfb6e96aad44f4eb807c156154f3843 Mon Sep 17 00:00:00 2001 From: dabadav Date: Thu, 15 Jun 2023 22:55:58 +0200 Subject: [PATCH 40/67] More Docs --- docs/source/index.rst | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/docs/source/index.rst b/docs/source/index.rst index 23cf903..4388848 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -6,7 +6,24 @@ VSDI Pipeline ========================================= -Preprocessing tools for voltage sensitive dye imaging data +Package for handling voltage sensitive dye imaging data + +.. graphviz:: + + digraph architecture { + rankdir=LR; + node [shape=box, style=filled, color=lightblue]; + + "VSDI data" [shape=ellipse, color=lightgrey]; + "VSDI data" -> "io"; + "io" -> "session"; + "io" -> "utils"; + "io" -> "dimensionality\nreduction"; + "session" -> "utils"; + "session" -> "dimensionality\nreduction"; + "dimensionality\nreduction" -> "visualization"; + "utils" -> "visualization"; + } .. toctree:: :maxdepth: 1 From fc95df0d46665fc6b46b23fb941c67c9414ec43e Mon Sep 17 00:00:00 2001 From: dabadav Date: Fri, 16 Jun 2023 15:07:16 +0200 Subject: [PATCH 41/67] More Docs --- vsdi/{linear_dim_red.py => dim_reduction.py} | 0 vsdi/{session.py => embeddings.py} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename vsdi/{linear_dim_red.py => dim_reduction.py} (100%) rename vsdi/{session.py => embeddings.py} (100%) diff --git a/vsdi/linear_dim_red.py b/vsdi/dim_reduction.py similarity index 100% rename from vsdi/linear_dim_red.py rename to vsdi/dim_reduction.py diff --git a/vsdi/session.py b/vsdi/embeddings.py similarity index 100% rename from vsdi/session.py rename to vsdi/embeddings.py From 6597c69209ea439c5c36676a88ebd55c4a9b2608 Mon Sep 17 00:00:00 2001 From: dabadav Date: Fri, 16 Jun 2023 16:19:10 +0200 Subject: [PATCH 42/67] Visualization functions --- docs/source/index.rst | 4 ++-- docs/source/vsdi.dim_reduction.rst | 7 +++++++ docs/source/vsdi.embeddings.rst | 7 +++++++ docs/source/vsdi.linear_dim_red.rst | 7 ------- docs/source/vsdi.rst | 4 ++-- docs/source/vsdi.session.rst | 7 ------- vsdi/visualization.py | 11 +++++------ 7 files changed, 23 insertions(+), 24 deletions(-) create mode 100644 docs/source/vsdi.dim_reduction.rst create mode 100644 docs/source/vsdi.embeddings.rst delete mode 100644 docs/source/vsdi.linear_dim_red.rst delete mode 100644 docs/source/vsdi.session.rst diff --git a/docs/source/index.rst b/docs/source/index.rst index 4388848..2e98f26 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -30,8 +30,8 @@ Package for handling voltage sensitive dye imaging data :caption: Code Documentation vsdi.io - vsdi.linear_dim_red - vsdi.session + vsdi.dim_reduction + vsdi.embeddings vsdi.utils vsdi.VAE vsdi.visualization diff --git a/docs/source/vsdi.dim_reduction.rst b/docs/source/vsdi.dim_reduction.rst new file mode 100644 index 0000000..1bca8cc --- /dev/null +++ b/docs/source/vsdi.dim_reduction.rst @@ -0,0 +1,7 @@ +vsdi.dim\_reduction module +========================== + +.. automodule:: vsdi.dim_reduction + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/source/vsdi.embeddings.rst b/docs/source/vsdi.embeddings.rst new file mode 100644 index 0000000..184cdd4 --- /dev/null +++ b/docs/source/vsdi.embeddings.rst @@ -0,0 +1,7 @@ +vsdi.embeddings module +====================== + +.. automodule:: vsdi.embeddings + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/source/vsdi.linear_dim_red.rst b/docs/source/vsdi.linear_dim_red.rst deleted file mode 100644 index 68b9536..0000000 --- a/docs/source/vsdi.linear_dim_red.rst +++ /dev/null @@ -1,7 +0,0 @@ -vsdi.linear\_dim\_red module -============================ - -.. automodule:: vsdi.linear_dim_red - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/source/vsdi.rst b/docs/source/vsdi.rst index 134bdd1..16aecc8 100644 --- a/docs/source/vsdi.rst +++ b/docs/source/vsdi.rst @@ -8,9 +8,9 @@ Submodules :maxdepth: 4 vsdi.VAE + vsdi.dim_reduction + vsdi.embeddings vsdi.io - vsdi.linear_dim_red - vsdi.session vsdi.utils vsdi.visualization diff --git a/docs/source/vsdi.session.rst b/docs/source/vsdi.session.rst deleted file mode 100644 index 74836e1..0000000 --- a/docs/source/vsdi.session.rst +++ /dev/null @@ -1,7 +0,0 @@ -vsdi.session module -=================== - -.. automodule:: vsdi.session - :members: - :undoc-members: - :show-inheritance: diff --git a/vsdi/visualization.py b/vsdi/visualization.py index 961686d..bd1b02c 100644 --- a/vsdi/visualization.py +++ b/vsdi/visualization.py @@ -6,11 +6,11 @@ import seaborn as sns from scipy.stats import sem from scipy.ndimage import gaussian_filter1d -sns.set_theme(context='notebook', - style='white', - font_scale=1.5, - rc = {'axes.spines.top':False,'axes.spines.right':False, - 'image.cmap':plt.cm.jet}) +# sns.set_theme(context='notebook', +# style='white', +# font_scale=1.5, +# rc = {'axes.spines.top':False,'axes.spines.right':False, +# 'image.cmap':plt.cm.jet}) ########################################################## @@ -81,7 +81,6 @@ def plot_fingerprints(PCs, raw_mask): plt.axis('off') def create_frame(vsdi, t): - # VSDI - Should be already masked plt.imshow(vsdi[:,:,t], cmap=plt.cm.jet) plt.axis('off') From 72fe3b4fc26f94d302932be104f01af33238c62d Mon Sep 17 00:00:00 2001 From: Dante Avino Date: Fri, 16 Jun 2023 22:17:24 +0200 Subject: [PATCH 43/67] New apply_mask function in vsdi.utils --- vsdi/utils.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/vsdi/utils.py b/vsdi/utils.py index 3bf0f21..b3efd8f 100644 --- a/vsdi/utils.py +++ b/vsdi/utils.py @@ -272,6 +272,27 @@ def store_indices(animals, days, sessions, outpath): ### VSDI ### ############ +def apply_mask(vsdi, mask): + """ + Apply a mask to a numpy array and set masked values to NaN. + + Parameters + ---------- + vsdi : np.ndarray + The input array on which to apply the mask. + mask : np.ndarray + The mask to be applied. Same shape as `vsdi`. Masked locations are where mask equals 0. + + Returns + ------- + np.ndarray + A new array with the mask applied (i.e., positions where mask equals 0 are set to NaN). + + """ + vsdi_copy = vsdi.copy() + vsdi_copy[np.where(mask == 0)] = np.nan + return vsdi_copy + def pca_ica(vsdi, mask): X = vsdi.transpose(2, 0, 1) X = X*mask From b01881d2244ccb67b700817b76b4899488eca46f Mon Sep 17 00:00:00 2001 From: Dante Avino Date: Sun, 18 Jun 2023 02:43:37 +0200 Subject: [PATCH 44/67] New VAE function to extract referecence latent dim image --- vsdi/VAE.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/vsdi/VAE.py b/vsdi/VAE.py index 2cf32ce..c7e55b3 100644 --- a/vsdi/VAE.py +++ b/vsdi/VAE.py @@ -353,3 +353,13 @@ def linear_decoding_error(embeddings, features, norm=1): return mean_dist +def extract_hidden_features(model, clamping_value=1.): + features = [] + for i in np.arange(model.latent_dim): + input_ = torch.zeros(model.latent_dim).to('cuda') + input_[i] = clamping_value + input_ = input_.unsqueeze(0) + img = model.decoder(input_)[0].detach().cpu().numpy() + features.append(np.transpose(img, (1,2,0))) + + return np.array(features) From 4358cc8d69f349008ffe2703d6332b7416d2853c Mon Sep 17 00:00:00 2001 From: dabadav Date: Thu, 22 Jun 2023 20:17:08 +0200 Subject: [PATCH 45/67] Changed config --- .readthedocs.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 82dfe1f..c1c3d37 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -16,7 +16,7 @@ build: # Build documentation in the "docs/" directory with Sphinx sphinx: - configuration: docs/conf.py + configuration: docs/source/conf.py # Optionally build your docs in additional formats such as PDF and ePub # formats: From c250b51d6aa33a748a07e0d67c73acfc870e0024 Mon Sep 17 00:00:00 2001 From: dabadav Date: Thu, 22 Jun 2023 20:28:19 +0200 Subject: [PATCH 46/67] Changed doc config --- .readthedocs.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index c1c3d37..424e1ef 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -26,6 +26,6 @@ sphinx: # Optional but recommended, declare the Python requirements required # to build your documentation # See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html -# python: -# install: -# - requirements: docs/requirements.txt \ No newline at end of file +python: + install: + - requirements: docs/source/requirements.txt \ No newline at end of file From 669e039b9b43f18dc0c0877fd1e251330ed1181e Mon Sep 17 00:00:00 2001 From: dabadav Date: Thu, 22 Jun 2023 20:31:00 +0200 Subject: [PATCH 47/67] Changed doc config --- docs/source/requirements.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 docs/source/requirements.txt diff --git a/docs/source/requirements.txt b/docs/source/requirements.txt new file mode 100644 index 0000000..57279be --- /dev/null +++ b/docs/source/requirements.txt @@ -0,0 +1,2 @@ +sphinx==6.2.1 +autodocsumm==0.2.11 From 6514c9117123e71023e1e3a90b36a718f4215130 Mon Sep 17 00:00:00 2001 From: dabadav Date: Thu, 22 Jun 2023 20:32:26 +0200 Subject: [PATCH 48/67] Changed config, added dependencies --- docs/source/requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/source/requirements.txt b/docs/source/requirements.txt index 57279be..611699c 100644 --- a/docs/source/requirements.txt +++ b/docs/source/requirements.txt @@ -1,2 +1,3 @@ sphinx==6.2.1 autodocsumm==0.2.11 +numpydoc==1.5.0 \ No newline at end of file From 7c1a3ebf609cc83ffa3198212812ee1d09760815 Mon Sep 17 00:00:00 2001 From: dabadav Date: Thu, 22 Jun 2023 20:37:55 +0200 Subject: [PATCH 49/67] Changed config, added dependencies --- docs/source/requirements.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/source/requirements.txt b/docs/source/requirements.txt index 611699c..63089e0 100644 --- a/docs/source/requirements.txt +++ b/docs/source/requirements.txt @@ -1,3 +1,5 @@ sphinx==6.2.1 +sphinx-rtd-theme==1.2.2 +sphinx_design==0.4.1 autodocsumm==0.2.11 numpydoc==1.5.0 \ No newline at end of file From cc613e2c9eeafc0073ce94780f6c1cd134b43fc8 Mon Sep 17 00:00:00 2001 From: dabadav Date: Thu, 22 Jun 2023 20:40:37 +0200 Subject: [PATCH 50/67] Changed config, added dependencies --- docs/source/requirements.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/source/requirements.txt b/docs/source/requirements.txt index 63089e0..f2e9239 100644 --- a/docs/source/requirements.txt +++ b/docs/source/requirements.txt @@ -2,4 +2,5 @@ sphinx==6.2.1 sphinx-rtd-theme==1.2.2 sphinx_design==0.4.1 autodocsumm==0.2.11 -numpydoc==1.5.0 \ No newline at end of file +numpydoc==1.5.0 +graphviz==0.20.1 \ No newline at end of file From 7231fdfb916eb2fb0b9230b82355bcf625ba7d2f Mon Sep 17 00:00:00 2001 From: dabadav Date: Thu, 22 Jun 2023 20:45:02 +0200 Subject: [PATCH 51/67] Changed config, added dependencies --- docs/source/conf.py | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/source/conf.py b/docs/source/conf.py index 1ac006f..a5e9ce6 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -8,6 +8,7 @@ import os import sys +import graphviz sys.path.insert(0, os.path.abspath('../..')) project = 'VSDI Pipeline' From 58b84ff30e9ec02fc35333e2bdccd1679db35232 Mon Sep 17 00:00:00 2001 From: dabadav Date: Thu, 22 Jun 2023 20:48:22 +0200 Subject: [PATCH 52/67] Changed config, added dependencies --- docs/source/conf.py | 1 - docs/source/requirements.txt | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index a5e9ce6..1ac006f 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -8,7 +8,6 @@ import os import sys -import graphviz sys.path.insert(0, os.path.abspath('../..')) project = 'VSDI Pipeline' diff --git a/docs/source/requirements.txt b/docs/source/requirements.txt index f2e9239..c70e56c 100644 --- a/docs/source/requirements.txt +++ b/docs/source/requirements.txt @@ -1,6 +1,5 @@ -sphinx==6.2.1 +Sphinx==6.2.1 sphinx-rtd-theme==1.2.2 sphinx_design==0.4.1 autodocsumm==0.2.11 numpydoc==1.5.0 -graphviz==0.20.1 \ No newline at end of file From ef9386336055420f1a1d2edf0a8540375e2c5e97 Mon Sep 17 00:00:00 2001 From: dabadav Date: Thu, 22 Jun 2023 20:55:45 +0200 Subject: [PATCH 53/67] Changed config, added dependencies --- docs/source/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/requirements.txt b/docs/source/requirements.txt index c70e56c..0f80e0c 100644 --- a/docs/source/requirements.txt +++ b/docs/source/requirements.txt @@ -1,4 +1,4 @@ -Sphinx==6.2.1 +sphinx==6.2.1 sphinx-rtd-theme==1.2.2 sphinx_design==0.4.1 autodocsumm==0.2.11 From a65abd7e9536149bf8727ca9fbc59c6d63d82555 Mon Sep 17 00:00:00 2001 From: dabadav Date: Thu, 22 Jun 2023 21:01:22 +0200 Subject: [PATCH 54/67] Changed config, added dependencies --- .readthedocs.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 424e1ef..056544b 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -9,7 +9,9 @@ build: os: ubuntu-22.04 tools: python: "3.11" - # You can also specify other tool versions: + commands: + - pip install . + # You can also specify other tool versions: # nodejs: "19" # rust: "1.64" # golang: "1.19" From d7e41021710deb71088a5884c9874f8abeb70738 Mon Sep 17 00:00:00 2001 From: dabadav Date: Thu, 22 Jun 2023 21:07:18 +0200 Subject: [PATCH 55/67] Changed config, added dependencies --- .readthedocs.yaml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 056544b..45c6d50 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -9,9 +9,6 @@ build: os: ubuntu-22.04 tools: python: "3.11" - commands: - - pip install . - # You can also specify other tool versions: # nodejs: "19" # rust: "1.64" # golang: "1.19" @@ -29,5 +26,7 @@ sphinx: # to build your documentation # See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html python: - install: - - requirements: docs/source/requirements.txt \ No newline at end of file + install: + - method: pip + path: . + - requirements: docs/source/requirements.txt \ No newline at end of file From 899ce385e2cd290b58d24a07246168dbe473ce9b Mon Sep 17 00:00:00 2001 From: dabadav Date: Thu, 22 Jun 2023 21:12:21 +0200 Subject: [PATCH 56/67] Changed config, added dependencies --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index c32924b..f0895a6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,6 +16,7 @@ scikit-learn = "^1.2.2" opencv-python = "^4.7.0.72" statannotations = "^0.5.0" h5py = "^3.8.0" +torch = "^2.0.0" [build-system] requires = ["poetry-core"] From d1e3dd1294c32faaff5b46014b4c5878328d85bd Mon Sep 17 00:00:00 2001 From: dabadav Date: Thu, 22 Jun 2023 21:26:03 +0200 Subject: [PATCH 57/67] Changed config, added dependencies --- docs/source/requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/source/requirements.txt b/docs/source/requirements.txt index 0f80e0c..2d43fd7 100644 --- a/docs/source/requirements.txt +++ b/docs/source/requirements.txt @@ -3,3 +3,4 @@ sphinx-rtd-theme==1.2.2 sphinx_design==0.4.1 autodocsumm==0.2.11 numpydoc==1.5.0 +graphvhiz==0.20.1 \ No newline at end of file From 2662b2149cf4410cc3415ec75ea6b4fc408424da Mon Sep 17 00:00:00 2001 From: dabadav Date: Thu, 22 Jun 2023 21:29:04 +0200 Subject: [PATCH 58/67] Changed config, added dependencies --- docs/source/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/requirements.txt b/docs/source/requirements.txt index 2d43fd7..f2e9239 100644 --- a/docs/source/requirements.txt +++ b/docs/source/requirements.txt @@ -3,4 +3,4 @@ sphinx-rtd-theme==1.2.2 sphinx_design==0.4.1 autodocsumm==0.2.11 numpydoc==1.5.0 -graphvhiz==0.20.1 \ No newline at end of file +graphviz==0.20.1 \ No newline at end of file From f4d10f49d8b5ed66e61073378c427a01ee4c63a4 Mon Sep 17 00:00:00 2001 From: dabadav Date: Thu, 22 Jun 2023 22:02:45 +0200 Subject: [PATCH 59/67] Changed config, added dependencies --- docs/source/conf.py | 3 ++- docs/source/requirements.txt | 3 +-- docs/source/vsdi.rst | 23 ----------------------- 3 files changed, 3 insertions(+), 26 deletions(-) delete mode 100644 docs/source/vsdi.rst diff --git a/docs/source/conf.py b/docs/source/conf.py index 1ac006f..3240bfa 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -8,6 +8,7 @@ import os import sys +import shutil sys.path.insert(0, os.path.abspath('../..')) project = 'VSDI Pipeline' @@ -29,7 +30,7 @@ templates_path = ['_templates'] exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] - +graphviz_dot = shutil.which('dot') # -- Options for HTML output ------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output diff --git a/docs/source/requirements.txt b/docs/source/requirements.txt index f2e9239..63089e0 100644 --- a/docs/source/requirements.txt +++ b/docs/source/requirements.txt @@ -2,5 +2,4 @@ sphinx==6.2.1 sphinx-rtd-theme==1.2.2 sphinx_design==0.4.1 autodocsumm==0.2.11 -numpydoc==1.5.0 -graphviz==0.20.1 \ No newline at end of file +numpydoc==1.5.0 \ No newline at end of file diff --git a/docs/source/vsdi.rst b/docs/source/vsdi.rst deleted file mode 100644 index 16aecc8..0000000 --- a/docs/source/vsdi.rst +++ /dev/null @@ -1,23 +0,0 @@ -vsdi package -============ - -Submodules ----------- - -.. toctree:: - :maxdepth: 4 - - vsdi.VAE - vsdi.dim_reduction - vsdi.embeddings - vsdi.io - vsdi.utils - vsdi.visualization - -Module contents ---------------- - -.. automodule:: vsdi - :members: - :undoc-members: - :show-inheritance: From ce00ff343c21ebe857f63d48ab7f6df38ae589fe Mon Sep 17 00:00:00 2001 From: dabadav Date: Thu, 22 Jun 2023 22:11:07 +0200 Subject: [PATCH 60/67] Changed config, added dependencies --- docs/source/conf.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 3240bfa..d695b8d 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -8,7 +8,6 @@ import os import sys -import shutil sys.path.insert(0, os.path.abspath('../..')) project = 'VSDI Pipeline' @@ -30,11 +29,10 @@ templates_path = ['_templates'] exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] -graphviz_dot = shutil.which('dot') - # -- Options for HTML output ------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output +graphviz_dot = 'dot' html_theme = 'sphinx_rtd_theme' # html_theme = 'pydata_sphinx_theme' # html_context = {"default_mode": "light"} From db35d0bd2b26b6ce588123bc0e56dd288330c254 Mon Sep 17 00:00:00 2001 From: dabadav Date: Thu, 22 Jun 2023 22:18:06 +0200 Subject: [PATCH 61/67] Changed config, added dependencies --- docs/source/requirements.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/source/requirements.txt b/docs/source/requirements.txt index 63089e0..4197a0b 100644 --- a/docs/source/requirements.txt +++ b/docs/source/requirements.txt @@ -2,4 +2,5 @@ sphinx==6.2.1 sphinx-rtd-theme==1.2.2 sphinx_design==0.4.1 autodocsumm==0.2.11 -numpydoc==1.5.0 \ No newline at end of file +numpydoc==1.5.0 +pygraphviz==1.11 From e729acdf382afa21e32310057f9b877f538ba5ab Mon Sep 17 00:00:00 2001 From: dabadav Date: Thu, 22 Jun 2023 22:24:48 +0200 Subject: [PATCH 62/67] Changed config, added dependencies --- .readthedocs.yaml | 4 +++- docs/source/requirements.txt | 1 - 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 45c6d50..4d4bcf4 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -29,4 +29,6 @@ python: install: - method: pip path: . - - requirements: docs/source/requirements.txt \ No newline at end of file + - requirements: docs/source/requirements.txt +system_packages: + - graphviz diff --git a/docs/source/requirements.txt b/docs/source/requirements.txt index 4197a0b..0f80e0c 100644 --- a/docs/source/requirements.txt +++ b/docs/source/requirements.txt @@ -3,4 +3,3 @@ sphinx-rtd-theme==1.2.2 sphinx_design==0.4.1 autodocsumm==0.2.11 numpydoc==1.5.0 -pygraphviz==1.11 From 7f2fd265b918bf156fd8446307866b7813e235ed Mon Sep 17 00:00:00 2001 From: dabadav Date: Thu, 22 Jun 2023 22:27:21 +0200 Subject: [PATCH 63/67] Changed config, added dependencies --- docs/source/requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/source/requirements.txt b/docs/source/requirements.txt index 0f80e0c..4197a0b 100644 --- a/docs/source/requirements.txt +++ b/docs/source/requirements.txt @@ -3,3 +3,4 @@ sphinx-rtd-theme==1.2.2 sphinx_design==0.4.1 autodocsumm==0.2.11 numpydoc==1.5.0 +pygraphviz==1.11 From 0d17314c69701d82964d9eb7fa69081c5c257636 Mon Sep 17 00:00:00 2001 From: dabadav Date: Thu, 22 Jun 2023 22:28:38 +0200 Subject: [PATCH 64/67] Changed config, added dependencies --- .readthedocs.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 4d4bcf4..57272af 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -30,5 +30,3 @@ python: - method: pip path: . - requirements: docs/source/requirements.txt -system_packages: - - graphviz From cd7ddcdcc54a5367ea9a4ad3d08ff379b362604e Mon Sep 17 00:00:00 2001 From: dabadav Date: Thu, 22 Jun 2023 22:35:33 +0200 Subject: [PATCH 65/67] Changed config, added dependencies --- docs/source/index.rst | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/docs/source/index.rst b/docs/source/index.rst index 2e98f26..bdb823f 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -8,22 +8,7 @@ VSDI Pipeline Package for handling voltage sensitive dye imaging data -.. graphviz:: - - digraph architecture { - rankdir=LR; - node [shape=box, style=filled, color=lightblue]; - - "VSDI data" [shape=ellipse, color=lightgrey]; - "VSDI data" -> "io"; - "io" -> "session"; - "io" -> "utils"; - "io" -> "dimensionality\nreduction"; - "session" -> "utils"; - "session" -> "dimensionality\nreduction"; - "dimensionality\nreduction" -> "visualization"; - "utils" -> "visualization"; - } +.. image:: _static/diagram.png .. toctree:: :maxdepth: 1 From 404e5ab82671bd7fa83965b8db24270fa6ca4057 Mon Sep 17 00:00:00 2001 From: dabadav Date: Thu, 22 Jun 2023 22:56:45 +0200 Subject: [PATCH 66/67] Changed config, added dependencies --- docs/source/requirements.txt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/source/requirements.txt b/docs/source/requirements.txt index 4197a0b..0ef03d4 100644 --- a/docs/source/requirements.txt +++ b/docs/source/requirements.txt @@ -1,6 +1,4 @@ sphinx==6.2.1 sphinx-rtd-theme==1.2.2 -sphinx_design==0.4.1 autodocsumm==0.2.11 -numpydoc==1.5.0 -pygraphviz==1.11 +numpydoc==1.5.0 \ No newline at end of file From eaa702f51337db2b39e414d86e534a2f457b781f Mon Sep 17 00:00:00 2001 From: dabadav Date: Thu, 22 Jun 2023 23:03:25 +0200 Subject: [PATCH 67/67] Changed config, added dependencies --- docs/source/_static/diagram.dot | 14 ++++++++++++++ docs/source/_static/diagram.png | Bin 0 -> 17906 bytes 2 files changed, 14 insertions(+) create mode 100644 docs/source/_static/diagram.dot create mode 100644 docs/source/_static/diagram.png diff --git a/docs/source/_static/diagram.dot b/docs/source/_static/diagram.dot new file mode 100644 index 0000000..6697b7a --- /dev/null +++ b/docs/source/_static/diagram.dot @@ -0,0 +1,14 @@ +digraph architecture { + rankdir=LR; + node [shape=box, style=filled, color=lightblue]; + + "VSDI data" [shape=ellipse, color=lightgrey]; + "VSDI data" -> "io"; + "io" -> "session"; + "io" -> "utils"; + "io" -> "dimensionality\nreduction"; + "session" -> "utils"; + "session" -> "dimensionality\nreduction"; + "dimensionality\nreduction" -> "visualization"; + "utils" -> "visualization"; +} \ No newline at end of file diff --git a/docs/source/_static/diagram.png b/docs/source/_static/diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..79b1a16fbc19caf0b979e5ca220a5c45a78f37ad GIT binary patch literal 17906 zcmb`vbzD`^_bo~&AT1yY2uKJ>N+T`ZU6M+7cOxYtAR-`LA`Q|FA|)Ut-2&1L(sd_( z@4cVTz3=_r`{Ul_=X1^x4*TrA*IaXsImTEgOi4i!3!NAp0RaI^T1rd>0Rfp8UI(Kg z!Q;am;#qh?F_e`QL%6>Am)@8YgMjb|L0as&ntSrrjGJ1FCOPVE(j98*phmHfA0H$9 zkrcje3pl9S++JZARo^JoDyY%EXLHxANPQ!>eEY4oxbdBKM1}7m@81V)9!Kd6{rHfA z(A>Z0{(-i?#^ZZ{-8MBH0s1ZYR0IT$d&)Dn|Gh$R38+E2d6ho+s2K6)g*iuA9R@rL z3%tE$7%f-4tx|!ehaQ$Kuk7{&!JG?s4Bi{q%{U*6*0#=a5<((L8|Td-5h73=ux_4(v!3fB-@F(wzc~&J4&wjgx1={tG2QmBtwbr&z?J8SWxTy8!<{alCm-dVfeF$ky?z)2d8KhOM!76FQ5J}W=m1XQOV=w z<(-_I)YjJKAdZluVSj*08J(Mx6N>x&PFR=m2Pta3e*-13#hC5z@Nf^ACPq4IP&@ZM z85x;{g#{V~TY?--3>76MA(QrStqGO@FP^>b3JAj(3&aTNx5L^O7I4rpFv8Ud2nc@LYrxRgXO8bt$7!n#Z8uz7 zy%|p*V4??qH!RInqfb%jvlsf`ry&9KyxfvN9xzK$^) zQGAa$+7kkF?9f2m@8U~)?kag7`&Yu-4Rwt|4>Hy0;V0e1O=V?lLAdcfMY*}T`URmq zg_!o;4|3|n4GiXXk*TPtC`R~5-FwaYld#Yqn@i8%~8X8}wGh|{Zn!NH66}ptfVNzmcse+32>Rs1uS+^JOluvSRytDQpf)e>nv>&P{DecO%!$r+D`=!Ol=g6T@ z<8=)WSE%MFEH5v^On><|IyyS?qeU9+o;T7FybZV+&jTaz!rLGJ8#OXzxw%rO73t}Z z*xAeBj@HzC>Rj~MSL3OG-(!&rPPez4Oq7|#Jx}A@@8x)lt>@NXiCW|#jxdS!#tOkd z>Wx_DN`KnQpFealM85BI?sOTK#m2@K71^xxrCeTI{QUXTUa-8Pf`gOuakSJrv#*zE zwo326u`!Fq&AUh)pPby_zPB)W^id`oEyM5X)a>l&P_3Bo`j zIn#(-&c?A1Q@=EBmwK?@gC<)UdXFPWH zPZt_=>D7C>rdW(GjMHW>!*=BnoUNY@Blu$n^(=k){Q2{jFQ%rZf?h|AaJSRb5h%p6 z1|O1=roa`!xx-^}^5)i-i*tHMwmh%npC9jt*z+-G(pB;dOFxNG*4ETulJWCAefpG# zhbNf9s!b_y{qk2_B$3vqbL`H_$)gso{*=?z4)u{54U^oKS-ZIDX2(}ueV2W+zDR;Q z-nyH$$X;XQf=laT%=B14jI44{;iyfh6eti_m!2E@$q9H zpQtwc8-<01!+LT9uVJ-GQ>#Rg37j48%t4_0`}=dLDX-s~K3?AwEiGtXhxqW}R-_F3 z+ZubzTWV_>=lZX`JIXj)O?@YREFcXq3+p1M_u``6;PR6I^LdXX=$;kXu+tkAPZ<@ArEi%W^CHY-Ai7`G@5E2V(0kyMlAn) zytYO_R+_%gD4yWYy#}w1%|(OjgB_jn%>(s0?Qz$;yEU3oK+8}rUr`7di;!N4U^Dnc+&&9)ik%SJ_L82)4C#} zoFO#>i-g_m)p({!NjX~ynb616lby`zV*(~7j3nmEPK9+LSCv3*%~zB-16Odvh0E=E zk`Ew%K`eI1GN{p48Z`SZc0`b{8V043U2GwyX(%hdvazu-HCGc$un zBO^#;1)I~|vJKV5Z>(S?)u8xG;GzfLXVyJgiZ@_3Xp(z`8-h(rOi0LOKJW+*;&LCW zf;BQSvOi5o5-nPa8Y#eEGldct4Kj39RTVQcGtW0zc}rGn469pDhj7tWyRTAccnP4W zu&}V`=;(aXz^!nB)UQ+yiKI0Yhn&w9R!X5{6xq-h`6M0(%9t)Sw_0JHdt_w3e}3Fe z{*_M^(?yLZO&R^$1c%qn$d^7kYlBqV$0NG&KRNJZ5;GQ!Ev@4f%03yR7*^L_IJLn9-&aRxfNtpG{_ zgg+6~nh*R$v#c*@QRfPI+rDt0MW5Q|eR47*F4_;{vcSN=sHmudf`agHSy(HjrKNS@ znBQn`f?geJ^u}1p&P@IB_h1YTVw;7wFm|)PzsGjpYMvpiLqW`@5DghVqK}sP*t6tw z_IIM*%}%hlM)XiGrpwrFwxR3Ck8f*CtgLrS60B@(i{L}msC4DM9djZt}`-*s*~*zC&)l~$n+@)=4$mK+o0Ldbt# z$CfNGov;Q7Kf(*^jt4L|n|aINYhtu+#!JmNf{g}K#&TJf(Qhgn6F+{e@H*Z$@Vkta zqfty?d(6gGrc-Upr1s&+CoL&+yFb@v{@^AtcXKsCU6jmF`b|%1J(8~uC!8OuL`P7o zE9ka89YMlPf4|YcM&ou=r>wlZI!X<#Vk%m&2zv0ZN-IroBY=X94GoxBSUQ>G2*Vjn z?VQ0P6cB!RVQTcTGTHy2pmerMm>9&*$Gb&Db9dp?ana!SfOEQx(St<*%24BN7lc>C zXG*yoQhexQX<}4zd!jA#H8z8_$a2M`R@WD%>C>lAQ`L6$wYB16VsZ&=!7VQ<%%vxf zeQe(n3uRS_(8ogIlS}Bw!^dwoWG%jh4g(YO@4oaqL%I+b7he@!%wxM*DV&mdh`Hf3#g^$xbZv&EaE{^aJZbZ& z`7Y<(LBp92_@P3&&uH<&EbHmQ#4?rW)adVBD`u-yR#ZIda51KgUTq7*PvW-g`}q?S z6O$iK0HDMC3L*zuQg6pr(w#eZY7!+iHOE?8TRS^f!daSf>%(Ky(&nJj;fffuP5k(= z+DY#Bklj>ngRoiPQA`&U02tj&C!#HDTYtJ@AgDFz2p9=_Mn=?$enV;Ja1yV182KnW zU3VrM;n1Y>Y?UGOY%x)n`F@xfGys1C)acti(5`9nS>NYnt9-2rUyu*vL$TP=d1j9LNy?F8DU#zgrsdb6kIVy8bqV{B%&Gg-N@lIHhCiEb!I(V)&bFFQNC z4&ydQqT?H36%`c`k?(*fa7A2QT>-4lc^^bT<|rw#TU?fQwYPsD;Q1F4G+?E~`r+R~ zo}Qi%DKJj*#3((kE}mTp!!qTz9#?_`QAQUQ743aeB_~gVt1oaNeTF1rvy5XEs=-uJ zsWQizr$$eJejDjI1eJ-&<345^x(H5|i&=-mq~c=c2#KtrH3D?;nI+2?TQ!O!1wV7f za4vRNvcuuTuFvPLO@DrRo;5hE{>jxlElCRhtXP`*Lq$bJP*Bih2-+Hh*3o0*n8fvcVY;TVsVh?FI94S@AmVB@MW9zG*$5h<9 zP%G1?1n4*6%%D0)b;d|hyHr@a8h4M&WUCNihQRryDA>hU+HUbk@YgymPPR1mG;6aN zwxLz}xo({Zaz|?~Xp4rTRj|FWDtgyC&+l`lc6zY8Il-PF2W{lThY!_|bwyW>p&x@r zP$a|qc*ZTw@5;kQVC7M9B}LKQF)_-!QJss9wIUf`1IIEsKbDQc4Pi}?LkS#A)sV56 zV->--wEg-oQH=;vjZh%D6Z8qwS)3HzA&(9AZKc=of zCMISmTlW6V8h3Vfo-Q|2OcV669LHMFo>IOvtC_gDiFnXP-gLwiDtR2Q)83t_&aw)o zvEZUXAVVYhFSxdzR3i@b<#M@SULMcE5>O98bNBSLTvmFXt`Dm`iod;_Q1gZJtGOm0 zfVR10;mkK+^SU>-X9moHQqjhr zC!r$@4}bd>T3ic`#HJ>}@b+KtS(Xr-jq^osK`@2#Q70rNq29h-q+OZsu=N7ry%aUy zzp?aV2pUuq&-2A7p(^VM%J`lHxi3jcNo?Ov&(5F)fE>!-OP0E~4jn0gf#~RH5-#hP zYzgb$n&}A~P1!2cc(ETpevFN!Kr>^)k$goNZ4UVI<;wv=hN($6DpHOR%cd{h5^%}C zv)>N$h^5yG8<|hNzON^B`g?6C$9)!;H>GdhKL45m78oPp#*|%i3a1rev{X>X0M}=a zv*Nwei|^k>1k-RXe`%99tze?GwzYk>@$s>nV?|m>T(%l8qmJn+D=YgbpBzOlL>MO4 zolPD1`ZW~J5nfW!1OJ-QFA(WakZ2!2HUT*2-jTa*ANa1m{v7U0uU;br&^`IBdKv=s z1L&5OM3wTsV4tKOKr z4o=nQD>+3?53?U5AF+@f45dJV67GWfkaD1>TWLldK|c1w2gp6UXvqBMb&%3!_1F`B zGV9eri1I??#=|qfRM_JZ(Y56xb9A(h?;uYf+vIaj*q=Vidm9NWTZs;e3v@d?4;6A0 zQqmK#{MTojy=RTaH=w-=6L5@5fQx4Y`YU3$TTglM@R| z$zYabeN9a+VS0C;va&L}>CY46QWk@z2In=EAlz6Pc^MhY)p}bWeliw5zNwCmFFxFJ z2m@#+(B^l(+n8Y&o?+lZ8u&@btXt!I=}AIDa#B3oG{Rd^o|(DOo5Y=asx35D_~PJv zr`d0>{XQV}lB@OCw=tkzL3O?>(i6v2@3_;N~#K2H+ z8-q~p)6m&H1Jac=w^ME#-Re`YF%d4QC(Na}ZH%2BK;BiZ{a?+j*)bP>KQOJgV z*OzXw@qKARMpsXdRi)L4RA_Pi%4A^4F}b=Ck@j<6-zLu;C#SVXY4;Jf)U*AC+=TmA zpA~5`uu}3bI1^5FtYz6M6luI0^=szLrzkF+u&&je#ZyU+>ZPLM0 zEG_fZ=pVy-KU0sM?EfdrPIoGYpN|@(n_r1)_% zlpK z5IWmE{p&-FR~7B-MR~?D+Z1T#RJC+W>%G zT_S06YpuoylCep7 z)rj)VIke^E-X$cw5D^h^cXx+69nWHL(?WE2cb^%cX$}IX*YMdwpwZ{t6?#r0A|kko zdZ(4XeD#8(ttrTVd?P-1cz8``>kPn_LP9X8ceR(cR#2r?P)UU+L9z1i&?zW?qqBO=koGz{T#D}#YSNY>(yD8fp#4~(_7%dsPTdZ0P1IDW$nGWgySqc z?jZTIg2li>7M66_+ac;_w%u?MpPh2)7R`Po?fJ%liGf~=*LC2s$IrXebZA~OVIwNJ z7&vsfhi8nB^8`c3_AIFcSw=(`vNUm01kYERQ^joN;;-DkALah&n3D%hg)hH@lPqd1 zQ{b;dR!*6K8a19?lefoku5$jlyO)qHyX zsRQo?QVr$+!s-Sp>+0&7R71S?Cvt`ZeZ8>}8XSy8#(%OpnB`K4`0Fn+3G|*7y5bh3 zpH-fSthR^W9~>Oit8?BvKAx*}GK1K*ikmn8`Q`huomsK&&J?YhWc;gFM%8qtQNUMC zcc>?S$Q)&q?rEvrTIz|1zdbrS!fNaX`k`=>6d0;ZORI9sh#aQNj_(}`r|W~Cu!BzbcR5O zTY2j8%HOTcE=BU$0{yD*({8NSN$i#NL(YEjtIvk^=bCK)<{T)CX2{XBvQt$j`(B>0 zK6nSKzsdXb*X-;SFlH%yZpE|q64@$1{Rn!W*eA#xo$M{%^iVLNr~6A#u0W1RYmiY^ zzAN%Zj%H(HW31U4)`}?FZIr7qeN#h2LmQh2T83 zXie~$nthJ_vqF@ZFy`YvQ=*}H-QP3Yt9m;AV;YGyRdqrftFmK-QM#qJ(EviB|#B6vJ&hTH4?Vpm|#q>BA9O+wjPCv62*4-@Y>@ipB40IAKxx z0**%w9)nYr1M-vWaac1l{Xiq2$E6!+1wC%`CaXL;Q4ARmKd7+UQvdT?rhRS zxR1QpCFg%eI9CrcH?FFY5cOqqeBQ;~7Iu1v7A4i>wGkC~ZdMZ6p#zIDj^NMn1D=X1 z(U14m(J1n(jw-U}sAn6rr}`=#4mX~ih5O~0kn%si5ZB%hZWV&M_c^P_ysf^*@AM*! zyy}RQ^SMW#X~QjB+!KSJ`g4LAXcVM+9hsj5qA9K%NHkB6Fxs2zpH4sW$Ni3lgj1~l zJ1&-Mn`BusA_HqZcFw#;;4h$4;Pd6BrHT06zpfVmucvOA@l;4iC`idi`}mLJDQJFg zalbE$ZiLBX|5|ef(hV0)ty;5o0mQ81ttoET&2bH-ppyT`3s6oh@d^qMl+jw?wU!2J&4TL)#9mM>(mD9PcLaKs!QO~Fc^;}ogR8i$|TVcRx zfpT#Xb>f3YfgUSk#wJa@Z%1UOXjWQq(K>Uz!E+H)qA_>|KrkKKR^YX@Ufs;u<*ld# zyPXv$2d@x?GOWJ+$r`Iu$pS-g*&@}lcq9bxcG-M zMrO9jTmL%dq4dx1>Q*c&X`9+j1MS=|`_6Wfj`6f?u#gtIyFb=fs~;DZK2OhxZxwuN zbqneFMyqg9+~V@`Xtr$puV25QGTGvhj~6l0XCPxV^3IKN6R>pchw>vcU)979nF?5xTV_tR=!Qt>mlU z%<4K*>@|uTA2VEXXIG}Dr_bhA@@7&To%AV#q>SH6_Ure!b>gE1edfEKWxXC~VN2lH zkj`AEF!Pq%sy%7g?|B}Cd+wrOx-bXXVtw52Xnpl| zlG{?VSGnui$rC|r64PLThS9H0%OJFj>FHc?7tV1s`<5%nL}03a$Nvi9$B?5_aD%m>bA*N%#K~S$a(?%x zTwJ3d7oY6Tb8fT5_dt_nH&e%HHCl*_iv5n5)AC@s7t4nV<3987(9jf^ECNw+V7gpg zkKW#6P@9qfT^8z6czF2Y;$lyCw-_Zfl~KOuTh;U{4h{|;muD`%zPP-);ju-E{2>eN0^&D8khy#A29@oaC)O2qf}xl3PU z?vJv}@4K-iY6W>y%-(5RTU(mNx~B{67~W|lbp*>zoISJr=aQ6!@$m#{mmbw38TJ?_ z)r-p?+ZlR!r#AI#Pr3}aZ}Z!VKU?X?msHrEmxT;ks3#lHSipk8s_kKteS*nZcZ z$|=03bK$Y!-YIe^#Uia{7>&AjnMevqgF?fGFTH0anKTFQ4k>O=kg@shM`>=SoY5XT z6M8Mbb;+H_QWEhM{~JH_S*5GnN7DIFa6MNwO?H@;E4Sczy5-E5fB?kpoVm;pERrfn zokm8BppDYAczAk}0Ww(bP3nv!4G#;0YCAYOT2)#a_U>IWo5@>8Le{1HEg%RSot&s} z(VTf_AoQlD_@E@qTvyTaja9YP$HtD78g*9LOjUta8YTuB!q}TPZ$NGm@;({p?X~&4 zItZ=FRGCQ+j?l$!4@>jrWF;6NSm@}?cYn9QL;=Wmb#Q3GKVSwh-kZn?e>yfa1fa7v zC52QZR}htpg)&;pt)$E}$ZQXUdiGSzLcvRnr1166y7&UtURWfJ_B~OIR53e>dV-a1 zlGD|5AOEaatgZ66yO)Fs%@g7dTi&+1b0X-rK741+3>bPvGL|prw zJ^YX-I7I)^4~>!;cjF#siTIoajAruZzu&;P{jQE6rI5=|c zcsMsPIq3we`Ffp(iT~&2R zJe*J-n(t#4YZG@&g~Kh(xT~M{Hg@B4j#}E$mQ=9vcvE*eHJke0N~tXRKKg8<%h6uRo(LoZ zV`{-SQTj#lIkm1k${K3!j5KwHxw}0sbJewuGo_4UODma=yIlap`WBxc^_hJ5fi&)4Ow-)^CQ6 zf!=Vnw88Vxh=?R@;+je%H@v{>_xrmwX+&J6eInaQk;Xh7jnwIvqxM~=aF|4@o(QK zeCYp}u<(!$&UA^9MeW`Q6EGw7^(jb7N)BE939JLI5GC-Hkr6Wa!y7N1?eJtZAQgzp zGA+iF*13=e#KhX*Fj0sHrv>iw+jg>lt05;_R0caEBBT?IaI!E52!E}p7#9rSad!qK!^WPh#<>NKB)@n|LzZg5aQN8g|!11fWUz1M~u4mJXU{NCD}D$tmi zC{*0s)k}m_s1Xv6a0$?ZQ&UqD5{NEF5YxFdjv}MjQFade1D1Ze%MurWU$kfl?i-)LD-;lBGD5u#Nl8@j{U=1>A^Mi z^_qFY(K6ZHo%inD1Mm%)&pj(Fd*o;A#^ssc=w$XS`O(i`9}}Ph^!P|s^r*V>p>9@( zF&h>ZmU=v^jp*dD_sc}~9L<|mKe*a2MH2%Q`uu9#`}gl-V;{%&IFwr`DdBD(f62-U zblV1Cq@aN93);exIsy?BorCYkF%ns&T8uEGc*8G| z2iBpz18YSAF#NQO_B=R3<4~RVmwLch5g#Al-0TMxU%$~an_r1Jo+`+8x@P{*p9;fv zKwTQ<78ZG1HvUK1ApUNFO|)yt(P|njr9H-FckpSz{~(^;8)V@)RlF>xX;}JTh0C1U z27Rdre}n_Ho=43=s%?M>WiIxntjlc0gsB42DGNoJ3!B-cZeD#M)^Wp+jgeT1xUv32;8yB_olX(MOeWi ztYF7``V_JR#BgS&$Rpg}oQn>0EjZc>zihxskv?ed%&VuVd7tpgGW_an@i=co1CyA8 z?uG?v_FZSjR!V||!z z1A?2XPMz};j;3n%BF!CGmmshz*okD|UN5hk-?QsJmIXf7nHSu}gXUl@CZ))%T+}8H z76~XD!tU5^vY&qqM1isKp9+hiib@^Vvh2x<#q(*gBA9$wx%2jx-jL6uyNtucUh`Ez z#<)flZPKlN5kK*jV%EwmvR}sY^E<0pB;Vm5O0s)VtKf)9K=}H4?v0p z&bYf<1`N~$=&=UUQ>y;0i{E#R=wtJNk}WEVxVAIHN+Eq1AdI#>W%u)a07NK|$zc4L zP2{v{y4df5ociFwgWP)O^jL5wIPpA$!ougqV3ZIRCJmSghK=CU9phN~%=c2gyRrz} z8gzmese{Ies>8&xc>mL$%j7&r%+UY$@83F?jiavaaz#gH=g%s6V5;MD+qORIekjbI z$HZ}Smcid&KHXKV)nz^tW+c?q&;Yj-eNU~q^}E)`YJ^e3kIeJH@d@VcubZBdzt`40 zAPs{E2C}ss5VowWH(~;aY}nY?>&(RF4j{ALlms|Uuu&Gl1xG}H3JCgOKF%s(*B`~C zJQTJ6$Tg2Ur@EKaFDQCOC(;w{2}~W*9Xo zV!FUve0XqR6<3bf`}v6rKX?KZF*56vRU)()JBse8XX?a$3nJ%k3|2nG94P_+4Oq8h zW!eWpcLL+kg&%$i#v}*eNoXOM^&3ud(tJVJ(A3qP24eX>IL|@;zwyMS_Y0nHmiNCr zQr^8QfGjE`)cm5{)WhAqrmn7Px-jAW$fQ67HX#qn$jJvVE68N$UxSfl8X@Bhp<42{ zuj7N_+nrGW+1TFCp9JGl`U=y;>`8!;J`K(Rp3c+15tygjf=eFC)%^EhxG`_T!tQ|a zXm=MHn@{{6Y=wL1>rc2>mIgmXtl{kRWUKILR(FMK<~NfTgtNM|)LYu{v|baYrka4)+)8X&St+Nd2aHhOs1JqvMaB&0bPXsEu zzFtD^0#VyQAT;n#vrnV*rZ5xfWP?24LjfQ3*=B(X51-kMa~#;0rEKk4d?l^V6TKv<`49@ij&_xoCL2Jj&&FxpxlTcS!GvVaI;u$@{X**U*zm zi)GdhPU+U65|qweSJ*BcRM2ikbVs$+6ddN?hPAefylU$xDsDnFfiA-^lU%=<-|RB(y~C@+hSkNX zF|OVOL65z+i1;~OCS^h4W;kLcWP*!5;Ad8z&7>E_vTU&6Jkpzb%D{MdWgw(4t@K4S zXrMc+6-E9I4jJ!yOxh#MSaqy*mQX6GCv=)_PlSCYN{2bX4IcTkv(pSjFOWj^_V&&} z(Q5Yd1CNKh`w1}m8D&_*tK(Jj-pt(lQxE>Rs7JB;4!E}7VD6Qy%-`5p7uF+j*98nW z6VhCTPB)fAsG1ii%MkIuq@G&1{YoL}u5slsRlR$DnORid=yfcK_F{sMdA7+-L8!R~ z%fQd?tXndN^nM6(vRD7hv{{P((3Nb5Shynp(PZo`@+K#N!;W!3uq1uVPh6h2dpUL8 zzInKX{}%Vxpb6vK34Edj@@j`zyJn@h3&{pnL$U06rNYjvfm6dV^m0@@0CREGmcW{)`S9MSr?rHxmlY7eX$* z@sjclC--<;vV7DguhYWtDL)-d`Cff96Z*9OT1#N4o~rktCnrhJc@)%*j$!Y(kG}17 zc#<(bVsJ>pKG>8*8!dJ=FC#+w*xUV*P2@+8qTdoBdhGfr)k$Bi>JvA+W1`c!i((hu z;c7)X1uq#c1!lh#q06HsCzHmPSsu5Js$A`x4$s5FFq#a%{=F-*vT%f%y8kRp*NKG` zOETyED#2>UkOug&(<|?WwIL#-U_N-7{`vEt@lqpH?1wz|zx}~91!Wgjow1Qo);1E- zVa%I$pt8heWs{Bue`3ptwt9AOCd$mwNTY;%je zqcl;pc^OUxhv@YVUS|5=4*i`wUhZ3t(uheVWwu|m=nD7husEI1HfIc2n)Z8I9HOs{ zn){@$&u6FQ`4X4Fh=cZ%8PR_dnmcB#ua6!-UIJ|%h}JnMzbPqtN=gHO;sFE;`tX}K z)2ZcS>uFNrsiU9dPcd{`rG`|8je(Fujdxo8t{PMq^{e^F>%-@daQ_QFx>E0B$4eP8 zN{VI?7rva&XcTR1Y{h%I>zPzv(x%G=j4%F>mrU~=DsHba9s!M^)Jp4{Z$lIC`&HJ9 zkdFAMcGEw7c3cQ4c!Sb>FnY~*`6l;AE+APFuXcQlv&zni94IRz`>(y**`hN=^)@JI`^mu;w z!Nx|!cIfmafFe@YP}xKPqfkaxQu6Fo)zK+(VDY6ZfzTJFJml6dH*{rG)a6FhT&P0Y z%$peG0cW^|0RjSalOOLXAa^q{GV*($JPi{&+wWlkdQ?!jG<*sV^*g zGwCDukBVL#El&vHmDV(TKH2QA2cwdXa8az&|0n<2Ni-brkJIUT!pwiaI#fr4zPQl) zYxwtWo=H~uCS4s1B&hwWEf_kf z4Zr585W0MhB$5l9Op}jDtm+$zAWtk30rT#kH+*3AyM*!qA>-e_O0N&elHe}HM9t-Q zQN`+X^oJ)tWkIJkW*n?Ebj+X8`iMfz1^@{_r&2if?=iI#_G zjZHS^$6h4B{)lex3peF$ueWh=!SeA}Mzn|Id||?ma{F9E!s~$hM57?f*&LoFjk48c z>gpf*H3+^AvS$pxm>%U`-Cv4}C7UZf1q!Qj3xS)S{)r`N7rv~p)8Q`7~e`& zmG{5{Mu;;m=#t*6pIg?E?H3W_Xzs)TN=UEL%46!pbcyYyblb?9>3rrlqB2ZfY8`G5|eXkpq)ide=Jnn14vk>3JAK=R(0x3l-Rk zChP=TAB1(l=m@L_G~vK7j)2nzb_Lkk?ZAI;10Mr!Sdy{oKrSV!H&!-%`+K4xa!Km_ zc@FCEnZ37RN1@HV_?||OgJtlfU7c-|fbQMB5Z5xL<3`YY%UcvH5aHV!16zW&JoO0&HPhUHxHLI;=O2jkuuQiRggEaUZIlGY=3xH*W{!L{ZTX_Q45VU#Px#5r)gg z%Gy%f3$4V&L@f|0;N()HSD#t3VSgJQzQL|kE#F!BzqX1adJpAM|HomS!O#Z{M1QIP za2uXSn?%0vHzW+*ghYE?G$DU(?~E31ORuFc!34 zySXYO5wO_{+-lIbgMrlN`br?F*B7DyZY5+o9bn)J)}d*HmKk=&{a}$bXmg-bD`=)B3@o5E zIX*uADg@V9UNV6c9G38W5XDN~V^+_n32MR4unF6_C374sUL&St%du=|d~u)TU*Z2uyT7QXSdQ}xygoIJ4mNPG@8PC6M zz~=w_%)Z}@+3t#TTj!LNMBPM!J72KK;K)dO&M$E4>vJuoR?a)t*4)veiE*gaZBPbU zgChiY!Jg;j{u%(Xo!Lg6&OGS&Y^OKY=SiQw-2L{INPCi#AkQPOc$zjzaNmf{ z{z5FR?{xlVy{qL;-?*C4&WZ%_Fh@zF|{M_R4CV;cc8o>;b__X{7}(HklxmnYil#PT{`k z@vOVM@kYnTpeYa>2Ya}^m(E5F(n-($v;Gm%pU{I{R7M7B{cR+~f0lS}L2xYF^E?zx z>t8uwpr;38F#Ia5A9iV#_r^lEL898v)==)hz z%5dV^tAptTICYmT_{jyGms?47|J4g3E=pz!b(+}1Pfz72@p>a>mmx*JxxC78VMxmn zc;UACF)Ig0gzkE41Dt7=YXi$Rlk=-VT)S?b^zE1xYjFdRBkoVvb~MpF zKj#0hI-~s1lf!H4Kbsz0k$wFiVz|T=cBV%xz=Xo&9&QB*ljFWQ=4}LXbYN~Fi-AW| zBJKGLM4D(R`*#I}g}{BRE}lJo*SR?FYw7|UEZn*9fj8T9hxH!pl}{1$023uaP6Dkr zP3U^ez^`51LH&0+A$XbZ-eol(-xZqs$aN;b)&66`N$=8=GN{heJ?*D^DDK&-(@e^v zb8#IvNcvH@W&a#wJITJj4kS$-42k4ZRbl;0622shgXQ-{eoVG_%zhyS-v(CWU+|g* z@61WqME$3=$=Cq5&&NaRQiqjOgP*g0{aHO)1m(1BZ9=w-^mD!$jIGyky<0-en6wJV zsV#zyqGY;_-}6R(&b;ncORGw-K+{sakPX_pDOl890Ch1b+eS{@WR@Lhn>Nc z2$oXF-e?rjayE+(>+8JKC-zr6?jc35PSJ|h2Adcgn(TZ^iPrd#W@c`h3O+QEAMCkN zj;P4^s<4A`b8G^u?r-Zx{9O^ioO!moheM?(O@V&>-~wxQ#0Zvg*|_VyGMxvW2*9y9 z)3!UydEVB>wgI^G42=FYD3f$hWe^7VVebXnEhLdQ!jIl}83ToBJ^q!5-4yl~Yl$xJ z4~%By3C6x@Mmp@wq{~7_=C;A6kPRrT5<45`^ABi7YS}1t~#NgfAWVqL5-~Zl1d>G7=0{l!Tu$ zO~2i>vBT63(vV5(ir*V3Klxoi!^N-i{2uK1lcCPnIpHr}4>rdH*m-ZC!BWQyzZ)i>u3XD0ey_Z-$t0{uFZlDo0cFD|GXx zVtw=G21AVWVCb^!H1%7D9+`<}>II{JBjjZ;_CG2D%`nesladQE2E{V{pOC>`a#(}T9?nEGmYgF51|YWb@lJ`Fi#ob5S)YI0o2R$^~KkfR+Wx8X;lRRhSi86y6uS?`y z1gY7dx?@a@?Qgy*PR1M6YkqSv(vMT>c_Y&5PohN6hsdcP1woP{IJLnPk@~hs zcINBzYm3BN-{ZdKaRS5WmQFb%9~Bk_hvm`q6J-OcAot`lRWCPwurX5$MdjK3Ucdj; zp+&{XYRa!<|Nn_#Q^c?+hONd|gLQlh9mzl=N5$ERE~lJ9dY#`q!Rka9!lcdB(Iryb zo}(yb#Vmx5@8N#~