From 3bc1e6689936b4fd31e98f2ff7e8d2e7a25fdbdf Mon Sep 17 00:00:00 2001 From: njbernstein Date: Thu, 18 Feb 2021 08:48:50 -0800 Subject: [PATCH 01/15] First stab at moving to scvi-tools --- solo/solo.py | 406 ++++++++++++++++----------------------------------- 1 file changed, 123 insertions(+), 283 deletions(-) diff --git a/solo/solo.py b/solo/solo.py index 7cb50d0..cae02da 100755 --- a/solo/solo.py +++ b/solo/solo.py @@ -2,24 +2,23 @@ from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter import json import os -import anndata import numpy as np -from sklearn.metrics import roc_auc_score, roc_curve -from scipy.sparse import issparse -from collections import defaultdict - -import scvi -from scvi.dataset import AnnDatasetFromAnnData, LoomDataset, \ - GeneExpressionDataset, Dataset10X -from scvi.models import Classifier, VAE -from scvi.inference import UnsupervisedTrainer, ClassifierTrainer +from sklearn.metrics import roc_auc_score, accuracy_score, \ + average_precision_score +from scipy.special import softmax import torch + +from scvi.data import read_h5ad, read_loom, setup_anndata +from scvi.model import SCVI +from scvi.external import SOLO + +from pytorch_lightning.callbacks.early_stopping import EarlyStopping import umap -from .utils import create_average_doublet, create_summed_doublet, \ - create_multinomial_doublet, make_gene_expression_dataset, \ - knn_smooth_pred_class + +from .utils import knn_smooth_pred_class + ''' solo.py @@ -95,9 +94,6 @@ def main(): ) args = parser.parse_args() - if not args.normal_logging: - scvi._settings.set_verbosity(10) - model_json_file = args.model_json_file data_path = args.data_path if args.gpu and not torch.cuda.is_available(): @@ -116,55 +112,16 @@ def main(): # read loom/anndata data_ext = os.path.splitext(data_path)[-1] if data_ext == '.loom': - scvi_data = LoomDataset(data_path) + scvi_data = read_loom(data_path) elif data_ext == '.h5ad': - adata = anndata.read(data_path) - if issparse(adata.X): - adata.X = adata.X.todense() - scvi_data = AnnDatasetFromAnnData(adata) - elif os.path.isdir(data_path): - scvi_data = Dataset10X(save_path=data_path, - measurement_names_column=1, - dense=True) - cell_umi_depth = scvi_data.X.sum(axis=1) - fifth, ninetyfifth = np.percentile(cell_umi_depth, [5, 95]) - min_cell_umi_depth = np.min(cell_umi_depth) - max_cell_umi_depth = np.max(cell_umi_depth) - if fifth * 10 < ninetyfifth: - print("""WARNING YOUR DATA HAS A WIDE RANGE OF CELL DEPTHS. - PLEASE MANUALLY REVIEW YOUR DATA""") - print(f"Min cell depth: {min_cell_umi_depth}, Max cell depth: {max_cell_umi_depth}") + scvi_data = read_h5ad(data_path) else: msg = f'{data_path} is not a recognized format.\n' - msg += 'must be one of {h5ad, loom, 10x directory}' + msg += 'must be one of {h5ad, loom}' raise TypeError(msg) num_cells, num_genes = scvi_data.X.shape - if args.known_doublets is not None: - print('Removing known doublets for in silico doublet generation') - print('Make sure known doublets are in the same order as your data') - known_doublets = np.loadtxt(args.known_doublets, dtype=str) == 'True' - - assert len(known_doublets) == scvi_data.X.shape[0] - known_doublet_data = make_gene_expression_dataset( - scvi_data.X[known_doublets], - scvi_data.gene_names) - known_doublet_data.labels = np.ones(known_doublet_data.X.shape[0]) - singlet_scvi_data = make_gene_expression_dataset( - scvi_data.X[~known_doublets], - scvi_data.gene_names) - singlet_num_cells, _ = singlet_scvi_data.X.shape - else: - known_doublet_data = None - singlet_num_cells = num_cells - known_doublets = np.zeros(num_cells, dtype=bool) - singlet_scvi_data = scvi_data - singlet_scvi_data.labels = np.zeros(singlet_scvi_data.X.shape[0]) - scvi_data.labels = known_doublets.astype(int) - ################################################## - # parameters - # check for parameters if not os.path.exists(model_json_file): raise FileNotFoundError(f'{model_json_file} does not exist.') @@ -185,7 +142,7 @@ def main(): batch_size = params.get('batch_size', 128) valid_pct = params.get('valid_pct', 0.1) learning_rate = params.get('learning_rate', 1e-3) - stopping_params = {'patience': params.get('patience', 10), 'threshold': 0} + stopping_params = {'patience': params.get('patience', 20), 'min_delta': 0} # protect against single example batch while num_cells % batch_size == 1: @@ -193,226 +150,100 @@ def main(): print('Increasing batch_size to %d to avoid single example batch.' % batch_size) ################################################## - # VAE - - vae = VAE(n_input=singlet_scvi_data.nb_genes, n_labels=2, - reconstruction_loss='nb', - log_variational=True, **vae_params) + # SCVI + setup_anndata(scvi_data) + vae = SCVI(scvi_data, + gene_likelihood='nb', + log_variational=True, + batch_size=batch_size, + **vae_params) if args.seed: - if args.gpu: - device = torch.device('cuda') - vae.load_state_dict(torch.load(os.path.join(args.seed, 'vae.pt'))) - vae.to(device) - else: - map_loc = 'cpu' - vae.load_state_dict(torch.load(os.path.join(args.seed, 'vae.pt'), - map_location=map_loc)) - - # save latent representation - utrainer = \ - UnsupervisedTrainer(vae, singlet_scvi_data, - train_size=(1. - valid_pct), - frequency=2, - metrics_to_monitor=['reconstruction_error'], - use_cuda=args.gpu, - early_stopping_kwargs=stopping_params, - batch_size=batch_size) - - full_posterior = utrainer.create_posterior( - utrainer.model, - singlet_scvi_data, - indices=np.arange(len(singlet_scvi_data))) - latent, _, _ = full_posterior.sequential(batch_size).get_latent() - np.save(os.path.join(args.out_dir, 'latent.npy'), - latent.astype('float32')) - + vae.load(os.path.join(args.seed, 'vae.pt'), use_gpu=args.gpu) else: - stopping_params['early_stopping_metric'] = 'reconstruction_error' - stopping_params['save_best_state_metric'] = 'reconstruction_error' - - # initialize unsupervised trainer - utrainer = \ - UnsupervisedTrainer(vae, singlet_scvi_data, - train_size=(1. - valid_pct), - frequency=2, - metrics_to_monitor=['reconstruction_error'], - use_cuda=args.gpu, - early_stopping_kwargs=stopping_params, - batch_size=batch_size) - utrainer.history['reconstruction_error_test_set'].append(0) - # initial epoch - utrainer.train(n_epochs=2000, lr=learning_rate) - - # drop learning rate and continue - utrainer.early_stopping.wait = 0 - utrainer.train(n_epochs=500, lr=0.5 * learning_rate) - + scvi_callbacks = [] + scvi_callbacks += [EarlyStopping( + monitor='reconstruction_loss_validation', + mode='min', + **stopping_params + )] + vae.train(max_epochs=500, + validation_size=valid_pct, + check_val_every_n_epoch=1, + callbacks=scvi_callbacks + ) # save VAE - torch.save(vae.state_dict(), os.path.join(args.out_dir, 'vae.pt')) - - # save latent representation - full_posterior = utrainer.create_posterior( - utrainer.model, - singlet_scvi_data, - indices=np.arange(len(singlet_scvi_data))) - latent, _, _ = full_posterior.sequential(batch_size).get_latent() - np.save(os.path.join(args.out_dir, 'latent.npy'), - latent.astype('float32')) + vae.save(os.path.join(args.out_dir, 'vae.pt')) - ################################################## - # simulate doublets - - non_zero_indexes = np.where(singlet_scvi_data.X > 0) - cells = non_zero_indexes[0] - genes = non_zero_indexes[1] - cells_ids = defaultdict(list) - for cell_id, gene in zip(cells, genes): - cells_ids[cell_id].append(gene) - - # choose doublets function type - if args.doublet_type == 'average': - doublet_function = create_average_doublet - elif args.doublet_type == 'sum': - doublet_function = create_summed_doublet - else: - doublet_function = create_multinomial_doublet - - cell_depths = singlet_scvi_data.X.sum(axis=1) - num_doublets = int(args.doublet_ratio * singlet_num_cells) - if known_doublet_data is not None: - num_doublets -= known_doublet_data.X.shape[0] - # make sure we are making a non negative amount of doublets - assert num_doublets >= 0 - - in_silico_doublets = np.zeros((num_doublets, num_genes), dtype='float32') - # for desired # doublets - for di in range(num_doublets): - # sample two cells - i, j = np.random.choice(singlet_num_cells, size=2) - - # generate doublets - in_silico_doublets[di, :] = \ - doublet_function(singlet_scvi_data.X, i, j, - doublet_depth=args.doublet_depth, - cell_depths=cell_depths, cells_ids=cells_ids, - randomize_doublet_size=args.randomize_doublet_size) - - # merge datasets - # we can maybe up sample the known doublets - # concatentate - classifier_data = GeneExpressionDataset() - classifier_data.populate_from_data( - X=np.vstack([scvi_data.X, - in_silico_doublets]), - labels=np.hstack([np.ravel(scvi_data.labels), - np.ones(in_silico_doublets.shape[0])]), - remap_attributes=False) - - assert(len(np.unique(classifier_data.labels.flatten())) == 2) + latent = vae.get_latent_representation() + # save latent representation + np.save(os.path.join(args.out_dir, 'latent.npy'), + latent.astype('float32')) ################################################## # classifier # model - classifier = Classifier(n_input=(vae.n_latent + 1), - n_hidden=params['cl_hidden'], - n_layers=params['cl_layers'], n_labels=2, - dropout_rate=params['dropout_rate']) - - # trainer - stopping_params['early_stopping_metric'] = 'accuracy' - stopping_params['save_best_state_metric'] = 'accuracy' - strainer = ClassifierTrainer(classifier, classifier_data, - train_size=(1. - valid_pct), - frequency=2, metrics_to_monitor=['accuracy'], - use_cuda=args.gpu, - sampling_model=vae, sampling_zl=True, - early_stopping_kwargs=stopping_params, - batch_size=batch_size) - - # initial - strainer.train(n_epochs=1000, lr=learning_rate) - - # drop learning rate and continue - strainer.early_stopping.wait = 0 - strainer.train(n_epochs=300, lr=0.1 * learning_rate) - torch.save(classifier.state_dict(), os.path.join(args.out_dir, 'classifier.pt')) - - - ################################################## - # post-processing - # use logits for predictions for better results - logits_classifier = Classifier(n_input=(vae.n_latent + 1), - n_hidden=params['cl_hidden'], - n_layers=params['cl_layers'], n_labels=2, - dropout_rate=params['dropout_rate'], - logits=True) - logits_classifier.load_state_dict(classifier.state_dict()) - - # using logits leads to better performance in for ranking - logits_strainer = ClassifierTrainer(logits_classifier, classifier_data, - train_size=(1. - valid_pct), - frequency=2, - metrics_to_monitor=['accuracy'], - use_cuda=args.gpu, - sampling_model=vae, sampling_zl=True, - early_stopping_kwargs=stopping_params, - batch_size=batch_size) - - # models evaluation mode - vae.eval() - classifier.eval() - logits_classifier.eval() - - print('Train accuracy: %.4f' % strainer.train_set.accuracy()) - print('Test accuracy: %.4f' % strainer.test_set.accuracy()) - - # compute predictions manually - # output logits - train_y, train_score = strainer.train_set.compute_predictions(soft=True) - test_y, test_score = strainer.test_set.compute_predictions(soft=True) - # train_y == true label - # train_score[:, 0] == singlet score; train_score[:, 1] == doublet score - train_score = train_score[:, 1] - train_y = train_y.astype('bool') - test_score = test_score[:, 1] - test_y = test_y.astype('bool') - - train_auroc = roc_auc_score(train_y, train_score) - test_auroc = roc_auc_score(test_y, test_score) - - print('Train AUROC: %.4f' % train_auroc) - print('Test AUROC: %.4f' % test_auroc) - - train_fpr, train_tpr, train_t = roc_curve(train_y, train_score) - test_fpr, test_tpr, test_t = roc_curve(test_y, test_score) - train_t = np.minimum(train_t, 1 + 1e-9) - test_t = np.minimum(test_t, 1 + 1e-9) - - train_acc = np.zeros(len(train_t)) - for i in range(len(train_t)): - train_acc[i] = np.mean(train_y == (train_score > train_t[i])) - test_acc = np.zeros(len(test_t)) - for i in range(len(test_t)): - test_acc[i] = np.mean(test_y == (test_score > test_t[i])) + # todo add doublet ratio + solo = SOLO.from_scvi_model(vae) + solo.train(500, + lr=learning_rate, + train_size=.8, + validation_size=.1, + check_val_every_n_epoch=1, + early_stopping_patience=20) + if learning_rate > 1e-4: + solo.train(200, lr=1e-4, train_size=.8, validation_size=.1, + check_val_every_n_epoch=1, + early_stopping_patience=20) + + solo.save(os.path.join(args.out_dir, 'classifier.pt')) + + logit_predictions = solo.predict() + + is_doublet_known = solo.adata.obs._solo_doub_sim == 'doublet' + is_doublet_pred = np.argmin(logit_predictions, axis=1) + + validation_is_doublet_known = is_doublet_known[solo.validation_indices] + validation_is_doublet_pred = is_doublet_pred[solo.validation_indices] + training_is_doublet_known = is_doublet_known[solo.train_indices] + training_is_doublet_pred = is_doublet_pred[solo.train_indices] + test_is_doublet_known = is_doublet_known[solo.test_indices] + test_is_doublet_pred = is_doublet_pred[solo.test_indices] + + valid_as = accuracy_score(validation_is_doublet_known, validation_is_doublet_pred) + valid_roc = roc_auc_score(validation_is_doublet_known, validation_is_doublet_pred) + valid_ap = average_precision_score(validation_is_doublet_known, validation_is_doublet_pred) + + train_as = accuracy_score(training_is_doublet_known, training_is_doublet_pred) + train_roc = roc_auc_score(training_is_doublet_known, training_is_doublet_pred) + train_ap = average_precision_score(training_is_doublet_known, training_is_doublet_pred) + + test_as = accuracy_score(test_is_doublet_known, test_is_doublet_pred) + test_roc = roc_auc_score(test_is_doublet_known, test_is_doublet_pred) + test_ap = average_precision_score(test_is_doublet_known, test_is_doublet_pred) + + print(f'Training results') + print(f'AUROC: {train_roc}, Accuracy: {train_as}, Average precision: {train_ap}') + + print(f'Validation results') + print(f'AUROC: {valid_roc}, Accuracy: {valid_as}, Average precision: {valid_ap}') + + print(f'Test results') + print(f'AUROC: {test_roc}, Accuracy: {test_as}, Average precision: {test_ap}') # write predictions # softmax predictions - order_y, order_score = strainer.compute_predictions(soft=True) - _, order_pred = strainer.compute_predictions() - doublet_score = order_score[:, 1] + softmax_predictions = softmax(logit_predictions, axis=1) + doublet_score = softmax_predictions[:, 0] np.save(os.path.join(args.out_dir, 'no_updates_softmax_scores.npy'), doublet_score[:num_cells]) np.savetxt(os.path.join(args.out_dir, 'no_updates_softmax_scores.csv'), doublet_score[:num_cells], delimiter=",") - np.save(os.path.join(args.out_dir, 'no_updates_softmax_scores_sim.npy'), doublet_score[num_cells:]) # logit predictions - logit_y, logit_score = logits_strainer.compute_predictions(soft=True) - logit_doublet_score = logit_score[:, 1] + logit_doublet_score = logit_predictions[:, 1] np.save(os.path.join(args.out_dir, 'logit_scores.npy'), logit_doublet_score[:num_cells]) np.savetxt(os.path.join(args.out_dir, 'logit_scores.csv'), logit_doublet_score[:num_cells], delimiter=",") - np.save(os.path.join(args.out_dir, 'logit_scores_sim.npy'), logit_doublet_score[num_cells:]) @@ -443,7 +274,6 @@ def main(): np.savetxt(os.path.join(args.out_dir, 'softmax_scores.csv'), solo_scores, delimiter=",") - if args.expected_number_of_doublets is not None: k = len(solo_scores) - args.expected_number_of_doublets if args.expected_number_of_doublets / len(solo_scores) > .5: @@ -457,37 +287,41 @@ def main(): else: is_solo_doublet = solo_scores > .5 - is_doublet = known_doublets - new_doublets_idx = np.where(~(is_doublet) & is_solo_doublet[:num_cells])[0] - is_doublet[new_doublets_idx] = True + np.save(os.path.join(args.out_dir, 'is_doublet.npy'), is_solo_doublet[:num_cells]) + np.savetxt(os.path.join(args.out_dir, 'is_doublet.csv'), is_solo_doublet[:num_cells], delimiter=",") - np.save(os.path.join(args.out_dir, 'is_doublet.npy'), is_doublet[:num_cells]) - np.savetxt(os.path.join(args.out_dir, 'is_doublet.csv'), is_doublet[:num_cells], delimiter=",") - - np.save(os.path.join(args.out_dir, 'is_doublet_sim.npy'), is_doublet[num_cells:]) + np.save(os.path.join(args.out_dir, 'is_doublet_sim.npy'), is_solo_doublet[num_cells:]) np.save(os.path.join(args.out_dir, 'preds.npy'), order_pred[:num_cells]) np.savetxt(os.path.join(args.out_dir, 'preds.csv'), order_pred[:num_cells], delimiter=",") - np.save(os.path.join(args.out_dir, 'preds_sim.npy'), order_pred[num_cells:]) - smoothed_preds = knn_smooth_pred_class(X=latent, pred_class=is_doublet[:num_cells]) np.save(os.path.join(args.out_dir, 'smoothed_preds.npy'), smoothed_preds) if args.anndata_output and data_ext == '.h5ad': - adata.obs['is_doublet'] = is_doublet[:num_cells] - adata.obs['logit_scores'] = logit_doublet_score[:num_cells] - adata.obs['softmax_scores'] = doublet_score[:num_cells] - adata.write(os.path.join(args.out_dir, "soloed.h5ad")) + scvi_data.obs['is_doublet'] = is_solo_doublet[:num_cells] + scvi_data.obs['logit_scores'] = logit_doublet_score[:num_cells] + scvi_data.obs['softmax_scores'] = doublet_score[:num_cells] + scvi_data.write(os.path.join(args.out_dir, "soloed.h5ad")) if args.plot: import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt import seaborn as sns + + train_solo_scores = solo_scores[solo.train_indices] + validation_solo_scores = solo_scores[solo.validation_indices] + test_solo_scores = solo_scores[solo.test_indices] + + train_fpr, train_tpr, _ = roc_curve(training_is_doublet_known, train_solo_scores) + val_fpr, val_tpr, _ = roc_curve(validation_is_doublet_known, validation_solo_scores) + test_fpr, test_tpr, _ = roc_curve(test_is_doublet_known, test_solo_scores) + # plot ROC plt.figure() plt.plot(train_fpr, train_tpr, label='Train') + plt.plot(val_fpr, val_tpr, label='Test') plt.plot(test_fpr, test_tpr, label='Test') plt.gca().set_xlabel('False positive rate') plt.gca().set_ylabel('True positive rate') @@ -495,27 +329,33 @@ def main(): plt.savefig(os.path.join(args.out_dir, 'roc.pdf')) plt.close() + train_precision, train_recall, _ = precision_recall_curve(training_is_doublet_known, train_solo_scores) + val_precision, val_recall, _ = precision_recall_curve(validation_is_doublet_known, validation_solo_scores) + test_precision, test_recall, _ = precision_recall_curve(test_is_doublet_known, test_solo_scores) # plot accuracy plt.figure() - plt.plot(train_t, train_acc, label='Train') - plt.plot(test_t, test_acc, label='Test') - plt.axvline(0.5, color='black', linestyle='--') - plt.gca().set_xlabel('Threshold') - plt.gca().set_ylabel('Accuracy') + plt.plot(train_precision, train_recall, label='Train') + plt.plot(val_precision, val_recall, label='Validation') + plt.plot(test_precision, test_recall, label='Test') + plt.gca().set_xlabel('Recall') + plt.gca().set_ylabel('Precision') plt.legend() - plt.savefig(os.path.join(args.out_dir, 'accuracy.pdf')) + plt.savefig(os.path.join(args.out_dir, 'precision_recall.pdf')) plt.close() # plot distributions + obs_indices = solo_scores.test_indices[solo_scores.test_indices < num_cells] + sim_indices = solo_scores.test_indices[solo_scores.test_indices > num_cells] + plt.figure() - sns.distplot(test_score[test_y], label='Simulated') - sns.distplot(test_score[~test_y], label='Observed') + sns.distplot(solo_scores[sim_indices], label='Simulated') + sns.distplot(solo_scores[obs_indices], label='Observed') plt.legend() - plt.savefig(os.path.join(args.out_dir, 'train_v_test_dist.pdf')) + plt.savefig(os.path.join(args.out_dir, 'sim_vs_obs_dist.pdf')) plt.close() plt.figure() - sns.distplot(doublet_score[:num_cells], label='Observed') + sns.distplot(solo_scores[:num_cells], label='Observed') plt.legend() plt.savefig(os.path.join(args.out_dir, 'real_cells_dist.pdf')) plt.close() From 29ca8e28d917635b081302bfc90a255ad08ee8c8 Mon Sep 17 00:00:00 2001 From: njbernstein Date: Thu, 18 Feb 2021 08:51:12 -0800 Subject: [PATCH 02/15] requirements.txt to scvi-tools --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index eb327de..6503090 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,7 +2,7 @@ ConfigArgParse pandas seaborn tqdm -scvi==0.6.7 +scvi-tools leidenalg torch scanpy From cab0a78bcbcee41d5dcc784cb5977c6b721bca52 Mon Sep 17 00:00:00 2001 From: nick Date: Thu, 18 Feb 2021 13:21:06 -0800 Subject: [PATCH 03/15] almost runs all the way thru --- solo/solo.py | 106 ++++++++-------- solo/utils.py | 113 ------------------ testdata/kidney_performance_tracking.png | Bin 44458 -> 47194 bytes testdata/pbmc_performance_tracking.png | Bin 45332 -> 39617 bytes ...formance_test_kidney_PoolB4FACs_L4_Rep1.sh | 2 +- testdata/performance_test_pbmc_2c.sh | 2 +- 6 files changed, 51 insertions(+), 172 deletions(-) diff --git a/solo/solo.py b/solo/solo.py index cae02da..f540f8a 100755 --- a/solo/solo.py +++ b/solo/solo.py @@ -1,25 +1,23 @@ #!/usr/bin/env python -from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter import json import os +import umap +from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter import numpy as np -from sklearn.metrics import roc_auc_score, accuracy_score, \ - average_precision_score +from sklearn.metrics import * from scipy.special import softmax + import torch +from pytorch_lightning.callbacks.early_stopping import EarlyStopping +import scvi from scvi.data import read_h5ad, read_loom, setup_anndata from scvi.model import SCVI from scvi.external import SOLO -from pytorch_lightning.callbacks.early_stopping import EarlyStopping -import umap - - from .utils import knn_smooth_pred_class - ''' solo.py @@ -38,7 +36,7 @@ def main(): parser.add_argument(dest='model_json_file', help='json file to pass VAE parameters') parser.add_argument(dest='data_path', - help='path to h5ad, loom or 10x directory containing cell by genes counts') + help='path to h5ad or loom cell by genes counts') parser.add_argument('--set-reproducible-seed', dest='reproducible_seed', default=None, type=int, help='Reproducible seed, give an int to set seed') @@ -67,31 +65,12 @@ def main(): should at least have a vae.pt a pickled object of \ vae weights and a latent.npy an np.ndarray of the \ latents of your cells.') - parser.add_argument('-k', dest='known_doublets', - help='Experimentally defined doublets tsv file. \ - Should be a single column of True/False. True \ - indicates the cell is a doublet. No header.', - type=str) - parser.add_argument('-t', dest='doublet_type', help='Please enter \ - multinomial, average, or sum', - default='multinomial', - choices=['multinomial', 'average', 'sum']) parser.add_argument('-e', dest='expected_number_of_doublets', help='Experimentally expected number of doublets', type=int, default=None) parser.add_argument('-p', dest='plot', default=False, action='store_true', help='Plot outputs for solo') - parser.add_argument('-l', dest='normal_logging', - default=False, action='store_true', - help='Logging level set to normal (aka not debug)') - parser.add_argument('--random_size', dest='randomize_doublet_size', - default=False, - action='store_true', - help='Sample depth multipliers from Unif(1, \ - DoubletDepth) \ - to provide a diversity of possible doublet depths.' - ) args = parser.parse_args() model_json_file = args.model_json_file @@ -104,8 +83,11 @@ def main(): os.mkdir(args.out_dir) if args.reproducible_seed is not None: - torch.manual_seed(args.reproducible_seed) - np.random.seed(args.reproducible_seed) + scvi.settings.seed = args.reproducible_seed + else: + scvi.settings.seed = np.random.randint(10000) + + ################################################## # data @@ -135,27 +117,26 @@ def main(): 'ignore_batch']: if par in params: vae_params[par] = params[par] - vae_params['n_batch'] = 0 if params.get( - 'ignore_batch', False) else scvi_data.n_batches # training parameters + batch_key = params.get('batch_key', None) batch_size = params.get('batch_size', 128) valid_pct = params.get('valid_pct', 0.1) learning_rate = params.get('learning_rate', 1e-3) - stopping_params = {'patience': params.get('patience', 20), 'min_delta': 0} + stopping_params = {'patience': params.get('patience', 100), 'min_delta': 0} # protect against single example batch while num_cells % batch_size == 1: batch_size = int(np.round(1.25*batch_size)) print('Increasing batch_size to %d to avoid single example batch.' % batch_size) + scvi.settings.batch_size = batch_size ################################################## # SCVI - setup_anndata(scvi_data) + setup_anndata(scvi_data, batch_key=batch_key) vae = SCVI(scvi_data, gene_likelihood='nb', log_variational=True, - batch_size=batch_size, **vae_params) if args.seed: @@ -167,11 +148,20 @@ def main(): mode='min', **stopping_params )] - vae.train(max_epochs=500, - validation_size=valid_pct, - check_val_every_n_epoch=1, - callbacks=scvi_callbacks - ) + plan_kwargs = {'reduce_lr_on_plateau': True, + 'lr_factor': .1, + 'lr': 1e-2, + 'lr_patience': 20, + 'lr_threshold': 0, + 'lr_min': 1e-7, + 'lr_scheduler_metric': 'reconstruction_loss_validation'} + + vae.train(max_epochs=2000, + train_size=.9, + check_val_every_n_epoch=1, + plan_kwargs=plan_kwargs, + callbacks=scvi_callbacks + ) # save VAE vae.save(os.path.join(args.out_dir, 'vae.pt')) @@ -186,17 +176,19 @@ def main(): # model # todo add doublet ratio solo = SOLO.from_scvi_model(vae) - solo.train(500, + solo.train(2000, lr=learning_rate, train_size=.8, validation_size=.1, check_val_every_n_epoch=1, - early_stopping_patience=20) - if learning_rate > 1e-4: - solo.train(200, lr=1e-4, train_size=.8, validation_size=.1, - check_val_every_n_epoch=1, - early_stopping_patience=20) - + early_stopping_patience=30) + solo.train(2000, + lr=learning_rate*.1, + train_size=.8, + validation_size=.1, + check_val_every_n_epoch=1, + early_stopping_patience=30, + callbacks=[]) solo.save(os.path.join(args.out_dir, 'classifier.pt')) logit_predictions = solo.predict() @@ -241,16 +233,16 @@ def main(): np.save(os.path.join(args.out_dir, 'no_updates_softmax_scores_sim.npy'), doublet_score[num_cells:]) # logit predictions - logit_doublet_score = logit_predictions[:, 1] + logit_doublet_score = logit_predictions[:, 0] np.save(os.path.join(args.out_dir, 'logit_scores.npy'), logit_doublet_score[:num_cells]) np.savetxt(os.path.join(args.out_dir, 'logit_scores.csv'), logit_doublet_score[:num_cells], delimiter=",") np.save(os.path.join(args.out_dir, 'logit_scores_sim.npy'), logit_doublet_score[num_cells:]) - # update threshold as a function of Solo's estimate of the number of # doublets # essentially a log odds update # TODO put in a function + # currently overshrinking softmaxes diff = np.inf counter_update = 0 solo_scores = doublet_score[:num_cells] @@ -292,16 +284,16 @@ def main(): np.save(os.path.join(args.out_dir, 'is_doublet_sim.npy'), is_solo_doublet[num_cells:]) - np.save(os.path.join(args.out_dir, 'preds.npy'), order_pred[:num_cells]) - np.savetxt(os.path.join(args.out_dir, 'preds.csv'), order_pred[:num_cells], delimiter=",") + np.save(os.path.join(args.out_dir, 'preds.npy'), is_doublet_pred[:num_cells]) + np.savetxt(os.path.join(args.out_dir, 'preds.csv'), is_doublet_pred[:num_cells], delimiter=",") - smoothed_preds = knn_smooth_pred_class(X=latent, pred_class=is_doublet[:num_cells]) + smoothed_preds = knn_smooth_pred_class(X=latent, pred_class=is_doublet_pred[:num_cells]) np.save(os.path.join(args.out_dir, 'smoothed_preds.npy'), smoothed_preds) if args.anndata_output and data_ext == '.h5ad': scvi_data.obs['is_doublet'] = is_solo_doublet[:num_cells] scvi_data.obs['logit_scores'] = logit_doublet_score[:num_cells] - scvi_data.obs['softmax_scores'] = doublet_score[:num_cells] + scvi_data.obs['softmax_scores'] = solo_scores[:num_cells] scvi_data.write(os.path.join(args.out_dir, "soloed.h5ad")) if args.plot: @@ -310,9 +302,9 @@ def main(): import matplotlib.pyplot as plt import seaborn as sns - train_solo_scores = solo_scores[solo.train_indices] - validation_solo_scores = solo_scores[solo.validation_indices] - test_solo_scores = solo_scores[solo.test_indices] + train_solo_scores = doublet_score[solo.train_indices] + validation_solo_scores = doublet_score[solo.validation_indices] + test_solo_scores = doublet_score[solo.test_indices] train_fpr, train_tpr, _ = roc_curve(training_is_doublet_known, train_solo_scores) val_fpr, val_tpr, _ = roc_curve(validation_is_doublet_known, validation_solo_scores) @@ -338,7 +330,7 @@ def main(): plt.plot(val_precision, val_recall, label='Validation') plt.plot(test_precision, test_recall, label='Test') plt.gca().set_xlabel('Recall') - plt.gca().set_ylabel('Precision') + plt.gca().set_ylabel('pytPrecision') plt.legend() plt.savefig(os.path.join(args.out_dir, 'precision_recall.pdf')) plt.close() diff --git a/solo/utils.py b/solo/utils.py index cb3c36e..de8a9b6 100644 --- a/solo/utils.py +++ b/solo/utils.py @@ -1,6 +1,5 @@ import numpy as np -from scvi.dataset import GeneExpressionDataset from scipy.stats import multinomial from sklearn.neighbors import NearestNeighbors @@ -71,116 +70,4 @@ def knn_smooth_pred_class(X: np.ndarray, return smooth_pred_class -def create_average_doublet(X: np.ndarray, - i: int, - j: int, **kwargs): - '''make an average combination of 2 cells - Parameters - ---------- - X : np.array - cell by genes matrix - i : int, - randomly chosen ith cell - j : int, - randomly chosen jth cell - Returns - ------- - float64 - average expression vector of two cells - ''' - return (X[i, :] + X[j, :]).astype('float64') / 2 - - -def create_summed_doublet(X: np.ndarray, - i: int, - j: int, **kwargs): - '''make a sum combination of 2 cells - - Parameters - ---------- - X : np.array - cell by genes matrix - i : int, - randomly chosen ith cell - j : int, - randomly chosen jth cell - Returns - ------- - float64 - summed expression vector of two cells - ''' - return (X[i, :] + X[j, :]).astype('float64') - - -def create_multinomial_doublet(X: np.ndarray, - i: int, - j: int, **kwargs): - '''make a multinomial combination of 2 cells - - Parameters - ---------- - X : np.array - cell by genes matrix - i : int, - randomly chosen ith cell - j : int, - randomly chosen jth cell - kwargs : dict, - dict with doublet_depth, cell_depths and cells_ids as keys - doublet_depth is an int - cell_depths is an list of all cells total UMI counts as ints - cell_ids list of lists with genes with counts for each cell - Returns - ------- - float64 - multinomial expression vector of two cells - ''' - doublet_depth = kwargs["doublet_depth"] - cell_depths = kwargs["cell_depths"] - cells_ids = kwargs["cells_ids"] - randomize_doublet_size = kwargs["randomize_doublet_size"] - - # add their counts - dp = (X[i, :] - + X[j, :]).astype('float64') - dp = np.ravel(dp) - non_zero_indexes = np.unique(cells_ids[i] + cells_ids[j]) - # a huge hack caused by - # https://github.com/numpy/numpy/issues/8317 - # fun fun fun https://stackoverflow.com/questions/23257587/how-can-i-avoid-value-errors-when-using-numpy-random-multinomial - # okay with this hack because affects pro - dp = dp[non_zero_indexes] - # normalize - dp /= dp.sum() - if randomize_doublet_size: - scale_factor = np.random.uniform(1., doublet_depth) - else: - scale_factor = doublet_depth - # choose depth - dd = int(scale_factor * (cell_depths[i] + cell_depths[j]) / 2) - - # sample counts from multinomial - non_zero_probs = multinomial.rvs(n=dd, p=dp) - probs = np.zeros(X.shape[1]) - probs[non_zero_indexes] = non_zero_probs - return probs - - -def make_gene_expression_dataset(data: np.ndarray, gene_names: np.ndarray): - '''make an scVI GeneExpressionDataset - - Parameters - ---------- - data : np.array - cell by genes matrix - gene_names : np.array, - string array with gene names - Returns - ------- - ge_data : GeneExpressionDataset - scVI GeneExpressionDataset for scVI processing - ''' - ge_data = GeneExpressionDataset() - ge_data.populate_from_data(X=data, gene_names=gene_names) - return ge_data diff --git a/testdata/kidney_performance_tracking.png b/testdata/kidney_performance_tracking.png index 15103716ded9dea01c5c72e6a44e2a6614ff4c82..dfea65b8068ad84cbdaef7f4cffd5b0cc37ae92b 100644 GIT binary patch literal 47194 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 Date: Thu, 18 Feb 2021 13:24:06 -0800 Subject: [PATCH 04/15] black formatting --- setup.py | 34 +- solo/__init__.py | 6 +- solo/hashsolo.py | 504 +++++++++++++++++++----------- solo/solo.py | 7 +- solo/utils.py | 23 +- testdata/calculate_performance.py | 94 +++--- tests/hashsolo_tests.py | 31 +- 7 files changed, 430 insertions(+), 269 deletions(-) diff --git a/setup.py b/setup.py index ce7b8cd..54cef1e 100644 --- a/setup.py +++ b/setup.py @@ -3,38 +3,36 @@ from setuptools import setup, find_packages if sys.version_info < (3,): - sys.exit('solo requires Python >= 3.6') + sys.exit("solo requires Python >= 3.6") try: from solo import __author__, __email__ except ImportError: # Deps not yet installed - __author__ = __email__ = '' + __author__ = __email__ = "" setup( - name='solo-sc', - version='0.6', - description='Neural network classifiers for doublets', - long_description=Path('README.md').read_text('utf-8'), + name="solo-sc", + version="0.6", + description="Neural network classifiers for doublets", + long_description=Path("README.md").read_text("utf-8"), long_description_content_type="text/markdown", - url='http://github.com/calico/solo', - download_url='https://github.com/calico/solo/archive/0.1.tar.gz', + url="http://github.com/calico/solo", + download_url="https://github.com/calico/solo/archive/0.1.tar.gz", author=__author__, author_email=__email__, - license='Apache', - python_requires='>=3.6', + license="Apache", + python_requires=">=3.6", install_requires=[ - l.strip() for l in - Path('requirements.txt').read_text('utf-8').splitlines() - ], + l.strip() for l in Path("requirements.txt").read_text("utf-8").splitlines() + ], packages=find_packages(), entry_points=dict( - console_scripts=['solo=solo.solo:main', - 'hashsolo=solo.hashsolo:main'], + console_scripts=["solo=solo.solo:main", "hashsolo=solo.hashsolo:main"], ), classifiers=[ - 'Environment :: Console', - 'Intended Audience :: Science/Research', - 'Topic :: Scientific/Engineering :: Bio-Informatics', + "Environment :: Console", + "Intended Audience :: Science/Research", + "Topic :: Scientific/Engineering :: Bio-Informatics", ], ) diff --git a/solo/__init__.py b/solo/__init__.py index 8ebe692..e53900e 100644 --- a/solo/__init__.py +++ b/solo/__init__.py @@ -1,5 +1,5 @@ -__author__ = 'David Kelley, Nick Bernstein' -__email__ = 'nicholas@calicolabs.com' -__version__ = '0.1' +__author__ = "David Kelley, Nick Bernstein" +__email__ = "nicholas@calicolabs.com" +__version__ = "0.1" from . import hashsolo, utils diff --git a/solo/hashsolo.py b/solo/hashsolo.py index 3db1617..0a3f506 100644 --- a/solo/hashsolo.py +++ b/solo/hashsolo.py @@ -13,7 +13,7 @@ from scipy.sparse import issparse from sklearn.metrics import calinski_harabasz_score -''' +""" HashSolo script provides a probabilistic cell hashing demultiplexing method which generates a noise distribution and signal distribution for each hashing barcode from empirically observed counts. These distributions @@ -28,12 +28,11 @@ second highest barcode from a noise distribution. A negative two highest barcodes should come from noise distributions. We test each of these hypotheses in a bayesian fashion, and select the most probable hypothesis. -''' +""" -def _calculate_log_likelihoods(data, - number_of_noise_barcodes): - '''Calculate log likelihoods for each hypothesis, negative, singlet, doublet +def _calculate_log_likelihoods(data, number_of_noise_barcodes): + """Calculate log likelihoods for each hypothesis, negative, singlet, doublet Parameters ---------- @@ -47,9 +46,10 @@ def _calculate_log_likelihoods(data, a 2d np.array log likelihood of each hypothesis all_indices counter_to_barcode_combo - ''' + """ + def gaussian_updates(data, mu_o, std_o): - '''Update parameters of your gaussian + """Update parameters of your gaussian https://www.cs.ubc.ca/~murphyk/Papers/bayesGauss.pdf Parameters ---------- @@ -65,13 +65,15 @@ def gaussian_updates(data, mu_o, std_o): mean of gaussian float std of gaussian - ''' - lam_o = 1/(std_o**2) + """ + lam_o = 1 / (std_o ** 2) n = len(data) - lam = 1/np.var(data) if len(data) > 1 else lam_o - lam_n = lam_o + n*lam - mu_n = (np.mean(data)*n*lam + mu_o*lam_o)/lam_n if len(data) > 0 else mu_o - return mu_n, (1 / (lam_n / (n + 1)))**(1/2) + lam = 1 / np.var(data) if len(data) > 1 else lam_o + lam_n = lam_o + n * lam + mu_n = ( + (np.mean(data) * n * lam + mu_o * lam_o) / lam_n if len(data) > 0 else mu_o + ) + return mu_n, (1 / (lam_n / (n + 1))) ** (1 / 2) eps = 1e-15 # probabilites for negative, singlet, doublets @@ -79,7 +81,11 @@ def gaussian_updates(data, mu_o, std_o): all_indices = np.empty(data.shape[0]) num_of_barcodes = data.shape[1] - number_of_non_noise_barcodes = num_of_barcodes - number_of_noise_barcodes if number_of_noise_barcodes is not None else 2 + number_of_non_noise_barcodes = ( + num_of_barcodes - number_of_noise_barcodes + if number_of_noise_barcodes is not None + else 2 + ) num_of_noise_barcodes = num_of_barcodes - number_of_non_noise_barcodes # assume log normal @@ -92,10 +98,12 @@ def gaussian_updates(data, mu_o, std_o): # barcodes with rank < k are considered to be noise global_signal_counts = np.ravel(data_sort[:, -1]) global_noise_counts = np.ravel(data_sort[:, :-number_of_non_noise_barcodes]) - global_mu_signal_o, global_sigma_signal_o = np.mean( - global_signal_counts), np.std(global_signal_counts) - global_mu_noise_o, global_sigma_noise_o = np.mean( - global_noise_counts), np.std(global_noise_counts) + global_mu_signal_o, global_sigma_signal_o = np.mean(global_signal_counts), np.std( + global_signal_counts + ) + global_mu_noise_o, global_sigma_noise_o = np.mean(global_noise_counts), np.std( + global_noise_counts + ) noise_params_dict = {} signal_params_dict = {} @@ -103,7 +111,9 @@ def gaussian_updates(data, mu_o, std_o): # for each barcode get empirical noise and signal distribution parameterization for x in np.arange(num_of_barcodes): sample_barcodes = data[:, x] - sample_barcodes_noise_idx = np.where(data_arg[:, :num_of_noise_barcodes] == x)[0] + sample_barcodes_noise_idx = np.where(data_arg[:, :num_of_noise_barcodes] == x)[ + 0 + ] sample_barcodes_signal_idx = np.where(data_arg[:, -1] == x) # get noise and signal counts @@ -111,8 +121,12 @@ def gaussian_updates(data, mu_o, std_o): signal_counts = sample_barcodes[sample_barcodes_signal_idx] # get parameters of distribution, assuming lognormal do update from global values - noise_param = gaussian_updates(noise_counts, global_mu_noise_o, global_sigma_noise_o) - signal_param = gaussian_updates(signal_counts, global_mu_signal_o, global_sigma_signal_o) + noise_param = gaussian_updates( + noise_counts, global_mu_noise_o, global_sigma_noise_o + ) + signal_param = gaussian_updates( + signal_counts, global_mu_signal_o, global_sigma_signal_o + ) noise_params_dict[x] = noise_param signal_params_dict[x] = signal_param @@ -120,17 +134,17 @@ def gaussian_updates(data, mu_o, std_o): counter = 0 # for each combination of noise and signal barcode calculate probiltiy of in silico and real cell hypotheses - for noise_sample_idx, signal_sample_idx in product(np.arange(num_of_barcodes), - np.arange(num_of_barcodes)): - signal_subset = (data_arg[:, -1] == signal_sample_idx) - noise_subset = (data_arg[:, -2] == noise_sample_idx) - subset = (signal_subset & noise_subset) + for noise_sample_idx, signal_sample_idx in product( + np.arange(num_of_barcodes), np.arange(num_of_barcodes) + ): + signal_subset = data_arg[:, -1] == signal_sample_idx + noise_subset = data_arg[:, -2] == noise_sample_idx + subset = signal_subset & noise_subset if sum(subset) == 0: continue indices = np.where(subset)[0] - barcode_combo = '_'.join([str(noise_sample_idx), - str(signal_sample_idx)]) + barcode_combo = "_".join([str(noise_sample_idx), str(signal_sample_idx)]) all_indices[np.where(subset)[0]] = counter counter_to_barcode_combo[counter] = barcode_combo counter += 1 @@ -139,20 +153,54 @@ def gaussian_updates(data, mu_o, std_o): # calculate probabilties for each hypothesis for each cell data_subset = data[subset] - log_signal_signal_probs = np.log(norm.pdf( - data_subset[:, signal_sample_idx], *signal_params[:-2], loc=signal_params[-2], scale=signal_params[-1]) + eps) + log_signal_signal_probs = np.log( + norm.pdf( + data_subset[:, signal_sample_idx], + *signal_params[:-2], + loc=signal_params[-2], + scale=signal_params[-1] + ) + + eps + ) signal_noise_params = signal_params_dict[noise_sample_idx] - log_noise_signal_probs = np.log(norm.pdf( - data_subset[:, noise_sample_idx], *signal_noise_params[:-2], loc=signal_noise_params[-2], scale=signal_noise_params[-1]) + eps) - - log_noise_noise_probs = np.log(norm.pdf( - data_subset[:, noise_sample_idx], *noise_params[:-2], loc=noise_params[-2], scale=noise_params[-1]) + eps) - log_signal_noise_probs = np.log(norm.pdf( - data_subset[:, signal_sample_idx], *noise_params[:-2], loc=noise_params[-2], scale=noise_params[-1]) + eps) - - probs_of_negative = np.sum([log_noise_noise_probs, log_signal_noise_probs], axis=0) - probs_of_singlet = np.sum([log_noise_noise_probs, log_signal_signal_probs], axis=0) - probs_of_doublet = np.sum([log_noise_signal_probs, log_signal_signal_probs], axis=0) + log_noise_signal_probs = np.log( + norm.pdf( + data_subset[:, noise_sample_idx], + *signal_noise_params[:-2], + loc=signal_noise_params[-2], + scale=signal_noise_params[-1] + ) + + eps + ) + + log_noise_noise_probs = np.log( + norm.pdf( + data_subset[:, noise_sample_idx], + *noise_params[:-2], + loc=noise_params[-2], + scale=noise_params[-1] + ) + + eps + ) + log_signal_noise_probs = np.log( + norm.pdf( + data_subset[:, signal_sample_idx], + *noise_params[:-2], + loc=noise_params[-2], + scale=noise_params[-1] + ) + + eps + ) + + probs_of_negative = np.sum( + [log_noise_noise_probs, log_signal_noise_probs], axis=0 + ) + probs_of_singlet = np.sum( + [log_noise_noise_probs, log_signal_signal_probs], axis=0 + ) + probs_of_doublet = np.sum( + [log_noise_signal_probs, log_signal_signal_probs], axis=0 + ) log_probs_list = [probs_of_negative, probs_of_singlet, probs_of_doublet] # each cell and each hypothesis probability @@ -162,7 +210,7 @@ def gaussian_updates(data, mu_o, std_o): def _calculate_bayes_rule(data, priors, number_of_noise_barcodes): - ''' + """ Calculate bayes rule from log likelihoods Parameters @@ -185,20 +233,28 @@ def _calculate_bayes_rule(data, priors, number_of_noise_barcodes): 'most_likely_hypothesis' key is a 1d np.array of the most likely hypothesis 'probs_hypotheses' key is a 2d np.array probability of each hypothesis 'log_likelihoods_for_each_hypothesis' key is a 2d np.array log likelihood of each hypothesis - ''' + """ priors = np.array(priors) - log_likelihoods_for_each_hypothesis, _, _ = _calculate_log_likelihoods(data, number_of_noise_barcodes) - probs_hypotheses = np.exp(log_likelihoods_for_each_hypothesis) * priors / np.sum( - np.multiply(np.exp(log_likelihoods_for_each_hypothesis), priors), axis=1)[:, None] + log_likelihoods_for_each_hypothesis, _, _ = _calculate_log_likelihoods( + data, number_of_noise_barcodes + ) + probs_hypotheses = ( + np.exp(log_likelihoods_for_each_hypothesis) + * priors + / np.sum( + np.multiply(np.exp(log_likelihoods_for_each_hypothesis), priors), axis=1 + )[:, None] + ) most_likely_hypothesis = np.argmax(probs_hypotheses, axis=1) - return {'most_likely_hypothesis': most_likely_hypothesis, - 'probs_hypotheses': probs_hypotheses, - 'log_likelihoods_for_each_hypothesis': log_likelihoods_for_each_hypothesis} + return { + "most_likely_hypothesis": most_likely_hypothesis, + "probs_hypotheses": probs_hypotheses, + "log_likelihoods_for_each_hypothesis": log_likelihoods_for_each_hypothesis, + } -def _get_clusters(clustering_data: anndata.AnnData, - resolutions: list): - ''' +def _get_clusters(clustering_data: anndata.AnnData, resolutions: list): + """ Principled cell clustering Parameters ---------- @@ -210,13 +266,15 @@ def _get_clusters(clustering_data: anndata.AnnData, ------- np.ndarray leiden clustering results for each cell - ''' + """ sc.pp.normalize_per_cell(clustering_data, counts_per_cell_after=1e4) sc.pp.log1p(clustering_data) - sc.pp.highly_variable_genes(clustering_data, min_mean=0.0125, max_mean=3, min_disp=0.5) - clustering_data = clustering_data[:, clustering_data.var['highly_variable']] + sc.pp.highly_variable_genes( + clustering_data, min_mean=0.0125, max_mean=3, min_disp=0.5 + ) + clustering_data = clustering_data[:, clustering_data.var["highly_variable"]] sc.pp.scale(clustering_data, max_value=10) - sc.tl.pca(clustering_data, svd_solver='arpack') + sc.tl.pca(clustering_data, svd_solver="arpack") sc.pp.neighbors(clustering_data, n_neighbors=10, n_pcs=40) sc.tl.umap(clustering_data) best_ch_score = -np.inf @@ -224,23 +282,26 @@ def _get_clusters(clustering_data: anndata.AnnData, for resolution in resolutions: sc.tl.leiden(clustering_data, resolution=resolution) - ch_score = calinski_harabasz_score(clustering_data.X, clustering_data.obs['leiden']) + ch_score = calinski_harabasz_score( + clustering_data.X, clustering_data.obs["leiden"] + ) if ch_score > best_ch_score: - clustering_data.obs['best_leiden'] = clustering_data.obs['leiden'].values + clustering_data.obs["best_leiden"] = clustering_data.obs["leiden"].values best_ch_score = ch_score - return clustering_data.obs['best_leiden'].values + return clustering_data.obs["best_leiden"].values -def hashsolo(cell_hashing_adata: anndata.AnnData, - priors: list = [.01, .8, .19], - pre_existing_clusters: str = None, - clustering_data: anndata.AnnData = None, - resolutions: list = [.1, .25, .5, .75, 1], - number_of_noise_barcodes: int = None, - inplace: bool = True, - ): - '''Demultiplex cell hashing dataset using HashSolo method +def hashsolo( + cell_hashing_adata: anndata.AnnData, + priors: list = [0.01, 0.8, 0.19], + pre_existing_clusters: str = None, + clustering_data: anndata.AnnData = None, + resolutions: list = [0.1, 0.25, 0.5, 0.75, 1], + number_of_noise_barcodes: int = None, + inplace: bool = True, +): + """Demultiplex cell hashing dataset using HashSolo method Parameters ---------- @@ -268,77 +329,117 @@ def hashsolo(cell_hashing_adata: anndata.AnnData, cell_hashing_adata : AnnData if inplace is False returns AnnData with demultiplexing results in .obs attribute otherwise does is in place - ''' + """ if issparse(cell_hashing_adata.X): cell_hashing_adata.X = np.array(cell_hashing_adata.X.todense()) - + if clustering_data is not None: - print('This may take awhile we are running clustering at {} different resolutions'.format(len(resolutions))) + print( + "This may take awhile we are running clustering at {} different resolutions".format( + len(resolutions) + ) + ) if not all(clustering_data.obs_names == cell_hashing_adata.obs_names): raise ValueError( - 'clustering_data and cell hashing cell_hashing_adata must have same index') - cell_hashing_adata.obs['best_leiden'] = _get_clusters(clustering_data, resolutions) + "clustering_data and cell hashing cell_hashing_adata must have same index" + ) + cell_hashing_adata.obs["best_leiden"] = _get_clusters( + clustering_data, resolutions + ) data = cell_hashing_adata.X num_of_cells = cell_hashing_adata.shape[0] - results = pd.DataFrame(np.zeros((num_of_cells, 6)), - columns=['most_likely_hypothesis', - 'probs_hypotheses', - 'cluster_feature', - 'negative_hypothesis_probability', - 'singlet_hypothesis_probability', - 'doublet_hypothesis_probability', ], - index=cell_hashing_adata.obs_names) + results = pd.DataFrame( + np.zeros((num_of_cells, 6)), + columns=[ + "most_likely_hypothesis", + "probs_hypotheses", + "cluster_feature", + "negative_hypothesis_probability", + "singlet_hypothesis_probability", + "doublet_hypothesis_probability", + ], + index=cell_hashing_adata.obs_names, + ) if clustering_data is not None or pre_existing_clusters is not None: - cluster_features = 'best_leiden' if pre_existing_clusters is None else pre_existing_clusters + cluster_features = ( + "best_leiden" if pre_existing_clusters is None else pre_existing_clusters + ) unique_cluster_features = np.unique(cell_hashing_adata.obs[cluster_features]) for cluster_feature in unique_cluster_features: - cluster_feature_bool_vector = cell_hashing_adata.obs[cluster_features] == cluster_feature - posterior_dict = _calculate_bayes_rule(data[cluster_feature_bool_vector], priors, number_of_noise_barcodes) - results.loc[cluster_feature_bool_vector, - 'most_likely_hypothesis'] = posterior_dict['most_likely_hypothesis'] - results.loc[cluster_feature_bool_vector, 'cluster_feature'] = cluster_feature - results.loc[cluster_feature_bool_vector, - 'negative_hypothesis_probability'] = posterior_dict['probs_hypotheses'][:, 0] - results.loc[cluster_feature_bool_vector, - 'singlet_hypothesis_probability'] = posterior_dict['probs_hypotheses'][:, 1] - results.loc[cluster_feature_bool_vector, - 'doublet_hypothesis_probability'] = posterior_dict['probs_hypotheses'][:, 2] + cluster_feature_bool_vector = ( + cell_hashing_adata.obs[cluster_features] == cluster_feature + ) + posterior_dict = _calculate_bayes_rule( + data[cluster_feature_bool_vector], priors, number_of_noise_barcodes + ) + results.loc[ + cluster_feature_bool_vector, "most_likely_hypothesis" + ] = posterior_dict["most_likely_hypothesis"] + results.loc[ + cluster_feature_bool_vector, "cluster_feature" + ] = cluster_feature + results.loc[ + cluster_feature_bool_vector, "negative_hypothesis_probability" + ] = posterior_dict["probs_hypotheses"][:, 0] + results.loc[ + cluster_feature_bool_vector, "singlet_hypothesis_probability" + ] = posterior_dict["probs_hypotheses"][:, 1] + results.loc[ + cluster_feature_bool_vector, "doublet_hypothesis_probability" + ] = posterior_dict["probs_hypotheses"][:, 2] else: posterior_dict = _calculate_bayes_rule(data, priors, number_of_noise_barcodes) - results.loc[:, 'most_likely_hypothesis'] = posterior_dict['most_likely_hypothesis'] - results.loc[:, 'cluster_feature'] = 0 - results.loc[:, 'negative_hypothesis_probability'] = posterior_dict['probs_hypotheses'][:, 0] - results.loc[:, 'singlet_hypothesis_probability'] = posterior_dict['probs_hypotheses'][:, 1] - results.loc[:, 'doublet_hypothesis_probability'] = posterior_dict['probs_hypotheses'][:, 2] - - cell_hashing_adata.obs['most_likely_hypothesis'] = results.loc[cell_hashing_adata.obs_names, - 'most_likely_hypothesis'] - cell_hashing_adata.obs['cluster_feature'] = results.loc[cell_hashing_adata.obs_names, 'cluster_feature'] - cell_hashing_adata.obs['negative_hypothesis_probability'] = results.loc[cell_hashing_adata.obs_names, - 'negative_hypothesis_probability'] - cell_hashing_adata.obs['singlet_hypothesis_probability'] = results.loc[cell_hashing_adata.obs_names, - 'singlet_hypothesis_probability'] - cell_hashing_adata.obs['doublet_hypothesis_probability'] = results.loc[cell_hashing_adata.obs_names, - 'doublet_hypothesis_probability'] - - cell_hashing_adata.obs['Classification'] = None - cell_hashing_adata.obs.loc[cell_hashing_adata.obs['most_likely_hypothesis'] - == 2, 'Classification'] = 'Doublet' - cell_hashing_adata.obs.loc[cell_hashing_adata.obs['most_likely_hypothesis'] - == 0, 'Classification'] = 'Negative' - all_sings = cell_hashing_adata.obs['most_likely_hypothesis'] == 1 + results.loc[:, "most_likely_hypothesis"] = posterior_dict[ + "most_likely_hypothesis" + ] + results.loc[:, "cluster_feature"] = 0 + results.loc[:, "negative_hypothesis_probability"] = posterior_dict[ + "probs_hypotheses" + ][:, 0] + results.loc[:, "singlet_hypothesis_probability"] = posterior_dict[ + "probs_hypotheses" + ][:, 1] + results.loc[:, "doublet_hypothesis_probability"] = posterior_dict[ + "probs_hypotheses" + ][:, 2] + + cell_hashing_adata.obs["most_likely_hypothesis"] = results.loc[ + cell_hashing_adata.obs_names, "most_likely_hypothesis" + ] + cell_hashing_adata.obs["cluster_feature"] = results.loc[ + cell_hashing_adata.obs_names, "cluster_feature" + ] + cell_hashing_adata.obs["negative_hypothesis_probability"] = results.loc[ + cell_hashing_adata.obs_names, "negative_hypothesis_probability" + ] + cell_hashing_adata.obs["singlet_hypothesis_probability"] = results.loc[ + cell_hashing_adata.obs_names, "singlet_hypothesis_probability" + ] + cell_hashing_adata.obs["doublet_hypothesis_probability"] = results.loc[ + cell_hashing_adata.obs_names, "doublet_hypothesis_probability" + ] + + cell_hashing_adata.obs["Classification"] = None + cell_hashing_adata.obs.loc[ + cell_hashing_adata.obs["most_likely_hypothesis"] == 2, "Classification" + ] = "Doublet" + cell_hashing_adata.obs.loc[ + cell_hashing_adata.obs["most_likely_hypothesis"] == 0, "Classification" + ] = "Negative" + all_sings = cell_hashing_adata.obs["most_likely_hypothesis"] == 1 singlet_sample_index = np.argmax(cell_hashing_adata.X[all_sings], axis=1) - cell_hashing_adata.obs.loc[all_sings, - 'Classification'] = cell_hashing_adata.var_names[singlet_sample_index] + cell_hashing_adata.obs.loc[ + all_sings, "Classification" + ] = cell_hashing_adata.var_names[singlet_sample_index] return cell_hashing_adata if not inplace else None -def plot_qc_checks_cell_hashing(cell_hashing_adata: anndata.AnnData, - alpha: float = .05, - fig_path: str = None): - '''Plot HashSolo demultiplexing results +def plot_qc_checks_cell_hashing( + cell_hashing_adata: anndata.AnnData, alpha: float = 0.05, fig_path: str = None +): + """Plot HashSolo demultiplexing results Parameters ---------- @@ -350,76 +451,119 @@ def plot_qc_checks_cell_hashing(cell_hashing_adata: anndata.AnnData, Path to save figure Returns ------- - ''' + """ import matplotlib - matplotlib.use('Agg') + + matplotlib.use("Agg") import matplotlib.pyplot as plt cell_hashing_demultiplexing = cell_hashing_adata.obs - cell_hashing_demultiplexing['log_counts'] = np.log(np.sum(cell_hashing_adata.X, axis=1)) - number_of_clusters = cell_hashing_demultiplexing['cluster_feature'].drop_duplicates().shape[0] - fig, all_axes = plt.subplots(number_of_clusters, 4, figsize=(40, 10 * number_of_clusters)) + cell_hashing_demultiplexing["log_counts"] = np.log( + np.sum(cell_hashing_adata.X, axis=1) + ) + number_of_clusters = ( + cell_hashing_demultiplexing["cluster_feature"].drop_duplicates().shape[0] + ) + fig, all_axes = plt.subplots( + number_of_clusters, 4, figsize=(40, 10 * number_of_clusters) + ) counter = 0 - for cluster_feature, group in cell_hashing_demultiplexing.groupby('cluster_feature'): + for cluster_feature, group in cell_hashing_demultiplexing.groupby( + "cluster_feature" + ): if number_of_clusters > 1: axes = all_axes[counter] else: axes = all_axes ax = axes[0] - ax.plot(group['log_counts'], group['negative_hypothesis_probability'], 'bo', alpha=alpha) - ax.set_title('Probability of negative hypothesis vs log hashing counts') - ax.set_ylabel('Probability of negative hypothesis') - ax.set_xlabel('Log hashing counts') + ax.plot( + group["log_counts"], + group["negative_hypothesis_probability"], + "bo", + alpha=alpha, + ) + ax.set_title("Probability of negative hypothesis vs log hashing counts") + ax.set_ylabel("Probability of negative hypothesis") + ax.set_xlabel("Log hashing counts") ax = axes[1] - ax.plot(group['log_counts'], group['singlet_hypothesis_probability'], 'bo', alpha=alpha) - ax.set_title('Probability of singlet hypothesis vs log hashing counts') - ax.set_ylabel('Probability of singlet hypothesis') - ax.set_xlabel('Log hashing counts') + ax.plot( + group["log_counts"], + group["singlet_hypothesis_probability"], + "bo", + alpha=alpha, + ) + ax.set_title("Probability of singlet hypothesis vs log hashing counts") + ax.set_ylabel("Probability of singlet hypothesis") + ax.set_xlabel("Log hashing counts") ax = axes[2] - ax.plot(group['log_counts'], group['doublet_hypothesis_probability'], 'bo', alpha=alpha) - ax.set_title('Probability of doublet hypothesis vs log hashing counts') - ax.set_ylabel('Probability of doublet hypothesis') - ax.set_xlabel('Log hashing counts') + ax.plot( + group["log_counts"], + group["doublet_hypothesis_probability"], + "bo", + alpha=alpha, + ) + ax.set_title("Probability of doublet hypothesis vs log hashing counts") + ax.set_ylabel("Probability of doublet hypothesis") + ax.set_xlabel("Log hashing counts") ax = axes[3] - group['Classification'].value_counts().plot.bar(ax=ax) - ax.set_title('Count of each samples classification') + group["Classification"].value_counts().plot.bar(ax=ax) + ax.set_title("Count of each samples classification") counter += 1 plt.show() if fig_path is not None: - fig.savefig(fig_path, dpi=300, format='pdf') + fig.savefig(fig_path, dpi=300, format="pdf") def main(): - usage = 'hashsolo' + usage = "hashsolo" parser = ArgumentParser(usage, formatter_class=ArgumentDefaultsHelpFormatter) - parser.add_argument(dest='data_file', - help='h5ad file containing cell hashing counts') - parser.add_argument('-j', dest='model_json_file', - default=None, - help='json file to pass optional arguments') - parser.add_argument('-o', dest='out_dir', - default='hashsolo_output', - help='Output directory for results') - parser.add_argument('-c', dest='clustering_data', - default=None, - help='h5ad file with count transcriptional data to\ - perform clustering on') - parser.add_argument('-p', dest='pre_existing_clusters', - default=None, - help='column in cell_hashing_data_file.obs to \ - specifying different cell types or clusters') - parser.add_argument('-q', dest='plot_name', - default='hashing_qc_plots.pdf', - help='name of plot to output') - parser.add_argument('-n', dest='number_of_noise_barcodes', - default=None, - help='Number of barcodes to use to create noise \ - distribution') + parser.add_argument( + dest="data_file", help="h5ad file containing cell hashing counts" + ) + parser.add_argument( + "-j", + dest="model_json_file", + default=None, + help="json file to pass optional arguments", + ) + parser.add_argument( + "-o", + dest="out_dir", + default="hashsolo_output", + help="Output directory for results", + ) + parser.add_argument( + "-c", + dest="clustering_data", + default=None, + help="h5ad file with count transcriptional data to\ + perform clustering on", + ) + parser.add_argument( + "-p", + dest="pre_existing_clusters", + default=None, + help="column in cell_hashing_data_file.obs to \ + specifying different cell types or clusters", + ) + parser.add_argument( + "-q", + dest="plot_name", + default="hashing_qc_plots.pdf", + help="name of plot to output", + ) + parser.add_argument( + "-n", + dest="number_of_noise_barcodes", + default=None, + help="Number of barcodes to use to create noise \ + distribution", + ) args = parser.parse_args() @@ -432,37 +576,41 @@ def main(): params = {} data_file = args.data_file data_ext = os.path.splitext(data_file)[-1] - if data_ext == '.h5ad': + if data_ext == ".h5ad": cell_hashing_adata = anndata.read(data_file) else: - print('Unrecognized file format') + print("Unrecognized file format") if args.clustering_data is not None: clustering_data_file = args.clustering_data clustering_data_ext = os.path.splitext(clustering_data_file)[-1] - if clustering_data_ext == '.h5ad': + if clustering_data_ext == ".h5ad": clustering_data = anndata.read(clustering_data_file) else: - print('Unrecognized file format for clustering data') + print("Unrecognized file format for clustering data") else: clustering_data = None if not os.path.isdir(args.out_dir): os.mkdir(args.out_dir) - hashsolo(cell_hashing_adata, - pre_existing_clusters=args.pre_existing_clusters, - number_of_noise_barcodes=args.number_of_noise_barcodes, - clustering_data=clustering_data, - **params) - cell_hashing_adata.write(os.path.join(args.out_dir, 'hashsoloed.h5ad')) + hashsolo( + cell_hashing_adata, + pre_existing_clusters=args.pre_existing_clusters, + number_of_noise_barcodes=args.number_of_noise_barcodes, + clustering_data=clustering_data, + **params + ) + cell_hashing_adata.write(os.path.join(args.out_dir, "hashsoloed.h5ad")) plot_qc_checks_cell_hashing( - cell_hashing_adata, fig_path=os.path.join(args.out_dir, args.plot_name)) + cell_hashing_adata, fig_path=os.path.join(args.out_dir, args.plot_name) + ) + ############################################################################### # __main__ ############################################################################### -if __name__ == '__main__': +if __name__ == "__main__": main() diff --git a/solo/solo.py b/solo/solo.py index f540f8a..e31d388 100755 --- a/solo/solo.py +++ b/solo/solo.py @@ -87,7 +87,6 @@ def main(): else: scvi.settings.seed = np.random.randint(10000) - ################################################## # data @@ -155,10 +154,10 @@ def main(): 'lr_threshold': 0, 'lr_min': 1e-7, 'lr_scheduler_metric': 'reconstruction_loss_validation'} - + vae.train(max_epochs=2000, - train_size=.9, - check_val_every_n_epoch=1, + validation_size=valid_pct, + check_val_every_n_epoch=1, plan_kwargs=plan_kwargs, callbacks=scvi_callbacks ) diff --git a/solo/utils.py b/solo/utils.py index de8a9b6..9352561 100644 --- a/solo/utils.py +++ b/solo/utils.py @@ -4,11 +4,13 @@ from sklearn.neighbors import NearestNeighbors -def knn_smooth_pred_class(X: np.ndarray, - pred_class: np.ndarray, - grouping: np.ndarray = None, - k: int = 15,) -> np.ndarray: - ''' +def knn_smooth_pred_class( + X: np.ndarray, + pred_class: np.ndarray, + grouping: np.ndarray = None, + k: int = 15, +) -> np.ndarray: + """ Smooths class predictions by taking the modal class from each cell's nearest neighbors. Parameters @@ -39,7 +41,7 @@ def knn_smooth_pred_class(X: np.ndarray, By using a simple kNN smoothing heuristic, we can leverage neighborhood information to improve classification performance, smoothing out cells that have an outlier prediction relative to their local neighborhood. - ''' + """ if grouping is None: # do not use a grouping to restrict local neighborhood # associations, create a universal pseudogroup `0`. @@ -48,7 +50,7 @@ def knn_smooth_pred_class(X: np.ndarray, smooth_pred_class = np.zeros_like(pred_class) for group in np.unique(grouping): # identify only cells in the relevant group - group_idx = np.where(grouping == group)[0].astype('int') + group_idx = np.where(grouping == group)[0].astype("int") X_group = X[grouping == group, :] # if there are < k cells in the group, change `k` to the # group size @@ -57,7 +59,9 @@ def knn_smooth_pred_class(X: np.ndarray, else: k_use = k # compute a nearest neighbor graph and identify kNN - nns = NearestNeighbors(n_neighbors=k_use,).fit(X_group) + nns = NearestNeighbors( + n_neighbors=k_use, + ).fit(X_group) dist, idx = nns.kneighbors(X_group) # for each cell in the group, assign a class as @@ -68,6 +72,3 @@ def knn_smooth_pred_class(X: np.ndarray, maj_class = uniq_classes[int(np.argmax(counts))] smooth_pred_class[group_idx[i]] = maj_class return smooth_pred_class - - - diff --git a/testdata/calculate_performance.py b/testdata/calculate_performance.py index 2373182..0bc90dc 100644 --- a/testdata/calculate_performance.py +++ b/testdata/calculate_performance.py @@ -1,26 +1,30 @@ #!/usr/bin/env python -import anndata +import anndata import numpy as np from sklearn.metrics import average_precision_score, roc_auc_score from scipy.stats import mannwhitneyu import matplotlib.pyplot as plt -import datetime +import datetime import pandas as pd from glob import glob -''' + +""" calculate performance -''' +""" ############################################################################### # main ############################################################################### -experiment_name_to_dataset = {'pbmc': '2c.h5ad', - 'kidney': 'gene_ad_filtered_PoolB4FACs_L4_Rep1.h5ad'} +experiment_name_to_dataset = { + "pbmc": "2c.h5ad", + "kidney": "gene_ad_filtered_PoolB4FACs_L4_Rep1.h5ad", +} + def main(): - for result in glob('results_*/softmax_scores.npy'): + for result in glob("results_*/softmax_scores.npy"): experiment_name = result.split("/")[0].split("_")[1] experiment_number = result.split("/")[0].split("_")[2] scores = np.load(result) @@ -29,43 +33,57 @@ def main(): apr = average_precision_score(true_labels, scores) auc = roc_auc_score(true_labels, scores) time = datetime.datetime.now().strftime("%Y-%m-%d %H") - with open('tracking_performance.csv', 'a') as file: - file.write(f'{time},{experiment_name},{experiment_number},{apr},{auc}\n') + with open("tracking_performance.csv", "a") as file: + file.write(f"{time},{experiment_name},{experiment_number},{apr},{auc}\n") - performance_tracking = pd.read_csv('tracking_performance.csv') - performance_tracking['date (dt)'] = pd.to_datetime(performance_tracking['date'], format="%Y-%m-%d %H") - for experiment_name, group in performance_tracking.groupby('experiment_name'): - fig, axes = plt.subplots(2, 1, figsize=(10,20)) + performance_tracking = pd.read_csv("tracking_performance.csv") + performance_tracking["date (dt)"] = pd.to_datetime( + performance_tracking["date"], format="%Y-%m-%d %H" + ) + for experiment_name, group in performance_tracking.groupby("experiment_name"): + fig, axes = plt.subplots(2, 1, figsize=(10, 20)) ax = axes[0] - ax.plot(group['date'], group['average_precision'], '.') - ax.set_xlabel('date') - ax.set_ylabel('average precision') + ax.plot(group["date"], group["average_precision"], ".") + ax.set_xlabel("date") + ax.set_ylabel("average precision") ax = axes[1] - ax.plot(group['date'], group['AUROC'], '.') - ax.set_xlabel('date') - ax.set_ylabel('AUROC') - fig.savefig(f'{experiment_name}_performance_tracking.png') - second_to_last, most_recent = group['date (dt)'].drop_duplicates().sort_values()[-2:] - second_to_last_df = group[group['date (dt)'] == second_to_last] - most_recent_df = group[group['date (dt)'] == most_recent] - for metric in ['AUROC', 'average_precision']: - mean_change = most_recent_df[metric].mean() - second_to_last_df[metric].mean() - pvalue = mannwhitneyu(most_recent_df[metric], second_to_last_df[metric]).pvalue - print(f'Mean {metric} has changed by for {experiment_name}: {mean_change}') - print(f'P value for metric change {metric} in experiment {experiment_name}: {pvalue}') - if mean_change < 0 and pvalue < .05: - for x in range(0,5): - print('WARNING!') - print(f'WARNING {metric} HAS GOTTEN SIGNIFICANTLY WORSE for {experiment_name}!') - if mean_change > 0 and pvalue < .05: - for x in range(0,5): - print('NICE JOB!') - print(f'NICE JOB {metric} HAS GOTTEN SIGNIFICANTLY BETTER for {experiment_name}!') + ax.plot(group["date"], group["AUROC"], ".") + ax.set_xlabel("date") + ax.set_ylabel("AUROC") + fig.savefig(f"{experiment_name}_performance_tracking.png") + second_to_last, most_recent = ( + group["date (dt)"].drop_duplicates().sort_values()[-2:] + ) + second_to_last_df = group[group["date (dt)"] == second_to_last] + most_recent_df = group[group["date (dt)"] == most_recent] + for metric in ["AUROC", "average_precision"]: + mean_change = ( + most_recent_df[metric].mean() - second_to_last_df[metric].mean() + ) + pvalue = mannwhitneyu( + most_recent_df[metric], second_to_last_df[metric] + ).pvalue + print(f"Mean {metric} has changed by for {experiment_name}: {mean_change}") + print( + f"P value for metric change {metric} in experiment {experiment_name}: {pvalue}" + ) + if mean_change < 0 and pvalue < 0.05: + for x in range(0, 5): + print("WARNING!") + print( + f"WARNING {metric} HAS GOTTEN SIGNIFICANTLY WORSE for {experiment_name}!" + ) + if mean_change > 0 and pvalue < 0.05: + for x in range(0, 5): + print("NICE JOB!") + print( + f"NICE JOB {metric} HAS GOTTEN SIGNIFICANTLY BETTER for {experiment_name}!" + ) + - ############################################################################### # __main__ ############################################################################### -if __name__ == '__main__': +if __name__ == "__main__": main() diff --git a/tests/hashsolo_tests.py b/tests/hashsolo_tests.py index 3bb64a3..f448767 100644 --- a/tests/hashsolo_tests.py +++ b/tests/hashsolo_tests.py @@ -9,6 +9,7 @@ def test_cell_demultiplexing(): from scipy import stats import random + random.seed(52) signal = stats.poisson.rvs(1000, 1, 990) doublet_signal = stats.poisson.rvs(1000, 1, 10) @@ -23,30 +24,26 @@ def test_cell_demultiplexing(): test_data = AnnData(x) hashsolo.hashsolo(test_data) - doublets = ['Doublet'] * 10 - classes = list(np.repeat(np.arange(10), 98).reshape(98, 10, - order='F').ravel()) - negatives = ['Negative'] * 10 + doublets = ["Doublet"] * 10 + classes = list(np.repeat(np.arange(10), 98).reshape(98, 10, order="F").ravel()) + negatives = ["Negative"] * 10 classification = doublets + classes + negatives - assert all(test_data.obs['Classification'] == classification) + assert all(test_data.obs["Classification"] == classification) doublets = [2] * 10 classes = [1] * 980 negatives = [0] * 10 classification = doublets + classes + negatives - ll_results = np.argmax(hashsolo._calculate_log_likelihoods(x, 8)[0], - axis=1) + ll_results = np.argmax(hashsolo._calculate_log_likelihoods(x, 8)[0], axis=1) assert all(ll_results == classification) - bayes_results = hashsolo._calculate_bayes_rule(x, [.1, .8, .1], 8) - assert all(bayes_results['most_likely_hypothesis'] == classification) - - singlet_prior = .99999999999999999 - other_prior = (1 - singlet_prior)/2 - bayes_results = hashsolo._calculate_bayes_rule(x, - [other_prior, - singlet_prior, - other_prior], 8) - assert all(bayes_results['most_likely_hypothesis'] == 1) + bayes_results = hashsolo._calculate_bayes_rule(x, [0.1, 0.8, 0.1], 8) + assert all(bayes_results["most_likely_hypothesis"] == classification) + singlet_prior = 0.99999999999999999 + other_prior = (1 - singlet_prior) / 2 + bayes_results = hashsolo._calculate_bayes_rule( + x, [other_prior, singlet_prior, other_prior], 8 + ) + assert all(bayes_results["most_likely_hypothesis"] == 1) From e9ef142adbc92f17666e9f9d96ed9b600b7cf5c6 Mon Sep 17 00:00:00 2001 From: njbernstein Date: Thu, 18 Feb 2021 13:41:23 -0800 Subject: [PATCH 05/15] typos --- solo/solo.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/solo/solo.py b/solo/solo.py index e31d388..1f9d78a 100755 --- a/solo/solo.py +++ b/solo/solo.py @@ -335,18 +335,18 @@ def main(): plt.close() # plot distributions - obs_indices = solo_scores.test_indices[solo_scores.test_indices < num_cells] - sim_indices = solo_scores.test_indices[solo_scores.test_indices > num_cells] + obs_indices = solo.test_indices[solo.test_indices < num_cells] + sim_indices = solo.test_indices[solo.test_indices > num_cells] plt.figure() - sns.distplot(solo_scores[sim_indices], label='Simulated') - sns.distplot(solo_scores[obs_indices], label='Observed') + sns.distplot(doublet_score[sim_indices], label='Simulated') + sns.distplot(doublet_score[obs_indices], label='Observed') plt.legend() plt.savefig(os.path.join(args.out_dir, 'sim_vs_obs_dist.pdf')) plt.close() plt.figure() - sns.distplot(solo_scores[:num_cells], label='Observed') + sns.distplot(solo_scores[:num_cells], label='Observed (transformed)') plt.legend() plt.savefig(os.path.join(args.out_dir, 'real_cells_dist.pdf')) plt.close() From e75f72f12c12a4dc33a9c44d7f76e2168f094b71 Mon Sep 17 00:00:00 2001 From: nick Date: Thu, 18 Feb 2021 14:15:04 -0800 Subject: [PATCH 06/15] performance check run --- testdata/kidney_performance_tracking.png | Bin 47194 -> 46682 bytes testdata/pbmc_performance_tracking.png | Bin 39617 -> 39627 bytes testdata/tracking_performance.csv | 11 +++++++++++ 3 files changed, 11 insertions(+) diff --git a/testdata/kidney_performance_tracking.png b/testdata/kidney_performance_tracking.png index dfea65b8068ad84cbdaef7f4cffd5b0cc37ae92b..ed1dab3c4c222d33a0b39bedafcdd4cb58db75af 100644 GIT binary patch literal 46682 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
DHCMwHIH=*CIwi{caSlgRMVUu;=4(#LWHAYxi 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�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 diff --git a/testdata/tracking_performance.csv b/testdata/tracking_performance.csv index f927716..7e7e763 100644 --- a/testdata/tracking_performance.csv +++ b/testdata/tracking_performance.csv @@ -29,3 +29,15 @@ date,experiment_name,experiment_number,average_precision,AUROC 2021-02-19 16,pbmc,1,0.6658168009292,0.9160364650338042 2021-02-19 16,pbmc,2,0.6746171723485587,0.9178513284655913 2021-02-19 16,pbmc,5,0.6647481223195565,0.918238273835011 +2021-06-08 10,kidney,6,0.6574942259697635,0.7713399289897841 +2021-06-08 10,kidney,1,0.6491524324360479,0.7683925479354703 +2021-06-08 10,pbmc,4,0.6376143679761396,0.9177092708136871 +2021-06-08 10,kidney,5,0.6507265141297041,0.764045303675037 +2021-06-08 10,kidney,2,0.6536805748853676,0.7694188176691817 +2021-06-08 10,pbmc,3,0.6497117076563463,0.9188563930159294 +2021-06-08 10,pbmc,1,0.6410024329832936,0.9169514442439101 +2021-06-08 10,pbmc,6,0.628524458448013,0.9143017043816851 +2021-06-08 10,pbmc,2,0.6408642380778574,0.9174513476166006 +2021-06-08 10,kidney,3,0.6573702076510592,0.7709389098122496 +2021-06-08 10,kidney,4,0.6527276636519359,0.7714110145008662 +2021-06-08 10,pbmc,5,0.6339190482879701,0.915807205354064 From 5d7f322ec0e1eda2e346c10339455f251c703160 Mon Sep 17 00:00:00 2001 From: nick Date: Tue, 8 Jun 2021 11:11:08 -0700 Subject: [PATCH 14/15] performance check --- testdata/kidney_performance_tracking.png | Bin 49485 -> 49160 bytes testdata/pbmc_performance_tracking.png | Bin 44377 -> 44017 bytes testdata/tracking_performance.csv | 24 +++++++++++------------ 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/testdata/kidney_performance_tracking.png b/testdata/kidney_performance_tracking.png index 32cd60961830febc7deca592b5e8693a28167e63..ced32f30088b1c8324ebc88d65d99bdf547bf36b 100644 GIT binary patch literal 49160 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 literal 49485 zcmeEv2UwJ6y7s71Hx^uD!9t0Oq9PDQK}0~;3Mj+^s5A{KiWFfe(lxFn7ElxrsTM>) zid5+u1*9X0bVh+;=*ZCP{P#1u$!4?JbGDpv{bzISCW15bwfB9>U7q>jTlF2&r!1Jl zU@)eu?A*GS!I;p*U`#Ih-6Z^GPlmM|{v&U-?SR!j^W#>wM=Xyqb|0}iZDMX^a`L;c zZH`$oPnw&_NUfDxv+C;;R#vB(8>FR8e|mwGxuub`#QC}d_>eD8?>xw4FlHQ~|BrjD z9DI_&c%G!Pb@To+zHK!QzMj_Sc)b3+)63@VQeSfJ@MZCjzprzgIYaoH4JMP@6Wl9W zk|O3j{ozJLQD}MN_dW;BnpKB%N?83m2CMfnwSUxHCG%p-nVq}kA77q4Y1?<(1-{R( zPFHq3Q?_ctf+_tIyB(E8`VD?%5=+|YBYoPhRnv91>O&pP#lLpYzmx! ze=Yi*75==OaZUjLnfP@P{w9#|#RmK^`|PI4493~pe^rmtDe$&5i z#J^X>zqiJ}W5oZ@!E)0jRgJTLVL?GlrPBt!v+rrT85$a@s)4NV_{QFl+u8m1tS zv_r%6k|oEVt1U_U`5HG6omNP%qSrHRVNyo7#Zj)mX^3DH5!s)Sne?=nV_4^m+ zOM=wA-j}#p2@7R?gY;z5l*CsUHNg>}~ zQDNVsUD-X&CEf4O&uF}{MIif`MLoAzO*&5Axw|o6zT;VawBsN*&s#?Ps-Sd1skVXN zxCxVPXN`QA;qv;#6uh$^hoRucu z7WLAyw^ZAlDRuq&^$;w~Nd44W4?|p4;F>RnY!0N_Ti^BZDTy>l*UBBnCtbXFQMSx( zs5w~1sK9rvoSacdb)r0Pq?_3stDn>#IB^-(SsS7ORMx_Dbvf$eOC|+qW-F5Dzh<V6xJHN3v*t?c4#cTi1Dt+6m5;LU>_ z35f+*XwfDW(Xp|yx4k3}MvGZnTQ_5I*yYt_T-6CrIGXL=mfBy-4q#pD#>Q!MRp@x_ zkJX=_Xwy+GujtTc(mNi{<_w04e+uKd zS-w$GLdif^eK$8(n)CfsshwN4Y!OiGDa!MaiyV3XY>tH1!=xb%7v4NXHnZgR_+9=R z&6C$drXIhrCdm7`6_KEX#7FQJ*ruN5s zhqNsG#qxvpdPdfM>;2_8Mq4AQdD8{O$qu1mhor+oLUZ2N)~u9S#5h~yyJ>RZZtFNb zneIQ%3<jOc-zC*_px zdhXq;=aIMZ$kt4^1^b&%;u(1AZpN*~`#kG6svJ_ymNRqA^RQx^72X;+q3Ds3R-|;+ zpwC^kpj8H`_twlB&nVCT(uz^J_MvV6e(gAYt$msvFH(~=kN<(eNR~e*u*s*zIQe+v zmrM5U>)jqywqNsD=9e$`X;;PlC^Laku4uPYh@rF2`E8((%o7bPgBy774@?|vXW)b= zdfpfC6xH9)wZ((`-_`hy3O}p6BC+Po$M;sv#Y=m8dlPwM!wK@v?Uiwq4_aDUiW8X} zigrv+f$6%&3xfKu1=9yI+7QE2a05$2r{c z@`hQ36x~@){Xq`>9sEy5sU+;2M@fG@_2T=RRobq!w6@9^zkRIhJjhmY_w@9fCba$= zgW<}uHAt?KnT2=PNqFg6s`xu{v#r|7pXQq)IIlw%(&#{zl4VJIs8*bcOy%}Qx+oe2 zIN7*AeEM|t=umHNT$#R4q03mexqRoNM~~jVd-n)`fe7rFd}%6`?`*R$`_gk{ZZ zeYahmdki1VK2};_Y(b4f48X5}kuq}DC`=qh4@lRp@Uzn1m zRC21u)cPn*;_^HVP)AmG)FV|M&T7VHj1`oWlx(g_Fpo%T38kEgjK&Yb*-O2S4)rv% zS6>o!=3kN+)e+osL$_n^o*b0#eY-E=R65Q(_x6f?Im&YD*8Ko@FvBFSmVSj4 zBBo+j<&y2JVB6vAujmkOkNWr9ji~*sTHdZ$vcolRWUxCom#Qw8v5{*cib?s_D0*%k z%k>PxKPe{J?n|le3|9BcF`O%{Uu~SaRL%2fXKKH?`?UFM#HbL6W8qO(+p?T=YNWBq zk|&)@^Lw<*+dV8YZ9|!!t)Bmxx*vAk`DRgTS!ChKU_VbWdG_snYfLL+xdUI$T6Q%5 z?mF+aC--`;I_R!rp1Mxvc;4$*Kg`NCT&Cgg>(H4hN56=GdIxZoXKV+j4cRPEc6QXqBG*0rV&cgY zCtlyXBytxuiiha?`0p~V?APWscZ%W>=9wnccxK-c=b#KOI6H2_nv=y3seop$ez5&| z&ThGy+b2sNu>*L60WwEl-_W(GI3_>Xa4XkvtV@))nl8*MttaS-Ub5^CVe9>k`95CQ z^KB{T(NVnD<2V#m&1YHvj=>PC47^-j_iw!GKLPxil%PyH`0;Ja6O-x#%^`>#?>6kW zAJ3Rw);3w|XytXcM?tsuYcG}2n0K@5!6Z%lLs)oAwTs4`p!c!YYq)#v&(}%3Z$e zS5qNfoyfd6eW54PnU~DtkHaI8Me7be@9LCxfzaMD-Tx` z+Pv<<4vXrxdffAcjb@BdVF9An8gy#Zv{LbjE;9N|S6xqgmF?9oA35^^i!5QUG^gR? z1-|n0zd5|g->I*nr=>Kk^x1iV4a;q-Ep`lY1cVRqmTW+5h{oAfqiSugNw!6C9nkP< zmPQ_x)Iv7pM-&-SMNs=MiYDA=`i!xl^tz)8=`Y9z47j; z=;Qf!R~?A@T3Eqmm-{r4jc2Y}2yd|3i3pmI#F{vDZUc2*Gj|Bx6qD~v>E;47kiI%s z63-Cp>6?US=9lt)dUB$7?B)&;Z%Y3Nc_&Yv%uHa&?`=W17>qO+?%Cg3CXFO#8qwWTqJcJ29(`#69vyRR zki$X0p1(~{Z@b42~FTotGju!@NF^qh8tTf`)h1D zgs-4HiZ9;|B&7svzFkQR7iuFwkNWRwKut64+@I(qNNFhc?nimZ$2@j&GdVRpU1a32 zc66LktuvddPU7OIgk#oNm$82k_kaDzFK0zNj}CG7)o36QqHPP`==|d!zdRUoeD|{5 zcW)!THoVg@&%ZWbW{pMNEAE|`LL~)stJ+i&(t;hRchkTT)HgIg6w3xc6mW0LrN&%? zG0Tp0-q=Re5s5v;YRuvG1WruAXq&pCGp?^z&&-0QUZ3Swm@A#`J5}o0*H}yPJw;n& zP;he3*HfF`qT2ub+yrKoX~HpXL$*8~Csm!h?yg+{c*)Ez4_HpXE%gm6B2&1kC}eIu zaNV%7zt+K={w&s9{?xFsz|SXSUvT5TfT8{G!gajpypmcYa>bRpe()Pc`G;Jnskzca z)x-Y_1r0n#<5QJEz^ta!G1s{bKBkLwF16z5ENyd_8+ zCsHJm=X`kEqnd#ehg4OpHP@gGosWJqD0thsXWt_~N1aEre!#U`?Bt52tY=-TwTn+~ zBhsqvaN!eu1J`c3bzZ6m)9kk#Tefu(`XzKYCObPjLL!V)pF9d(dEUV`EbouY#faI8 zI$v69lb<(h`|Sx&He_F$bul<1{?yXoZ7+z(I_nqI;xb||AVU<_;mO@M*4GMrdJ{S+ z^GgIsmcQ62=9;kO)4|P^#3CNGTvv?@3FY2cA72FY2N!c<2D-i5h8KIYxupx&JhPRv zD40t;+H>{2+Eto&Vl>Sx@In8k)BYY_k#$ZY;@RT!lV_--lG}^0Hr$!+;!|H1q31)L z2}*B21>1tCBQMw3c2skRfy5pGLVYN;kLALXjE_0};YY`Tm!j&(nI*`MLd?9?6-bH6 z&W?CqZ5xGGDxT9T1spAd(3gi^iyF?h=-f4C)z1hfbsFxg`ECSdB(vHgD+rLIw~UcG zp+4xfWK->Xjn{Pqo)^dwwyoYXmbm58JKkk9Pj}p$+6=vAO%DOx5q-Gjl7L;q%^iF7 z+RY_#%;YsF%F~8xIvcOa6ujnF;oj>`X%Voci-hUD!MbH`ePm+eT?EHvQ|GSQiAZ}( z4A)=#o$e(8;o@``9@;933*C7#I_-w(qkRsSb`Xsll-QQ^kM(o)XpHX?GCkZDqoJ-e z*zn}Q)B7W}XlQQ(*_Fmk$ftyfSjk40lyC0b?IX+#q#L*v{mT>m)D8Lh`ILFX*l0b~ zP^K#RR&MS*JW&w9}eGa6ZFWU;-vCaWPXZWwC}LqJukeij|Gda;BBH(c@@QdvhgAvO_@y@FX>%VG&6y z(V5Mcw>+wU=EDWTsj07bZ>SgLov|BvF%=uow=Z;IWA%;J3j#2dJ?OT0m|zz<|5}W#tDu+{~DMs|_=cRzx3ThrL&c2FyyR z#=c;6(})~BO-TLPkv#JYV}`s{OaXvSQK{h?myuc(uXgDe;M?UqoQW$&D` zBKT-!>`8VPLEm@Rouck*6>#2!TKiMf{bS2{X8EFIOavxQd<0c=S)wkE=7U+Z@V?b_qY z*4S|yXe(V3vfOEg&62_!?PS?a1_<;#IU;obN{^L_U)uQp1d+UH??6&=J^2Yt{SWhB z{7GQ4tIil(Yss2D>DiC^Maq*=pXZNuX^#JVP%YV8>KNsrXv^4ljyOd-_Flw$ zcl+XCn{Y7G(6IKEdE*#1-`g;+4r5VsueR$Vd$ygtq>d68^clL(#yqkdE z1dhiG4bZM5!WpB2(x+CE@qBJ&zGMfLL+E_CWBuvMHA&V~TFCE}H#gQ@l_r{G<$4(${lpIK zA_9B}AG^wKeHTvn&B||<;I9U5+01Hk>D6}ekalWTOYBS=-n-HR|FZ<7(*=8bawU z2a~K$5^^Y(O&AoOs@9p~cu|q-_|e^n?B;!VXsQ~x8pffD@Ci;RkO$u-qi?zkIyNtFPZ~!i;yH{J4 z>|WuadNA3>G>vWuNW0LFZFt>@POL9ES=mN3j^^%1Yg6n7t2s(uh>mRFRY#FN4t=P= zIxMP<^VuW{9)}WjZ)=$my|QVC@?EjPm!e}gaAWs>K5lYv*^|-4n1T%w;sK79wcY;x zgtiq-RvvgEW?ns{^xdn=IqE1Z&)P)Rd@-b*K2*vlKRXgRmQ*Yx4PEz{3?@`GU^A{a zu%!S@%$z3vqqnkTE-A%kaEXbcHTY+1 z6FDkJlsAwi>6tz@)Jjii;&E&ehD$M?+~p;%uQj#x;xf2smxwH!b7v<0ZY0}mbloYJ z4m_3|G$P%vm$>n>xBJntkwLrn=O%MmyiwL1f5Kwg^^z06S3*`KT$+Q*5h5aDA{JsryqN0kweM^Y1ZLQtlkAi78 zy!7o?sBo_uj4XCj9y@cv2wn3ghccXLL~=*Y<(W$ehi4lp4)n){ud=Bm0%#)f^G>F8 zpW`8saA2%x%Zy{s&yM?iLsSrc2!|);xTL7)1|lce(*~sd>nOPN_jMnn`4?+xxb z=u-%njk~%@!~Lps+Io&JQ(XkqhN=b-5k`EGl+t;BF`_zTP0DX5k9D~b2b=_~s09!I z-To8D6}$?)@k;)a>YCppMkV!1MS632D574lzrAr#Fn(g_l$woKR6&hM=m$0BJKcq# zA{fjwQo1D|Tv-}Pxn#Vt+_51v+nkbsF)O0BS2>bW&($v;A0$+9T+36!btprcbSG2cU zrtW)(QeHEVu(XdCq#FRO0i4-wS6v*W76Wh(K%f-85WuJR=JS(0SgfccTllX86m=%| zhKBoYAK7EzeLya_>kw~IZb!M4wL45ZlH>!BqLdlir8|!n7ZnvXZqQI3wW0zSgcw9X za-0AcXQ|YlV&X#BtEr7dEl!}0t{vOM4jqnV&zl__$aW<8x&_+Nj*T(_b~;QydFF8d zFu9TECQLTVnu%;2^?;V8$GhTUcObQmp?XAu6af8MAMo*GP5fSKqxm zf387QJQj9%tqt`ucs%h*expBkGQPm#OrNSlShEIlr&T)ft5o=(91`qbS@*&+V7QvY zzcR{ybE}#Fgl@3y7!eeqy{Ld1FkuUV=^D$1*Jx$ZQ=Xvd>gE&{HobXJrE3J?#=&@# zgW$Y!a*1_n?9^3;ymzyE1{AGEg5@<^3a=PD}XkP{eMWF z(nIklvEEgIi}W2elGq_=;J6xv*6`JYb?E7Jfwv}hB(-u;Y8)kSFWuQ`FrVu9IiP44U%Jn*mVsLl&h~Bm88>0EQzIFyLN2@5(jm}IWt^!P;G{W@p}5*uqGPgtITp6vTrf*ppB4Nh@&e| z?62nD!J1PN_p{myxsV6+MdCzxkst}d06`j+pqCuUav9k{z%y3h z5~Ls}ZkWO7N+Vy3?NlQ*ujrVKwFdZkH>wKzzP5wS&G?)-C^dp>bT_A?YNVSXsnn?m ziarG_#hkm)4KY&g)i_Q{#nVM8uCofwK8KDqB@bL1W9%W)D?K%0>(~Kdp`pv{W@le zLHTTiSe&UE)!j3n$g; zYH4bE5O6EUa%A=aRhg2HR9r6ni36*sn=(Wa9k~@#f@?NrjG`vt3-f>_2ZP3k*ewyi zBaojr6v@kpM17pX&5@7?ej}l%2?SFPQjpJWVW^n-t3kk>$@c0J?Ts=`FE7m~MCInO z#BF1ADHkbG++e8Ki%a>H zb+G@9yVI?pD9A%w?$Yb}a^fVb)s<9O~dbdWM@6rt~0mE~f<=4Sa``X`N1;4s?Z9 zt?wjJ|IOidm-~|kKlWmCb|dAkbOF*>43dT45t0ZJVb77HzzX?OYqmQO0>GDpLuKjy zU@AzIfP6#6UK$b~XCZ4~dr&Zv>m~&huBnDuuI%8r{`M+4a8^6rp>b#g?h)4T78f2k z>NsgM>ZL#~D#RO3{WWq~A`T`LM+l7L4ZH9@1{8U(K7a`W(M0gd;P9MolKZ-(! z*bgqr-H=^=>Yy^_P+5tb;~9CI4h;4x?Bf$05ADLIze5i>^h6%Nxlk%KJ~b(61GSM9 ze?HZQm2ag`&q<{X)cGSsJFT z6``A$!KGz1VbZk6Ket`z1_BE4D1D$4*{`Vyb;nW?^b~-i^tH@c@l%oiWe@uMqrB1n zLeN2Uo>UskH{LO{MEBB|(p~VUmOm8w-H_s2<=$YAZek^@LjKDoNE0g~p?F_q2wLyG zkmNw?*#oS*xCCdp5?!bU#NCID1_5*OIV8$tft$~-RHW|gL{Lq29sioQT%49Im)3QC z1ei!<59QrJ57d672Twy-=I6+dA6_z>?pR z8bKg@Vt0XpgkregkDOho^l&bFlBZ!KgG!Zl?z&27@gT4VFBDg*8YhEKfAv$}cXikY z0m0v~H_Tu+fG8^9j-vP{AV)$G0DGV?#qB>Qnh-#pfN3V8iR}hB)A+33H8*{bvRvhC0RN=k5iIh)_@mZgtb1Jv{-c!Id_pkNeHu}csbe-`ttBKZN3HxECd z3vbYOqT2|e#d_AJrv^6!Cs-W9}`ZB8fGr85UP)^Ac$_gYbs3cBn7oH44 z@>H!7%KZL7IgsT$+(cB|Yf~LK z8G;78__E-GDQ7H}2J;&#&Xgf68G;9JT8pR~BF!8rp-5PS&>5hrK{`Df>dfspeqN}( z#Z|@z19dso9>59CWQ9!mFqa88YQ$Zvd%Hc z)7kyfsIu_HC}Fz!aRMHlFhUQYnMY^a2#}kZTV{KlPKoDSPU}O zC zr#Yo%WkyK)i6h+HTVfFB@e^NPT;wsnMkD|%m{eke`$ovQh{X1(qUw^bQ}_U-URC!% zvxduEiVl>w!|t%|{sh|db&XZSb_w}^jZ4mG#Aa>Zy{Gc5vc=V5oAS@CBpF(8Lfrs*Xr1diKvIcZ!DTCv;4B6Ng=qmh|JKP<7HKH)(c;J1YgYb3@{~*Za=&?4 zR}-P6_!o;v!VBtkSVLM6yGff`M*wcvWol|VxDJF#`}#WDGL)cR^&`9gOaumMXI`XM&c%DlhZwjf*9jOw9SZs?>G(RtVWXg5)b`Ag>9@uR+f#Eqw}QB1D!l_#D|Xg3d{! zf`7QtAj=*SlMHHt>1W;gj*aS875mWcAjA<$LvP$3for3t8nwQcZS!NB2;x-a_9@@y zIb`y3%pWZ=4OIawm|vjK_j z#-H8A2vh4w?o1QQF1oixC!a$sE-X{FANSz+Q4fGo{*2fzPI!i2Zu+-t_^;Tfqi#W3 z`DccdiEsZTCpoShwYbF0ajj&~!=#m@fV?KU?s0L+{Y~%^ps0QU)^SyqojX`Y^Xh>+ z63wxT$-He7^_Omf`#1P96am>^xd~>wf6})6rkmiwPMAPYaf{FUOB;v|-xaQ)LJG?Q zt;GLfeI?G30q^=hBNx%CIzxmpv|eN;uq$+^y;bPc!GzkoR6t${pKn9#IZ6&cY;ls1 z+X0bbzFu_cX!SD-J6Omnh0>vDCbZ{Znxh?ogBe!^ITQ;ZWIl9Vp(*fuv?V)-+bWkn zxI3(09J*>U3gv0I43$(PT-bGG2r_^CQoJpy9+lu>P7`G8ZK401SVXqJ0?IDlfE({M z`J?z^821qnUO7YwlB}E8>M|N>+f40jd4=v~mH??l?{B-h#-^>D8;w5ony`ZGR6!{d zrXN6$rGRw`09cc$4n5{Zh{AUQ91XJoyqZtCZ(v{IM3|u$+2d>u!KU44Z<$WJE%h#|`Jn~6%UK;7Vjuex8 z;FIb_@;6YYFQFZghufJigu0me&0?G%0^&miY-EwLxx=O>PMlz-6Y2(8CtuH>dVUFZ z&*2?2oBo!3guMye*KgpfRdFnoJdHlAk;Y`pX}F%Y^^o=bgs5t0{5|RrF%@WFW3X_b zTJJOMv_-FS(!^v{I?)vg4tMC&xBeqGfl6H?fF&fs+zVh=jHEH}tCSn3lYbP*WPB3q zrzDDl%y!$vQYQ~8SxeC*OKEKE+PVz(J7gQLfR=xOGz1_w6T%y!mig{C_)gfdCF;2V zgB4$p?oN;+1DWQ?K$jgfqs$i*1xZ2ROPm#=%lH{q z4dI`3oew{CrT-_)9?#7V|5A=rt`6oG6+x|c#f&GfV;73j^GykSW18ZIf193cgnWUT`E8sLZ^;?NG9 z93@=7uL0tgo(Rz;jBg#`k7SM<3Fq~{GMZ5(fuAJSE@8xbAwCkRz|5R))If3T++>kE zpf!VZ63mF}tQ2w~!vl~^(jp-*-hsC))$% zO;C3FK$txc8QX852DoC1=ULrTG&S6_W~At<(s_ZXsbBr0)_F77BdC3=Fs^dx0P>Ot zC@=QHnXsOECr*6*6z~F_n*Ql>)i=88vy33C+C@s%aGeBF^AMNrQ%}N9@UI>& zX2!-tYBK~G%cJC!&yR6#cE~g_l9y>0*^)OBE*3cgh=>ZsM{xqingfV#7R#nV6Xe9s zQXaE_!6v%2oiId_31M)8>quWhdOnOXmN1$(LR4bP906vr4>m>T=|byIUlI~!d^;b{ z`LheUUd7@wenvN8q9*1e6zj~WFEoWG6e%^=SDwkOD0Gfb8F{-;BOj*I?(P7d<5g={ z#lCWwG*^?0#;$^(3dg!x0k2VakU04>fw&@_Rb5TnVLxbW!2eV#5`RRv?POuAZ|$l9 zevksjvW=G*9}zeMxekO+b43hCVHDiX#HT=6ezNqwH-)`Y)zmaxcKPqMi~dfsmGCyv z!Ph(ZzCC~}Qt33Hz!wm$-N1)SXnk)@UsyY^3TB&D7Za#!!{diJ1WkRmFD3^7?wmh5 zrkElBTq=(&^mL0+Z}5jS(3;MbN?!FRvth&a$Sn(DI3oUC%=?=oe~?Na;gYF=%&yVk z`N+mkK$iPMK!;>E4RfOSKro-(;Gf$o(tueW#VX3nmt*->nWrma90V_JmK(G&XKj73 zOaBRbMMqVw5#)y?S>6SsZNSjmU?MB032#_S4oVm(G*Vi#z-m4(sF!JKzxF4c%VNID z>wkf?|7^|kU;6c;{P=b~MvBaDdDA}%T26#HPcR+}OTOUN!=T%a^_f|^Dp>l!L(l4! z{|Zcss^KSxUt29GJJ3h{jLG~;mFlu$#t*QlXZ*^scUW*KKiOj+UciDXknBJz|1Tdp zcGw3^bl&&DT1E)9L}DFIct`Db;IrRozTwQ5M9$nq@B2mb4ZXwVO|ba?r7`6TMwHJi z_#RLG%9w&mg>QWPjNL!{>?q0kY)&B&Ta*L*C5(9Ek;j|mj~@uYaDYXC)@E^Vup65u zAEqe)Q{e0Od;YJvTWynmc{k3sf5IZ(`+5I{qWNt44GFZ4$x-0rb1`;8GKeUMM%4|^ zr7&v%r5ym_G$D?;@h37oXV>q}f>c0JcZ5)4Yt7bU2(?5lA6xdtbI?lkQ3xx)VfP$R zqsa!(rObYHKa!VIdASh0Gc?UM7JuQi`6ntCos@*XY9e`K>j$vCEyr=v&*OWb>mZ8? zg}wUB>$w<;LZSu9%s&kiAg2Ni6M%|?hUAn$StOaMg!DKFa`6s2nKM`W|3d>wbSNeV zg!YKpY=g>(L~0aB#mEQ&zu+CB2E6$u5||r3$QnrL8jatx()I|r#Y7i_mk6Jc!FYghvn480U=w`* zs;OkdFTiv8qtrlrb1v-`>Y|5m{3N!7hLL{h8q_+x9u3}YlzdB7s5z(PMd~A(5k-ec zgBp%Qg&|R|q!u8G#u7DQY+?b1*%X(TA8>|lhpEuWz=fUJu~E$IZ%h;*pDY0PpC$@$ zCA+0ld-jr?B)%bs08dYm4+~1M&es+UL~LO&zJ}1G0Tt_iLE<8h;b9JRpepVlzNQocA$4+aAUVM5}Rox;B{_ToDw)icAU`WasXez}z;(#bM&c_RV5TaZC)=bSqK_fz-l<=Q*3@FCzmw;go=e&lNDTFuI2BqrrmhvWtcmSa1sk+k1&MDw z|HiN(v20@2Nw>-xEU=|PG;Ev}-y8|J)SQ`Y&hf3Rl^4(EYx4k)R;8K`1o(#OC>xLz zhBQO+a9ehhgfCcm^dv19N_80hW9k=XZV&vOPvXHM;GEn3BEmUh86<&ON_|fqdmf19 zlNto6<7?i>8N3@UE#bijf#)khvU8j!^hF)sOo3Gwql;*3paS$k z%!xPm$!(cPWIYBGq_(rBx}5te`2q|XA-5k|p=+Y?f+sP*DG1_XPiHu@fYElnniV7# zgz*h#)(QsLjcWAda+G=X%43Gj5bhhVJB|wtf*RD+dLcOLps~?mFOmmvqp<-!(S_;` zrStlEX4a`Rk0J=_OOw&Bd6yvGk6#PZB5prUPL0ss+CEu?vSy?qNhc_-E4~}-8*x%}$A4*FIj67`cGO}hTl(YU`yU}ZdO}#EhFJjYV^HQC3jwtqM0kj5kg#pU*l;?} z;Uu{eI)mX@B=K*t^Kg5=pzs89j8aVgLC*Y$1J9%QWwysBZnK;7cgHXH?)r>dn3V6U;;fFj>+BU#u_e!DC%)J`d zHb{yM*thG1&9C;I)K<_oz-TQJ-jM=<6!1Nmr9l8048<%HW)(=LJXm##K`n8kNeGPT zpycLp$32ijJfawc()O(}izp0=PPVb8@nS``6R<+$Tc5< zCFtJ0d-?5TRV60`4G7{!gE!aWxxLRfg>u8Rm$}B=EIqt8KE9Kzg0OgPree-~bd!XM zgR|gAj!i>ik|Gp-eh{RkH|gqOuw+_qxOr;5)0Ug^+Byp%CUC~^4I`{s^1>h{1Yqu^ ztxze=Xc+4==gGo>V2Ug|=*m$Uj*;*WBm01R1Exdfk#PcvggrrYU=yk>w^)1q5?*W^ zPk5-&A=^~};Umqi|93q#&#^?iDL4SEV|AEr1cu0$$wIft!QyJF((feni;QZw4RDkD z4N^MEFCaQxp2Z~_O1RRJZcf!`j&>SX&|L7!BX>><{C_nqzC&G5eF%0Y<91VEXTqn| zh%;LytqjI8r)m_zeT?3bnOIp#vNbAv1$9qvCPxO&{MaCu-8sO@Ck;8@P;tl5)ow@C zy-`}`s5->5y06{Mkbx*T@q6Wzq>H$GRO-1mgN;6NM5B`%Cl7{MDaldfpTpbm6gh368dnKAh7uOy|sk5uaf@ zW|cyVZcQa`(pa}scZbD9CqeL9T)L}?&5wM@!EqeIyYO1kPpse_enTLMi3iXczXlfhWdylMx4%R|oAsI4F?BpOpEybQSk2{y7c z%>ZUwM@&G-qcNyhpeL@1YmW`u4EMDs3#SL!mg$U21xhNk>N-j2;fY$S_o4v#?0?s3 zPyS>SF^}t%3#hGxiibaj2=bdSQ&4%e>~?{9-@KRhUpV_5)4CPuI4UFk!6{>7_mnP& zDt(G0XjOEbN4u4IOez^6AX|^JVZ_GVtELJGPypo>GFsVOgXw=7TB=g}?0s*e4NF&+ z0vn!Axc?*<65Jycv&&h?7P#Q(nd7igxRVsss&R2~ zL6pyeJS4O|4KRIox!WK%+};IiPkh^qr@U$uP_*QAjCWg$!*GY)l!i`(fS3#-v^YGz z3j>5avS@Zf5Ku=C(wr7!DD0jj%tTZL0vm+wX3BJ?x+4UGc7n+96htLgP$Aqzlm&02 zNIQToAqeJ>w6$16#k4t!AW1g*sU(JetYm+bJQ&3aqJzUf{uX{4Q9$oxc; zsDdDJOU8?4c)${pl;5s2Hc%gg7VB{j8OwTJ%y5oMxo$g@9OzVakYfykH)p#}1WclP zu{qQz&^4nsf~nbHXfK^5JNT8XtgI*WWNJ&cUt2Dz6aS=ijL3B}W|g_Mx@o5`MtdB> zXx0_5qdqPmC2f2W&l~#n(I|$^vTo4{}iq)%` zJ4~ob(j8^`*A-Mf4GRc^Ai4*ECh{#JelczTVyqoC;#Wc-R0u+pH?>ZN)J;?keh6tN zWM@f5Y;wB49?0(d?!q!w)M8Xf%F|8(NpDHH>)J(IQQiPL-5{Dk4(e^|u z*zZ9i>IFa%nxO_mg(+o_mePZilJXX%+FlHsQX`>p!oY$I#CIh$WkE2$guX@5Qw&{< zDi(8>PJvhZKFyV>=Z8sqe%AIv;os;6F;VBQOpvkJLesmLXxBCE7cib1;M*BCDfE-K zNmEmkat6(5ZNE!$Cq7IcbyWvCQqtq4a1=XLp!OsCo>nKXlQ){q1l&OiX7YLQQySk+ zu*x89Bh{(yeDf=sXl??W_x!1ydA{;86a%RPAVm=7f+_TtW1;{i-bGziK#ydJN|;R^ z7OLhH;FgQzV#J{*3piC-ceuHegxf~$PP4SZMjRzY=mU*Hq!Ef@*+3Cvpc)#fN*~p6 zKZ-thkT;gjlLi=(gKg_iT@!52-;tBW&-ofADt(^kJ&s`#fMt4&8e`s|GEW>OfQz3P z88PXpv1xmvDUFtVH`s3O;Ff zyP9;~a5{f%1A%%*LL!V<2|n9=c$l_l1!T6^@wvIRD8Y|o@P-60g<1t91u|cA(Q7S2 z)u!T3Qzd9P3Nx8zI79VG?)kVwY1oPUDRb|4GU%I0lAl6{Vg#WT4N|3AD;QCea4r&X zU^JY$bt*1)DStvV#)JfxIsj~_y~mt%wof&10*GuHoj~(isr$p;fH{OFrvvNa1CN-| zoJVs+$nK0=zl)nG+2Ila5s`{JN3(2xctBB^A555vtx(U$X z5mp`fxMVQ5gnCj8HBp5Vj~YE{!^t|mR6r1OM*K0pGWi(+yfjx%sW(J}hPaa0h0sbd zzFZR-u8}%IfsG%Z>!O)Pdzn^ZJc_~b4L+=q-zK@Q;&9BX*)sjD1N+oeC5>%U4#r&AX|?WZ z#z(1JuXgU+xqABC>+`L48J*trZR5z;$J~Q%(~E+xo$|$y(s3XjZxE#ZK=W00zCvJ`N8r)D;LX45aU!H>NuA&MsFakH=k!e& zQ>fP^km=MHQ#1lQ4deCS>FeuD5rQh}wEOam1z3rj#*>PdA@=EehyK_8fN`yv*Sngg zPTy1Z>}e6E0hNbYFYoz+v9l~CtL#^vasS z+$%EPO$HT--^>Cxn+wYNP-*i0RmRJvU$4tk@X+_oe&umXz^!)9v57PksWy8zh9X5| zYdRU`J@0s$bYx3UWZS9&9BT=URkzo^{Ur!h#pg?je!lVPOR>J>OP&Ar517clKrZuv z^xCa@^_hPlB02IMRt)27y>1bMSu%nfg(WL4-`}-0|KYvWiJ|8Af+sSfv@ItIpVcZ| zXO@>?w{@$UY+c>NTt5|P<95^K9V#vIz1kffe>8^9^2jm}$zHRXsx0cS%WX%m^#Ivv zkDi_|>e-r(c)~`GuJJY%A-jQTN#)S4WwXk3nY*`cCGrfBegQ<1m!qSj2cZ33Ks*da zRLjd{Vs?m*a6R#E9S%#*I=wraBemytwt<#!_Eug_!3CPZt6yMLq_Y|vCdL|V2Qns( zs?ZSM;j$V?(t$+FV?d4#ecA;v+(EE7GHuA1hO<*$RUHkeImHQ$jlnC_x%Dt%yI#Ib zlk?#CuOpB}2u1%>Oc7g;g!ceS;0O$%OL1};%r(d)c(S?><@4~j`f|^cdn1-#y{odN z9yiEPO?F|1_by%e=8sK!d$gKhHEi=(Q(+>TT%X@3i5cd5G&SeY;M1*JkwCY?s!)fo zbhr#N=ZQiW1g9eVC97pK2TkB(VC`E2TC*`01`)ht6m6;FYy z&%?Z0vx9r~>>(L7rW{1?GlZ2l6H=M@g&cGdS4o47=L6s!SiS`+Z?l+@Kh9FWETU-t z3N2?nit5@B`EhNbSi!4X9`L__!L0GC{(cCXFQb{-ifiij>_>4xvwVd+(xIg}08tT+ zVrJ_@le|&MFTmKe$`08=Wu7CS8TCr&1d-51bth?Bw&MJ#vRe)D`!k4t>u>@mtbKt% zW6}h~j+NGvgqvMx=-V*N|9aO5b@gfLTj|WS_AfrIvIaW_=SZZ9y{> zJhip70Ds6>D#Ngt0qUY2Q}!y%0)Z5~f*CyRY9tN&P|R4`(Yfc~!TA{(8BfvsrqHyk ztNN+-af#-@qcLJ5Az!V`1-8!&jM=FNzK>(khXE10PDXlXn6Eodr{Vc`VMv*|?I>32 z1DNIe&p=ggyBtitaw)_*mo@5}c4DZ4nERK~7QS7?uI zH-j{6A$rxzpma=QIxxS7Nv74+AZ?yO+xOt{i7Z|>agA^AeJt$}(vp(bxm<1vS_?+A z#Sab=fFWlR8YYBNcQvZ9JBkiA7$BSl&~^UInXq!&(;S*T5LhJ`;9gZEX^4s%S2T)tw(4@9Ldt{t>bfE{YZ*eHmOEp|0H z_-xlr<{2O=>*3e=0fqiH&_{%alBOWpq8bDJ;^mW5(M+5{3H}|l`BlOYIwjuBKVDA? zOxael^PE8qSdVeRZbYn_*CeNZ*@+1$moagj_X9?@yaKyD7i;?})&IP&rSbJQXTN~g z$LSh>+|c6K%~u>J{eM_E9i9<#s(PMVTG8*3rlu;+`RXl2cX%cQ^Bf#^=jnd5iaomI z%9@$$Ze7f52u-`-Kle)ux(|ot!cJA+x!QgCvZu+bjH#Xqx70=Wqh)=X7XFnweA#cgXcKE)yEI_ekkAai{y9V3x39DF#0C`M)KSC2V{KQynMW`v2Nqy z`%4#EbbZe*czA0Eb^dL~!xr3STBMbFn#gL&nJmxy<4zcr0(UD(OlF8y|0+kR(5QEQ zc_AK=q^v%gkX1KJyG9hp-q*BZ+@|EWzkN%xQMDu*v_!-+%AV z{^uUiKlrkq_Gg%q@Bnj~-k^(p91-D)v}tBrW#}ruY>juGtQ)>Lq9OjIsnfDsKb(q4 zT$Yee*cLw@;5I%53zbE=|GHf5YljGQuPcdJ+>YrA_tC#w;LE#Q2Bb;2si+>9@EvCH zVb1BbXBZb&M`M4el0bhiNK3@fC+_&r#5o}cuzvyH{h5KK(S0Sce_CIF5#z-G&!ujvxhKN}dZJwL~pmcNq6o&}3TzmHJ z{c7e+eDoeNgLT1b-0}7lKBTC(ie*KR+e{)Wa1>W(N2RDPlcJh*>%$nX{W_jW)wiL>2|2E%1=l=>4PT`DmPDEviMA7(;m@^OrU&E9=~t9Fn}!;}kDLj=t~ zMgF^k(ZaP{R2QbqSxG2_6tHH~8~hW1R)-gyYE61~+tYJ9#>)6~BmM?{^xgbZ-O$l! zIfrheRYHpB5ytxt5s^txTT+y=_}xf!SHGbm>xB8V7)+;oHunNn8C2#hTJ9Z9Mc% zi=MqoopVcE!$qqFQOXbZ?~kOLf>T=~f@0@D?1?uvSpdq+ z5LO2;@TjU~h!old%Dj>FP~zWz{CGJHm>!@njL9KNtB1&EmEB<%&pym&ZK(GUTiH&8Wl9&MRw<6xjS1+?Ids zP5#e)+F|K$%bu+kak{q%*>$e{%1sM}!eWEA+!Mzwm@L!TwQe=@MG1g`H zJB}Q$Zr8F1U#l}c5z8e$=AE@=K8cq3+;o=f{GuteyNBs8jyr#@5@HMn79Ck399H?Y zVh2FmC_!plKN|F%6J|asp6kUo#{X|cbIh}lx#!_qXWSsC*oLlo6;x@-RU+tyZe|~i zx1+C2ehd(}k{P;2$!>wRkAfH;ccrhdsH7)bJcP*o@kX-m6t`~mZ8bx!G z2RiJ!^aqWvw^1j7Sq!fb%P2C!T`dgh^i|NOm~*TcU*Y`X`-xA%1ymRQ5?UZ-170Bv z5ac?(N@HVAZmuE5mQj&%`EnD6Kw?5V`}!~_x^MVReNV8mU&2VEkGU%uhn#C&c%#bK zyrv_@jXM@yVG>_-Yv*oU9tN#sK=$+dnKMC75PXN3T2t#V&bIQy81kJfHC3RB&|)uL zycikwE68-ORhcE526OPur#oJ;M)Fx((bAb6L_I`fb1+MAU`+olujCiyW%63&m7=ke z=X;*L8db!=cp;D_Q93x-yVT4AC%JU>ZaQthRL^l8vo>A#$0A zvGYRKZ}-^c0z)#-B$N3wjF+t=w1*~JTY%p(w^jNpxxUb-NckuT^VMLf=Rt>HM&C8M zbt?^7T8+W3moLwQ35b~Z)flF_9{=smEXNdL`Z`ZnObfO0>0+g}VG!|UFf`9#!21r) z>F@%gFQ|yDrtzPPku$#DTo9PP#L*(3; z2xU?L1P3tXh<_zi1a7~+07s#wo}d(b+e3W*o&VR~m4-!mo@-*7*ywS=C7=j2#Aw{0 zNJJDtqbNyCVyzJuM2sjJWk4jdI3QYM99eCQA_b9vsZm5kWOG<-1SUoSm!RSdjLs;a zY>w#6=&+po{?IltNo%ija;{#d{nwgdmhXGN_kEswd+>0u1Sz;h;Vl$UehL0K!_|a* z5WL;Gu84wt6a&xAUA*|@X%P_Mx8i0i-1(av)KPXS=v0JT3;P~1vkI`e5{UyO18VSz zF^Kvq_63zwAt${MYlA4$H_WG$x?$x};t3stbAbt~0wCCK9Dzz)VlQHQFwQ}SI48bwzL_i?PkuziJsW3Y zgAAF>q>xND1xnoIphbat48&@TL?m5KPUJ`5O0W?+Nl?nHQ)hI1goRD z48HNs@`p5_i~&)^38x-d0HgM_FaCc)4y)$@H4eVN?bEN;Di$^%8o#M(@*qrEJFvD^ zy>@xs9}cFzW;XZp9bd)2@y3V+55~c{YovXrBKi6Ahk5Wh#7b75nYE-~S-u_8I;A_N zq1$}AfyN)KN1y4|=c}dxGvnJ=0zw7wz2t9b`kkLEMgGfZS?kRa{^+ou#traUf5d0K zC*TICRj&VEbg!6K8*Qe(U@|o2sK3`29KO1s@pla`8SOk85}UCjzIRg09v_#vBT~FC zp5MEqD);;)umWQyZ3U0;G}Zun(gq$x*E**$-~WBo1%BqjN-pRY8vJ0=FB)4yYkV`RYQK=AZN zO)m%p4E}otS`Tny=$LXA6`{*ry=Kkm?hM6_k91o$LCRBxp)^DMpqQ|4tVJgFSBDQr zVE3vIixvN4hD6>1EOy7h_Z?mtJ$f{ocajF^Jw6IZq!KH{i}efAFZ!dGi6Ih?IkTp) z^Jop5!f-7Qd|A`;k9qU0`@f4_=xR2(X1iZUH7Nn42Lfo@sUgs&4V{AFs}jR&(bO=iq9nhsi_`d;^4+E-vJXa6vLkp{y8yx~YN3)Qr@%?CROnE*?@qy=DNN_q6|Y(m zTtb$=!j zBOjV{#JA(bxU&ShBpgOm7HetA-j;*f;A$F#aDm_XN-?-(0)+FHrO=b~hfj&6<2X_d z3e;bZ-0HJ8c&z;a=yIv0*jt3*=Nb<9rN~1xFatffKZe-eoY~Ui2A%?{xM-Amb$djG zr`r*sZ;IkKRwB7^dbe4Ie&z+dp-1%RRFxPMpl$z1SkJ5@GSlMY19XV0}3?NQ1gK8!U zx=_D^&J&B~|J`a!s8YQGA#deGmE2Ic$U=hr!!xiFCBgLp_l=D?S!=^m_bb`nDCU63 z?iJIyBr19l!ME``{h#zD^L4UAUD}1As>24aTD82ZqsQitvklW)v8JgQj-kN}kA?}a z1q9MER`49uh zB5o__M(V~fi1=DTdncqqQ4$F*p{q;DS94QUj4P5Rw8PG50>o2Z(&dIk*SSlVCZX8Y zTHvhm;_-c}t45pK4RVtgKQ{3B>tSnkae1yTcpgfi$0`(XRsd}1M(BG7xN03e@s}w2 zOpRMZ`^Xver^lRyf#6sp3CzMvXMvB~QQX;B44xL+GH2YM0gR3^WoAXofKCE6@64VZ zbUPbTIyn}|l0?7k*Ak+u`j{=b)AxKu)8H*dRj8HCS=zd|Fq#qy;ghq~KUXbQ=4JfT z)nbe!sN#4R@Vavyw#fvMf%(c_i(B%US!!OMg8=t(Jz`vN1h-_!>y0TD4Z6JnUs@?} z2RjPh0@#ugzOw%7_j+yixY$zM(@BLu!8x$}!&NY~aK9R!Oy3l;m8ReSpq ziW2Wdwjuz<)$j4d zmgEnPwUp!2nm5fdGfFN@=%xWI(#-71wp)vOu0D9JW61q*{q}GPVM&Hph@1nG%Dug? z30%Pbr-#ky_sK*4TiG&+)dToE}U1v%VxH4=%%mKZA%OONp zLz+9+UZ(9*8sfedjn80YGAOs&p$p%v%fNmI_w91Tn9Du7K&ECt^iboEcK#vIvH@{W zJJ_6Ki_2Z4g9A=R1>0Us<9f~;4Xlx4MvZcK3t||e5WsH@J!+=@yMxYyF|97f$KDJ& z(|6l(pM-7&E+b12#G~(juv>&=Wi1%c`yG=+i4tczAU>sv}&8HV_ zR*%Zxn)jWKYH7OJfz=tm{x~pcE8anJ{>4#ibo<{_GT55PW^X67^G2)ZNxLlYw$K%p zaF@loqoMAdRD>%WFYS%RoolJalf;JJe05ur75?VLp_=_dw!NC|By44+94YUB-bKwT zODGkRXfsS;S;f(K=P$v0x!E53O&5I?4#=ENL8(HMnQVXO{eycU9%efg3x87?8t2|l zGw~r;zX%N9l?Rxfyn~>8z;W_AsAIkg4Nq^U?BV&wc<26K^!fdFI1oWmIO}ZYf$8{s z_wI-1n7Z9uvDAN89^BhqF?geHP68QoGTflHoJlu68Q9B~EdA9{&7A{uDJkZjzuI|b z1si?wGW**BLooXD$(!e%I5B7=2Rq%}l5G&wwx?>7aTU6N%*yZF!@HZp7aKKn!kT`S zzsAdIi?JRUfsu9=*HWeU|X#1&M9YYNb8g9h+Q9T@Bjvrh51d^CmT|n zri{To6QRV7n%}3~7L`4by!#)&^)416EEUOB*t~CP79d_Y6Vm=tp6W0XDo@*i64HDA zERA_BESWjr>DKs?VFEOP(nJqItr;q`YT>VgUD4YuNpy7qL2SMB*c1?dE$>dAB(8Z+ zMI$x8eF{bk`a`W*206AFag<)nvR-ESbmc7>o^7yeFg9ihaCTfSktSe|rBmBaPc4B^ zLj|i|1WW*fI5zB*v+uN(aR5x09x&H0O>(6`<>tRrkA@lrci9z4cDJm0@s!~fKmem=#g9;c=FideUG0r^gVwe=@qe+i{eRNTRy+|C7MV}14feX< zs+b`YM4Od!e4zT$JXGM5p%s_Se&{Q8rEW)jCh(+8%cq*x)$Y5);KkZ%%+9@C`< z(0Rwo>f3L><$h_4N)@~DIiTzH@M5-X@8V8*%rzg(-IE^le-&I`2rmVqD(xxOBfX6T z)Al)`5cx%M8<_*;TtU4QDk%W9n*9CDHt+Y4)ZMZdNUlZ(+ne@g(TnYu7zz~X69F5OoJbjMPQ{I z#8EyZ&FRQ$u255SMa!VyL#i`b_YJ_-=E-<2&6hS|qv*J5u3&`N-;jOht(~u=rKd+@ zOh*}PcL8T{`dV43F#ISAT@V@;z_bEf0IO~ZC+<$1g^rvg4oiKdzHH*X%O2Ph^TVB0 zl2=nG$%G=3^-NkDj@=z#TG~$s^K@>S^$$_?pXl@QrFnkY=%*=^gAz=G1Lj%0YNbLk9LwlY48Famqc_fgr z9S9N3o?M4=Wx(z1T2d91+i9Z(L zsN@;15{e0VF{pwKr#E4x8(lpe+V7Eb_e4hHYrmO^Y(o6&vk0aC^D@f+{=F{MvxwGz z4w5~S9*(iGYU~t|&;^$Q(lcQO5g!-7D4?As@ZF|>S0*Kz2d+zvWRcEwp4>FViO|CW z`k|V}zj|d{Y3nAP)YRT*VU*cK>!rv}a?ABZzy+ydi?eYyu_~3y0r8;gh0znX&@DM& zoTduH!=nh0&>zSECEo-hN_?Vu5aHQ){qj){GtQ+>R~}zEo4Y9)U0QoNQI3T=pVvTT z0&2Na7JoeBomD-3j@1Ml|Nn$kT_Pdi$#_YI6}jn<5gi4-P$u9wP~sXSl3>WKy?~}s z1EvQ{YQb_{MHP`3%_!Kw@Ftka&dkwBDtg{|=bb=@T;u?exW|4AK2v!}hf??1C1#&R zw!y2OhvU)TXCJHZT!_EF@n5H007^!aChS_{8h)PriL%FQ(*8frr`H7=L965PREek(1O>(&ZiYRzI=w9()_zz4>MW2Vpz;k9(x9RtGDmIp zy0vv}UCZsKRqT}dpDf>NKKWw_8nv6_IJLdSx&?@51c8vojN+o2`er1fcT41ca4Lbf z#~lO5Y)r6H!2$7Po6)2nE)T1(+;0h!W&{c&QGzXo>@7zwQOMc-phOzrUv_cf$w>pG zu7GV59-Ny=K^VuP!AVwM^Ij)U94HJ$DoZvzl-}%2A@)Q345;Y}j?thx1C+TxGHxJd z1n_CWK_P&SZ#FLg5{>CKQFuf}c6DS+C>tZqz?K$gl)x-A4pt)JYJ*OLrT|I;DQu+7 zVmZGJ`#>uz(!fG($vha&aO6$o;7d-yB`+>kVziP`;FvA75j<*1Fu)KS0T7*{0ZtSS znvsLw2xCKMX;1!OBEP7zzPq!Rbrz`!9Np|?ZC9U9#);^-96pwO5yNg?2i3r&ULx@n zqcF=Y{{f5%8mQ#QGJb_XF*P6+Xx{Zmt;;v7MNey_9j@G36sz&rj`a(C>yO*d-`{mpEA76uK5mn`u!z=z!bU7ByL2f6GAfF9UuyipFN3e9Ata?D4C{Sr8 z94Z%JMtJMONGJfJ5iubWk7SrAq0y(it+QWBI2y2 z9)$pvbKTyykOVJm5aNvP>fro~aIOE*cP5DMh57Whz!X*^HM8be^G~&IzHQm7{0cO) z7^q1?$rYWAC2C+8w? z%L*gWJ4a6bxS{`c^T37Fb$5a?=$x_fmeIpHr=k(w*1?k@l${wb0nYoFzJgyBA|He4 z#6K7Xx&g2z$Le}k+Bs$}479JBm^Z#V8S0D^Z*GLUt6MTdzrg>1{cr;WX2({o%&G?E1|8B}4lSL2?b@&0&9;0!u)(kw*(9zmv>NxC0#D#? zUI4)wi{@hboUM{?R&?aA*pEGLz}hQEqml42Ys9Wm4NHK>&;g~vL{b=uL*A_K;j`as z@U@<@(I@&rD-Js|2oFmtcLoi9ct4<5;+skt{As1HY#;XfhL3KJvazwzBYV}cZs9iV zUov|&&loK`Y*+u0W);Rre{YTT`ZG>+ro4b?9Ea#tdk42K!qy#`Zn(bi%W=K~KyDbl zwC?ZNH4FD0#`%Ph5;}Sq5ehxCDQ7Op>qz@j5CBQ-%gl2lFiGdG;*qkeQ>Vdz1bYM; z41^TK7Nf%Th#tu*4{*Y1rkNPtHW5YqP{K;g^>R$~v`>hpv>IVSsYi~CEsHTXV>nYl zBMdo$#2b+%E{hf|qF5!G@!Dvx6?J(KZ2M#007cQMaFz&}eOcw`B?a{{V&Fgn?!YMy zQ7v?0-k})08w+T37Q9Hy;h9PI%^lPFf+5Fg!;zMAnVC*Mfz2yUGBn8_vxrI%Q~V&+shR3UTYTAPXPo^PcckGWdK-%Zs*@99EK!j8&LRSde~6(48yS%6aMI6 zcm%W*+2xr*A0H`_Q+rEE4ao80^5*11%QW|Ki;fTPtVCW9?dj;p1*H~1X!)=pAbjKp z8W8KuJHbTjU|jgNoN5o*9a4D=@1s&o(5*kZlP2FZ@aoDQh5Hz-r6PVp9fTn0g<5Pd z;ZPWg>T}|q!!}|bypwHsXL~SSx*TAEEiyC}k3dk*gbH89^exV+<-A`RS|>GULW;81 zR2|-nK@P)EifB+-lriSd0Wpj!T7%_@N|apY3@7tKL8t)|N-%#p#OoTI+~^-ksbf`Y zwpzCT2Ghcf$u6@mx@H#1$Ru>2-wl|tc34_hBT@v;Y`XcX>a3G#+aLYRL zG$zL$XUJkp2-s%rT2I5`K*XuGHcmJefW3IOPvIxc#4aR3o#XWcxH=}ZQ?-edVoDUr z6G3OyzOA(|e6A%xt^}_mi?c@~5vxs`2KWPXlJ0@xQ1z3GB3+J^N++HvE^?5 z*|TTCZ}qioc=*c7n5wP`2r6Khfto2|pwbq?+S!hZKbqNpma7#K2`z@Knz50ods;+> z%@aGid7`2XMr0M0k^Y$9ITLXaYD59Y01!D)o*6fG(Ev&U(dN|ci3Ti+g9&QL!N!?} zm@3*u!D6J~cC_X%IJ#s=1~|W-LlZST z+TOvrH6ce@A`sMyhU%wEIs+23jJd;7Tn1b$1#1{c_^PX+wvtkm<8Sk$UJpWbK{ zsLVWRS6RN@HM#W#x@j1v0X;%coQ(gA1{DEK*2pZ2FBxipNK-O$%YqB9Ru|Cquri!3 zBiX2fiJ$3)#0SM1kN~U+i|u`A)XmICjHGMbdlFhnr7i%$8l}Lmmm`c*up#HRQ*`F5 zAdT88Uh-D7*90YlZuNY+$cfVGgE$9MjE?9$)g?mHoux*!aWs&&&}9FsLD@2|Y-DFz zSuwV*gn<*T!~9*AKzt_PTMayFf^URNB{iHPln z4tJk>5FSfcIHr81oCV&jt96`#8pxibk{pm#mXm*>1W;SNp?*;3@uE~+k88)Ju~p`i z(6zP29O5d13m3+n+()es#QVkI@@zM?>sgE_ko8JVSaFh%GBM_vE)FlR)(uOOvt$ug z<&AA7IA<8I=8B_7#h^Mt{#6^^sEp;qLI8l9KeCwoHsh0ofQx?N`qTP@IIBH|#)Zug zJGtdr*l=vR+?&{XHxaKx4yB?h-aYn)U?QHVPp{0{(1c6r+ZuE|XzD~ui&f|4hd`Y% zIFVn~AM-C|h&#M@Ikp>zHD!kJICpqtzzvLmQE0b&4jw!@bRY<-kaQWsyISol?eNeS z*jiaJnL}a9VgXzG8#*3&tclR3-qX?}P8P22S6W8Mt^U*g9X-eqMn_b1Z1HOh z=m+YuFZfyyi@4_3uQuP-Pa_iRgD@T~;IVU;N#fvpeIsha(`Ji=X=M|m%^}JQPcR2w z8_3z?516~01J<>g0s_A%44s&iTTaoQ55h~c;41u3i-+b6Hqhv5&_PYuB2dYo;@DjS z%U~8qP3;at&3PQ5K+6L$y`mbMCJtI3EoYjLy04}d(g3vLmQz;@gU+j&ALIzwzKKz~ zVVFU7oGH8MN>n($33x146@%qnu^-z?6Kz-aG7q@1wV)lo>10s97J15NqBU6eURWvh1!IGXI21gT-4;LBSM96p_NOXrd&y8FZNzegkDo9uTlVEfjT? z7N~xz!QhRTVy=#luB9dmZ2vh?mNceHs8&EzHF3JNcbtu960PJpAor>n?kS2nd(^n0 z`2&{|j~K%fAoo$^*&3*Y5TAOk=L(2l5}i2svxgotZPspx!Wz5fbOj>No#r3~grb7V z!`4YT2eCzp0d9H&6^cgE&F6S%A13YRH!M#fg{tN!x@eBZDfXmG0W5H&$>kwr*$eWL}?&gP;|`Nxx5Du&IIj<1IT zf8+MH>h24i6IKwalPb&m4jDh(-OX)JbB#1e8?fK7gllL`fMVYyH|2ZD!lgYqA19@j z7-AqMRXAcZXd)tI9wWt$+eEa{2fJ+!geV4^u6s7}&}dc5WVi4xgK`zl`+dSs1Lsl= zOTwD%Z7Z*=I9}avT_J!yqq|?+9r91&5t|Fob8lh52er1>!(gvI7R$m5QFtYwu9m{N zcFGyCn2%BQ69Ht4AmNmewPgpyY@?7yKQNdC=2FoTU%*M`fWS~SnLLRE%$JOek+Ct0 zFC?1jv87oGc3e6KABUK+Azu2GVLj1N8J{QzLfOhq?-6XkJCaVC6N$>9fqZ&APCfNT;Q#opHuzBGrmI?cKSdC^~6d zZu)dV4Rj43nxuN{U&*P(yZu{=D zGipkMRqTWpr+K8puOqa3%Azm;qk<4PNo*bC{HTEpHIeveT4ab07`HA_b^3yy#g{}U zr#KE$)CC7I&qV%#)BQC@%am}NC7TmNUyjDipQk#MHY{ibTTDbmZGJx=d{`>#RH~x% zDwASUQpCLFe%uCT0teuz6-|6)=m-kuu<$gyGeTeEoy8?0*H1~aCxVJ08M9z`*DFh{ z;lfm4zc!Hi)C2V7L0UZ zcq>ydBoa(_8Kc7S5RFwvivZIE?Inz795bSq2=w8P)d-`-ONvqqk?i?{akdvOoMcP{kt` diff --git a/testdata/pbmc_performance_tracking.png b/testdata/pbmc_performance_tracking.png index c4f934422f78bbe3a03511a013f61beca3693d31..4ad97d76eae411e53a92aef31304e34b74f6be1a 100644 GIT binary patch literal 44017 zcmeFa2V9irwlzLVl*EE!1End(3PK1w zP(V72MqpH=S?EP)q$tgiUgukTG$-xk-h0kH-~XQf{Z4+ra}r?6`#$gU?!ER}YwtJs zFB?pzPMSA~!C*}N;&a2V7z~kC21B&$!-@EfX~98t{7ci-Xq)RM=5AN_T?gzK>vy^C z-^X;_x5s9_o81AIJxpg+rIkvbD$aLsb=~ixrL64q*B2-;57;X!1ai0GLq6L7xw#92 zF>M$9Z`@`5OM4iMYdgL$T)o*Ny1m{%ddtC>0e*kXp+n=&@HwA+!ks@Lvgxkef@H(J zi@$7gPE76iq3_wF1Dn43;n}QJw+_rzuZ@2kc76SgeT%{#J>EZc(^}I9*5g8gLISno z7HTB~1gN$QA7w=aH{Rc`uiEXSC)-^$@F=q-ugmppQ-NlGo#iPza~u?7!j{dgF?w+I$W(Z*X^e-f*Ys=9hI&lRog0=zd$IY;y46!SfvKjv2SUe(-&j zZG`S5-H8jzvZLwU`PqVniV6w}Z&u)Weu zA77SHR}69KGV@|7No*>d8irqu-#GE6Z^jqW42FzxanK>w%kT1TW$dz>aFv6ZW+{w2*N@sol_}2<0`zH0+e139+^F;VSP!n z$cAX4=e!siM%@@ZRXT@E8`_(QnMlkC?-(Bemj)|FzCr+I= zOV_*a*ztuXh4-fE=RD|W^x%a_>ihX@-m=9gLRQ!2{&x#l92xhQY<-8axcf~9+I++0 z^z(A939@%Q;#|Ld;?hYqcv{se%>(`s^*dZGh7G`Q@me!>FA@= z+y=3V>*g~fbl!e`Y_95Jw%O**vuq2G1y`roGvBDB*SlF9o40CtVT7FA=umIy`87ui ze^|DuCR#->+%iyI>Nh8LxUMBlqXc{H^T@SzwX4^xS+i1I-GuEoT64X>tx_3Bb@MJq z2S>!}uXpD>SQ0DkUdJ*~+@89$M62!kwrn@2b?0oC!rj5F@ z?az7czP|02{08lg)Sw`ZrXM!h;GhRPO0h?_<@tE7JN?OmIZBq2>5YEg>&|>?ms_gA z+_NXREiqeZgKqEB){5c@(;53>TBOWg@_b^N6+;n(CaX?oe0S+h%@^2RIYY0nv8wGN z3m*TtmiOHnvEVbR_RUP`ty{NB7#aBw_aDb4$mlN7=H+ykga(RfEuA<;a{A20>w>V7 zH;euJ1;dRdR#sL%oi4Gp=aWPOO5P!$GjQtjMk6?{{8;r0=_}KEjvsp>B8DL5d#VCViw~&B~+VM z_p_q%Z#UDA6Y0m#w|MS(8ZI@bAk$qTS0gfX8SjWOesySx2*c;mJcg^vs)Z8^kFOaj zL?BnW93QD68ej;x(E82QhieaOGCnR`)QR2s|5)v6^_Sl!%mDUlU^qsAjN?#r*6EeD z&Z%FE8)XL7uvW&Y)JY`J7NGvpKuxS50h) zALnYO#6nK^S_npdvllGxTC5Bxc{G<&39dr|5YN(*CV6hXM(ke`XO#}KoS}uNF)l9j z%3PIC!lfUp&r!dAZ1wEid`+3ciw*HFG$v|^&>r~97SAhj=kM|7OpQx%p$sDPO}Yak zCI*MhaFwJZ*)2@91@x^Cf4SfWN55*!ST5_4c9(N)TueA+;MPwrmR>3HpX2o(;IRB` zxpcQb;IODt1LV*D4if70FF zFX0}i`u*lJj#IGjn%w;^s3YQfC|45pMy^_LyEsP7< z!IfsrSU}%@b-D8FX2y4tks1Ffz`dgey!k6U&tSxS8(}U|^`$Vr&2>pw6uR`G5d|k) z%{g9*z~34;$F$FI^Z7)Z7~&?AC_UY>4v4esjDcv?q~G5~c*E2~VmD|15p6MC=Z%-y zsqm+$6Ytbg55}SVA^I_PW`mfijT53y#!ait{QnN%{BI-HKmCB(@>P|VGXp114LPUl zU3mZaLf(s`at$y0m^pmoV{-a>$gS}v5wa>@-~TRy7p`5iulw;@Gkoc zsVk36m73!})*V~hZHEYdQ^ZxFhY|Cv=hYKiZho+eQ%$O*=7F!*#b~W6440AGs6Xnu z*~~04ee~=qM=lD|u!j#HW;C6$u(=a3j{nnS<@^%uuIR?*-b(9;@&pr3xrv+%d$_(U zp4phkf23NPuaw=MEMh&Ez~zESJ9D$v1zHINPJ_f3a$jFd3dfEWd-g;>Y<3l~1de&Pm*h&gm;5M1;dEV6cX6+$)C5)JpR0V3}- z*&pn!y>!{K;1~Cfa;}@Fymef$VucD&rR1u;PbbQ$diAt!OLZ_!O-+4SNoZ`#mMx}V zef51~^Q%j-&fOV@CrcEb^X{w`OG1SZAoE3B`ibC~OA4p?58TUmaYTxH<WC^8XwM@3|#dT+9@Hi2rOqT}F zmV&@(dXk$it_wB_ol{VXZJ*Is<5;_oVi@P;jDEMTHf@@jlsB~3(yiL=mg}p>8ZWqC-!I~-L!-aMz8Dca}l1MQJstk6y0LFpc)LVFpUpm@!EBc%V|5HeL0L40rz z*-OO($)7hF$A~+z|Aa=sjg@}_xEXPQs7`k(`~h_^-kkf$HQ>e@pL-!b(MeCD?TD?| zHE}#6?g@gM#UJSphQTF7_q5Oc94y8qxX__&2Gp0$%$p z+wJwGz%TMoCiyHv5Ri{7avGz8^`^{+J!WG)m-Gwd1OptpUqIR6_g2T&)>&LZAg2PK z)IO{4448JWpI%{6@a7hTPX5))u3QN|sj#)M!MjT)*Q=L;Px|24+oqz)D=AX|w+Y{Q zSQghkK(YfrXjK`L0A|XY=OyT~>)^%PcP)e6f~_eVIijUdFpCDtFAvy?zxN`6RpGrLXFu|F3)Ve%Y9!~C(~E;)KBReTJ>zfw0r9~9zZTePa+ zjjf+$`NVCE)=T z+-f=JU3gTl=X{Vy|Kt8$_m0eV1A))bT6L)5p}Bp`?4xpi9*XA4ABXGqRV`ia)jvKk zx38wi``t#=6U`0fn;*s5f2;PnX{3Ij9_W;Tp-Q%Fu6KVplAQB_TBdKCg|@?TTGg{k za;*`%ecP^EWvdBd)fYz=bzCMi(E1Gst%8hWxHp5!CN6uc;&@}Fnpz=lmr4t3upCeV zX77}zPnd+Gx}?{8CF9k_s0s@~fwG@??9kIolRgp0U#$*fQ=LC58IbSg95cKt6SKNc3ufcB$U*K1;7xKe8Twv7|sD zDQAYbI6+ODv5~}@0;fx^fzABQFm)TH!=BoWlT zxhF%FvX&-ha6>Xc2NBX?kG+`YuR(X?_zj3(2KGzJEY4`VJ4btPgWGOwH8V2?4LEKw z(U{k!x87(6A~3bKW;Y0L5s`^gmfkU>kDiT>-st;!6YIrci9+y33nPn+)~;P!=Pwv# zjSaSNmR*Yes+Esdw&s7}r9jZ6Kex-*)XGW*WTBb#{yXDXFOQoPit4>Nl+p8e?au+B zbhY4`Vv)^*?-!M)GaDTo9D*`kS_&_-$*^A~mcZviPvh%^U?=&&p{SAY^A;(?}-}Wh%-{5 z2m>5HLt$&;G4}?~C0~B|B?^hu;{Hfw>m6|q(&V~Sao^Hq$`Q>yd1cctp}OHA(A)M_ zamLQ0R1>0*3%WZy7u2_F_cR8hCdNRZU0htuzh*tU{G8Y8E8y^+2Z(ULow*^%xqjp_ zqg5KLL+BT(&BklznEnt-3Jv4}#hz`9vL?@IUJBhUr4bRR2?)7WG1;T?@-{DiI!p^R zP|Wn3x#p^&MbH+75$yn+F$Ewa^aHK_F zPE^)oXU+gOl;4^VQHa}Q-r7@&!NluP#QrQol+jfU1%$Xu!@o)(jQcM2ZVD0lV;&=e zrT*boZqHP?Rov;@vSr6SQe_~gh<6nZLM^ar5QF6f_YcyTMoY8{7h++A|G-iI zpr9a8IiFAR`feu`_>Z;t8zb!cS#*^%;u5a@o*iO*{1YpaJI*%c&C=CJB!&wfn;8L{J;* zc{LMcw_q;)V$YL{v%Tn+(prYYIrGV`&!pX|cJYVWl1%pO+2c2gTlyHt=Gps&p9wT!Tj}tZ9Na+@-X*g;b9>A{OGBFQ%Rc>dSz3$e@W8;I`V>-4^HrG<%YMtm?-l7r@-aM^4@l8 zygE9qpjDwO{FTe=NxCzTw*wGj*<)>NF0yZgh?vIw2EXABjaL^=yp2p3wBY)fb#s{v5|3GuUPAH`oNZqs9kO zqO10GW`NUHkaI#+v^v}0`LDthqd~Q6HPepb>XLIF^3GYWE(${`MU`ksH>|f0mZWFy zsXKLA&(~`m^8Us3QF9iWgdfBGT3B_l$SGS-ey-`+wj32>^4^`UE947p8%V+Sd2fiWRyT4PM-&y=h zZKbtfY_zf4=T6#O%X00I1LccJNR-@Mer^Anag4HM09DS}9cfb&TMlGWDsKmoKqXjl zr+x9+Rs8!4Bl0hNapJ9`k&%(g?nkFjLme}Y^?rKURK;&(V4ye2U&eR1FYLqytz}9% zZ+-#@E@Ac)aRCG(OG+9D10yFVrzz4J`x8<~yfI7K5hHNfwCTz27E!gt_re}z(opCJ z(ETnRlX~5*DWtBLO(fk=0yuR$*Y9BccBRPBX?|}4S%8IwM2wV=u3Wj&(8a~2r>!!n z*bDlS&E0P%NclW+Db=nGMEWpISpDvL1cCHNBa`*!KtVdK{xlsqW*%li8hF3dYAI#og-< zZUv?=wzajbgDOL^-#`b`Ukd7$HRT7&T+IF!XNV`n|KK-7N0_2`jZgKx6Q&VxsShx07 zC#$s~hSs(YbFP8>!p3n@vTsDXwSD#Y$6LFL&w`pT?^4n3%5j-8_tTH(tk|AfZVpaD zT-U3o>SYcx{csd~27*1G{FT}-Y)t&Jk~hUmfgr~ZCr{o;-(hApr&PD!($J7nZFyPQ z%?G21GWk&JY$0?F-Uf?xdX=LYbj7`a5p#9DTuBT>ym{+LyaWoUsfAFyC|}cOLX36l zyN#rIn1}P80mwky38h^kBm6p^ZM6U!SMpOCV zc?tmc=PH<8zu)+5^oLCw_PET^4DLq z->%%jZ?hI?$v5aa`l7gUcC%i!Y84+$UZGv2)tt4FN?~inG(X;55`BivvV`_EYxZbI zqsi54*LcVa$B-P9#k5-EBtO|{K;j(TawBTWc>^{+Lr-GED|dLW80zbgk{fw0DlD_| ze21M&<$woo#tdFIOEXj&9=15;&H}&0_ZRg0-`fA;r=TFp{6tMU&3qzbj`a6KWTc6$ zEpMW73uu-a4v6(O-_4E-8UqujK3-UsEh$*|0VCiiBGez5+}<15laW8#MJi$^iml7n zu7yJ0P91CjKes9F3IbUPIN{XiyEbGY3lco{X}6UNrRp_gwt@|n9$*Bi<^WAPiNIye z`W6q{Ubh3pKIxA>(JyFAV$1&cDL`~SQZ#4U;{ww+W}q#hbdC%Lu)HW4+W({2Wl3NpQEAQb5SA>H-uG2Y9l$bEu_*boX~#nd zG?^t@&IQ4?0e6)l@_SU5vUOgL!3ih*->Cd%tt@=Y`0|ObSSK>fE^de+aQPmhfDPFD z9-_RJ1rR|dDEu*U$Glju6+FUMK|zh9o$f0BV4xsNN)%U z5~k3_8_!uje?_1E2$x>M%GH#(Tox|5(HCEQ;Wr9^v|nf7dEkU-VezpcF8x#Y&N>Z# z{>(}XS|;p^Uka#dB+rDrJipvtj;yyLbmG4R1k*<^$466*Mr7hK@UF(l5r`!jg0W%V zNOx((rVW}umhr}Y^jnM6J4waS?%@y1D2)-Z0pgj!Gg&V-XuZ1dzIOO72-w8t@v+SE z?~P_P$&&}=thmTz-8o>)EtQIrua~X4a4|7askt~xLRf!zwVuBPo?wpGg^r6?t}J_4 zRFrV*mI{LYBwaCAjbA`?V>HyGkyr5vk`O>`GWGLVP(Sbv1zYppo)jV~pyk7| zuXMZhKLe@wnbd{*i#nzDgEr?7Apra)tWV3%ui^F8GL=!Q5J}U?ZFmS6!o3*f91>~m zr%8OlK#6;vFuwM@Zff3$m!&G>G=2N)B_u5OuNIOen^B{A;l5&IO~;?Wz+3;k-G?UX z48A-;;2DMXo)n-c{~QA$%~TEg1bliXZA9D7x=esaoBFApF8-rAyb@@k__W6_L3>gB zoj6TaIw|Mvmp!kaDKwYH%2B>2l+8k}`xWhVM%UY|4hM$lBn}*9ild?{oRF5L27WBs z0|{c1E-?@>Kd83eAgfHQo-cw^e7yV)z*mH502%_AN-rJoD%S&G$v%bpg35Xcv1~%T zQK+6LzG%@Rp$TS(cgL1rVqWA9uRRo?<>iHCj{X==zfjynS{$&?VqL6W?t3<AGcVeS zZv5;a895EKrG&MVQ)S4zQtA_t;~&E@!YC{GV+?)o4_L-mam1%-8~om?XdVHV1*2-U zPzjQ1f?4U0rK*#N(-XC9exZ~wfkAwW#K{OQxD&69EAfmd^7{^7b&n1M*( z07OhFNO@XOQ3!(lnUlW?j<3{{B<@R#L*2aCuV5EQfxMF1rZ z=Nx_^s_m9JUG8w)l~+}r7Hr3#ymP_VG8#ne%W796Q4o|(wkxW+u56K}IMm<8zRMxF z+22{80B<5Y4IqaDinKfO5&P{!1wJ%#eZeRx=s+MscK~2@x@WrS`=KaVQK4sgyT+e@WWFp_B!8Q#`=9ztfXs#87*;>NY;hg| zgwZa_XkL!W<7 z0m;Gs4?yz!kKYBi%opZU4lZzsJqBcvWS7-0Hx1`_glS**ykc997R8m15?IQ?>%j)e7>OST^GRM*7(> zlXEC^+1c5_qCY3WI4p!p@QzX9?5oDXO%YJC7eqYy%qim@lh*tcMg2TmPI%a*SU)Y~ zp~_l6@VG3L7{>UNx&uWkR1kncM@!hW#JHC*Q&3OmlL$|I2Xtb1s@6pB|LG$>7@>kg zqOutx*5u@?wRl(Ux*8Mu5MOAV4~|U+!DPh>(%wK|xLLZE8?`yw*0S>|DBxixYk1y=nv(Toy?Oz0O5mnD-jZ%z#iCAzdGqE`Q9sn% zR=GPDwl%WF!ORAgIuzBb_6EJdm*hCJDUUZ|RhZis)ZBKoef#pkUPm|F#jKf8aH~%wgJpocq;kK_&X}iKzm^G>dqmXh?QcwmZABZ{NO+R*Z9k ztBHxuU6Ig8@2E|0?TAAGNY*vfM{Ee0aXuMx1 zls_;K@$K6WKUmJv?!jbR+?eBJT6F(irj4cwC}oT^?oeWPyg=4j96Gq-FCLNq#3 zpTLFyel-{e(Uh)_{uA55w@oU$e)@J>#{OM(VBqOOQj?8e6kbw5C48uaayTipRP>`7 z4+hroJj&L?LZ>Mckp1torc}3+6AmJ@9Qr|6WvfLCpx)2L{m?Gv?~8BRXZ;%o!tsBm zMQf+%ZyBkNgid)772o^`;q(y;4OJ*lAh-RdXYUEM>>*qKMn!^E{(Z8p{(adN^f7hp z0S)}Dk#^R9N!=6=GtQfC*|GikgU^Gb^07VI8NV;v>~#q*;K0esyzhtKug1@AuZgi% zlNfj0c)Bob?fD-xdi8o<1W#rUNOJS!ADZNFfMncT4Tt|HqVO*N*DBC|g~mj3(79b# zECM}r<;s;iC$LWsrzU<>v1jFlOx8hl_T4x1Gf2qEx)a5Z7mc`l z5sCYEhBABP01V4Z4rE%cwkHn~xNxdWh~sgcQ?)(ZT1$)biOd;ZWVqswJoTbvvSZnT z+=_^o@ABJlNVU~!9k?vgH4e)rgu%M>jo`pHPE7+pCb&#_a$M8z)%~wD{bDpXhWanY zR{90qUD`>)5qu=!C`V>_&8ph_tFL;*FS_`iNxDOb^-of7kJwf4W~93L4)u_nHbBC# z$Iz=wwfnk38FFAxwneoN8sk>841T7K`6!{@Hu{4rioj5SfSzz373zKc8E`!q;)0-wjNF zA)M@Rr*%9JT!)%|V)#ZtHAu5E`Dl)xJ&H>8t&Ep#FQFoo!-f^I1tq@k0Arxb)m<`Xl?tyo(~0 zBgpZM^JOnxu_Ek{h^WvJjb6T}x|UPY_O)8w7bc|L1Y79pQkf+fh!9k@=k2+cAjfVa+nC~G^eacs--n0-Dw)5TtP});%%x(r4!(9(;{rFuLk+9zy}NRW&+rb~aHnWE@Y?FA54m zwNBR$7Rn_sfTi4ZO6#@1JLLA1pS_4vbOh|I?&1y6l61!q=^&;z@SOOX9F+Uw;(VA` zI7I6=jx?*=Hsp8;1?@*?RCzs5Ha5QWOMj_RTXANgyk381snPoN#cKNM7KQw5zHKYn zE1--l+Mqw$b6Vfuug<5tn2Z!0iM%(5i%W8^@Z4iaDkoi&Y=mmr`m_!BwgbbB0>5=w zLnZdeTY9HY?=|Z%Kr#+p1H3cS*5jvdKjJ6IjV{d_EM^LY0_qz;Gp$d`@Q*jb{YH#) zq*~+#@0)M|yF$ScXpq`wJ@hy-{;~saPeomwH0=r8O^an=We|GUVOoiRCrFXK-g{K6 z&pk*+F=3MjoL0#}_ephx4Avf|-f$nSndj67@kWaphZ9quliu1NMsQ@d*H;5xVZgOzr`FBYjA)k;-H z)PYzZmgoyc)EudO0fyIHqv850l@Z{~-H0(o)O%|*ysPM7KF=KtU^NuJETdtI7SM+G z(cX{@Hl?{T4~2(4%7tnOsVRz%g2ub%&0W)p>Wj(GD$1hogsg5ou`^m&75bCY z)_KdYYi-^eO;SBOA$dru?tZj8HXDH=>tI{oxpT4M9R4t!RtS6#`7-Wx;^wCc5YmP1 zA`!mrwq1MJ;^O4?pk2&DiIvmhTYk!RfC;CG3@j-7Qea$~M{yI*P`9Z5VWDLb^qkP5 z5hyw>9Co6D7Jb1WdR_;;&qjv3kK_@b21(Nhi{SHIL@o&ZDg~w{GPC`mv#VuxVPkRN zl8i?^F?joyEr)Dlk7D)pR$z~WVJmUKVj*C_PJzCSLo#jABN%_V;${J<1vZTB_$&QUB&K*eiA5ITrmyNGI z6+0oS@*Jltjhu{#Avd)Aq~^`z!dftdt)nH&VOjv7hoiDo*}Hcy*)y@j3FdZbUbTij zWPt4HmDc{gNcp)fnrPS9Z$U+)+-R!_d43E}+3~R=ntnYAa#Rr|oIk${D~A&*AT}7N z!UgePKN#A)o~-A~;{%cYgOU9@E?XqQ zxv9N{~f1`tWav4YQ%($XQlN|pU$F) zBJ_q1Hbu5n!sB*l#1DR(2HvQn1VUfna~R z>i0)6^X5{tCqyAMs#1^^G~l`(XG=fkmuqVJRc?jZini-yrHuLLM}Wbl6+R7VR=zk4 z16xxE1s_@P;3o@5zrYI0D#rQQ?)S({hI&5PBP=lDCe-U2K2D9B=zhATefCfBlw&PkHY3U3XzUj4M{7 zzdl75lVLtx>5*q=+QQqgbV=^&0|!e}oEtlOwNJ|w&Fv9`yJO&SWZoLUHc?z)GEKUG1ddK2Y7Ij)-{j1Z3%x-+}4l_=OafJ z+=R4xz3ZkC9@J)Utw22>Ll5vxT%hY>;Sd9T1&c(WL+Zq=NAS*7Sc2ZR)B1B@?f9;- zE9*8j8rEgH)YeTMBhZH$!>2vHvTLW?&GGfo;r*@f7(PN_lLDoF$u;a){~MN>pR$X| zE4L5MiE4ak%qSeiCB|X%PKIGzgt$b=O&5zcXxC3SECP3Inwyj~9?7xozJ5~+spR(nenVtD5JF;J;!Ikzk zN7`jwA2(Dv&2y~S6RVI+Ruw5d9}hP;?#WrYO%2|ek^Zf4KsM4S32pevh<{V`Mn|Js zW+NPW_Vlv8je?$y)zmgIqSw$?`b}@gWmI8m{yF>ZuUD`Cp%*t;HcFHfy0x`&TPM@x z5dW5^Xz1KWIUSiP89C#&=NQnmJ)wG5+6`4AUaFz(of@rWk6Ngq!*xWjqQ3gz+SsUK zml5X?$*j(-wq)EJc7oAHL5wcCU#iLbgEkYfA~F4uH|skA_Zutf3Py8TQV8eOg^CpW(tTj&r0TnH5l&2nZ3TOlmyCF>6Q$|0 zy8>SIeKfPesixcgCVNf0#`xU8kf5o4;2aMQI+@+relq4@g?TlsS>HnhRM3X0qxOS0 zuz;#(MCkU{r4+l2qHWOCaFcYXpIi15cd49tp^`&O-A0ggM4!JSl?`6aaK-oq){;#us;-M%Bh{X10DwboF9G0d_uZ$gP215N%$yt8Ui)c! z13SmO(VHo!HZ)JIKQd#5W=Wb|b3(Y*-jwcr4_s0_!yDJjts#~-g$&RND^?VP?@K1F z&6{5!p`O{eLetM;W@}fNtp|_u2ERWebKw30bA)j-GqY2)IW2n19V`w^VZ*##ox$QI zQ|6?=+()%0l7FRIHnZk+E2m2fv|}~suH&>cQmgiE?xXaYGHjLO!RjlI@LNgWj!7uV zWEQmUN|;dF_HL0g6t}L9Wk(4bt>}?t+%ZFAWm!Qz{4Ma= zaFMW=qG^JR2=D9v05NBfx~zxGF6CoN$t+Z>d}?`e$`hcLUn!>Dev`r_BBVaKwx}jR z69X0K*lH$*)IL2U(^5%qxVqFBbFS8|CBgQ6-A=_6wPL%qI*J4&8peqjh`QgMAd!!P zLQ2>SMouRo`ADUgV3Z1?O8kLbH(Yqy$pzZ7Fb6(EYU?#N%%>1fR${OUOXTJEIy&-} z=no3ry;OZ7`t2YycQEQ%_oHlM2zCb$Jr2u`XH=Z`dJOOV`#GAQ0I5CdZQ2zQN-35YE9r#|2PE!d3gdIuq8W=Kn;#S5N(nhMikT| zdm!C;?)gO`0ZKm#CBw9OWEm+^{3-WW(v3@A(6|16=%5jHNRShrdc05~L6FVL$|8%L zT1F!Q(uXG%c;p&Q$%98&qo-_5?TeEP1}H+UTeB6+@?nX$ZLhk;!t@^F#ysBy$g@0PhyXGDPr_Z zxYp~-+ivb$Ei_f*VjCl+B7p~cJHq;eK}aaFthLF;haP@1ccJa#shHO)M%iteFLj4# zd{QBVOhdg}?FwQYzF(^p9FO8&M0@}9JCqL5D1ci{*-wRBeL&Qewe7YrbR9#d2Ya-G zDePkaBSffzOCCdV@L-pfHWrgLRTx% zN%V#(a(X)Q^5ohjI4&$1&j_}eb&M1+>G(++#~^L+Fa+aL%o z?UDS}pz8p=TfA#5;^y`1*Y7;RM;v~P;tsDKG>&_N8IUQR$$hYPlNHOO&GECGa=hdp zo_hC>w7mbr?}_>5w|Wrn*SiNXS;TeypH6)V_=YtR_B)tCelu$jPLRhRXld8|e%7Gy z&|+kq|1iT*IHsyZZ0ny1LRi8{ob}wLL2y3v?l17Q#mGMN53P;H1+qG4aB1iJ83uQ( z|E~^x8P&~bKI>>x7Pq<_ppb^F=zv_4s&_-PE&q0s?+W7Kse?%xEvPC0?_tjVlp$aU z2f9cv9zsbiLoz$XeW9M4zeG=*I$w4uLn;XvFWy?~@UxZcU zS5n=%&P}KsgKkfX##U?JgNB9xpN7b5WQn5Y{~PI})J#R}HBG2t_XThC zkp~UWv)3Os_v;|TJ<%)tM!-R;8OcC2AI zH9%Ii*Zs!))VISA9y9~dix`|XWk_usn%ThDFQneDk?jzDXdvM3(sQ|YIn>MrJ7V?j z8xTQgqQPx*DQLLFsXO)MmJs`n&Uera)S#<^+`3+m37QN8>foSWSeE{Wv49w+mvxsz ztxtKqH<$&mhs}h&fEosX*UjJ?gAWAMkW^bWA`$ zhhU49RqpJhS-7S$MsZ#98wX3=Z5n<1!-S2(7_&!Qv#^a0Szn;=YfD~lNh(`{29aRl zMk*0|(rWV{U{(2jFr;?*^5q~dm)qNUE)P9Zt&MEKM7bv@KZKS>U{v8WANb;JK;(p= zi(Ns!A=gLPmr7TMCPcKNov#ktfKOB|$jv!$Ezn#+T4VSDr7T8r$f<`?_vdjr%s`x- zBr3>9XICk(D?k>d>@E%gs&jgKi<;}mor$_=CdgoA9<}`j1^u~Ak0#fUArbb$TAi-< zd_BE2nFa)+1YSk3S_3ziEyhp$PQu4GzHHn$M%^B3m2+nul|Jw}HHoso ztC;{^`v3`JCea_Pdqqi+V17|Q$%j6+W?%R20Y!S8=!`Rd}iU)J8M?hil1UA3Ko0#0G^8Nj3vr!15h~k8!F?8L@#4 z1q0XDARbclfpFHq|G;pRe>hW+8|NP##&HI(0YIXK>J^5G4xIeCVv#bVnYE}OY%mF^|}DfLyWQY>CQIQsIm!|P=^N4`As zZOCbz50-~WiakGFGQG6q`tZ?6tC^*NkH(504Uc+tRJPqj59DaYfMe|7qwU@u|F-}A zN+gG!;}^yJU*(4$-TfF+vYm1=KT?vNd8hmN-{gI8SYLsv(Kw7)?@usv3Oz)TvX;(LbN@=BLR#(B<`e zM@c}(2yzNtkCdg*u+ndlUUf zhG>39N2U56DP+~6OO#c;X6~y=UH0By_E1@2`Em;B1sLm*K6o}vO5GS-P67%@JL*w& zav2>O8p=S^mMwq|HMAO+*25uH4zY-&SsV1Q-2!RX5q^+Y7>1g+lAfSp;MKRRhp{~# zq%r9H2>gB3_6DS&Z8;u%HES9vHUQC1g1mf`L!cSk0{XxT)##8*eZn9aZ0;SIT8@54 zYA5GH8!pxNFPv*{NNh5SYd&~RbR6-+gy|E%j2gZHW}U{dczfjIlD0dI&plIz{$&>V zuR&bT0}n&1BD;V8=L(j;v(37~887>PkN zXcx|cs=aLL#)VAUBCtYzkLgD>YfS*(3^rxv=YEvs`f3I>HDmUQanaTr+h>DCXl!=O za_g8!#2Zb9Avy!Az(V`f0%&45U!+*VYh)-i-Lhpi34+kgSlPC7k$5qD0a9SCPadSh z!R()yo;bDdWDhlb0KP#u01qUjpE=q?A7O6uwbD>Q0!Vj4p*gr>Eb3}Qq3@RAhga;Y z%V1@fvazqk#i`k%4fi&~-~c>|hP3U;nobHM$R=0XLAL;GX;cNgbJV$xafQZUzYGm= zt(K6Ze$A07!9=vsJUi@J)`LZnFVi()q@y{$F?F_QEV7~G(qOj!UX%*2CvXPvJ zx2Ss{R5?!)h6NTGN6DAbELebpdUHs;b^S{6T;L|=hA1Qkk#_-#i48mo&)y2|)pYS{h1m-nB##fD^w zS|-ua6y^iUFy#2nZgXzP(Io#7b?}p`3|t+J3lFQvL}wI_T52&5jD~ZP#hNHSDh}3YBnGsNC z(?lASXl_YzRL6O5723iB9fAoGAY+6=?*$7@rfbMt!XZxNFnKmal?|vJ9h}K&Yc=P( z42&KPC89ce_!V?M;b<}>ZgsGk2`C$>gEk)pZZ&$Q5Ur`HmZp#nRB`mup0FyR%Hkgs zfySPmgPpQ!urq(@5ZI#;*ziG=no|g&fXk){Z;NPvDa|UuTb=TDQ-a*Sy~Y7!(#>^x zpKhwPWTU7g2N8{&KPIVy7FkNmQR+CU%2_*{H47MqVMSJ@a2Ju<+NeE<$ibgbu@tCQ^zaug&A4@7L zE>07nkbYX9UU_0RYz4Jdtv{Q^E3C?3*^V_LYG!+9V3Aj%A1vwtv=K>IgZ7h006vl# zRHl+`EF@%}V2Py0{+*ZwF_h_a3wr_r3MT!T3E z)sae87;x`#E&Ec^_S-bnKCigawWDSg4e+AX$brB}Cx@)Kh6LzxFKR9(lQe#j0P&J~ zpJA4=H8gbXYS6`~{aNTb>s0D;2Ou%Eu!!=fl6Jk$UYtPR;=i3RRRx~>j%7fNG>aF7 zu|$8Pzdz99?xSt$D_6c$HkH$I70%`g>&wRTT*#i|)?W+9)JSET)4NO@yP6pfG{B*G zqHt%?a5gPxc*f`yXfUC;xG)1@1_~WBE-$=hFb)PSSaT#F%>vx3*Ahc8XdvU|_iNwQ zMq{1>S;EV+-MgqLM}etJ27TcyD{*o3Baoew2FN71w3HC4mDu623;V_jC6gtVjZyg$_0T7@z@To@4K!F}j-wH%Y1Ot9qSDYfIzn zaDOS?xsTU8XKwe6YsB>+fMht_*OBh!O#W4-4^N5(TeHN@ukork>NoVtB=E2dG90jIu1vI65bC}F5-qBvAo|`CgUThzo+k=rTRG_5Sx5OgYl6a{a{-MKz ztB#c|JRSM?1)&-HhQ`}J#)KhT91;hT8EA9Q>)UVdz1Bh^9ua#85wmxGZLqdydvT3V zG}AQJ?$-6)R=XyCz%aO0{#uzu$}bNNK|7*Ch0~IOwBbM_T@)^E6BJbB1X}TC>7i5c z){&!lc1xH%J>?+JDh)#f0N%sRT+|YDSavbq<79bFFlDF(Mq0Y!G@Y#R zwQ37|h@^57wI~=$5-czKFew{if@d~=qLHqZ?w&t*?nX`svjCzrGd0F`4ej2 z8i+FU4<4p5(MTh;zIkv85n|shO#@l>-FPPIMfxI6sk*ZpY<4g>wUxXe{B5TrHU??A z90Vd;*pMxB)!{1{sHx1G1Abfi=WRc_o{L*zI!z#=nqh+uKc7a1VruFD%@`39(_}&- zF9qo2$+}N>zc8Nu=I-T0E4id+*Tej*`nr8v83v&k7}FqV8V!rm zgr4d_KeFIWFv)i7n56SlGtd9qn=Kc0vvn@6i7d_BcuX>+a`|PGH=$zyOIF z!?^*?{~ z!_?`cS?v-=nN_c+cr_|@OjcjYU~E5Z=09=5}eYlpASY&SBXdDczbg2X=0*OpLHw)fUf;?8CzX9FAjg5U{qQTmmZM z(YS1s{|+$Pg3MS5FVmLR^RvGdhy#-Ryvxut_i~8^97~`j1|Lx?_Jch$)q}}wlYj;? zAsC~X+|>AH+(s6JW%*?RbFO0LbIelIh7MMj(z7dk=5HTe)M;d-&Hj8oMy~n#`l=qg z_{Oquyti{rN|Eiup270(Xa>&JLa`A3Jue9_OlHY8lDcr|nKico1HGP@SOmN5EZtI> zSjzFtAGS_+tL~XVLGz}F2qUflp<3+CYA?EgU3j9!@2+6%Y6KcKySRyR?EM8tY4GD& zPeX&X6-h;Y7+q<69FKi6`qlN4YlU1ssusxxE(O|6)XXa?YT+_tA{}bc zMdhF&;bgfyTq5-l5ysAl+e1xhOm zp)QO#qsJ3p?di2IbHCs(7!!_HA(#AT(H9${zqOq^45%jfV7oUj^L5s>RZX#a? znd5}f4^fe(+!gD*i#%%XCoL#nOs5Gov3 z3+Yn~-#?2d6dY9{4Th%%|MN$Q#<+nyl^A#-4n@fze8do0Kgk40cRhmFH!o#-!#8#o%<$A5x8%;@s zp{PTZO(Yz(Qo|ltsn#zXO-g4+-wzX%asIG<*->^7=^15j z_x$~3X8lHxz^IcjO{)AYH60UANjEJXs~~xoXOQK*XFITzP)z~ibmh4 zq*u7UGy{&vP7jRZv;{;Z(wXE{v$hRrG@|YTq2mrXzwX60iVLuVfs|E?jYYWz3ZPjI zv&{<=rR8ZOu0v@HuO)>L8lq@jQC22wKtTQ7{^mBk;bb288N@}drCzF@wt66>E?acZz^gjFVt#h(IDOA;dx6a+|2 z^axEhfk|~HP39B!D-!9BX>HQP+e2SZ9`yeZ$KR^7hc@# z^T17sGU`i1#{7SjXp&Eq(OwFaGfDdse6x-_OSEb|>e=w)M_t2yL9GGPzBLea_~v2A zr@O=$cSL{nD760_1O(RQ-Lw44KKPqt0K;L=pO!lYlj)Hr&bYp@^!%|SirnN^lkxnq zpRd>7DB;nW?zV=lG;Cy=$WO*dE_SSHk?ApArEXskNmVnwR10oy`O$8C8FJnlGEu^JdOMiMi zO083R0l9)g=d1{!1|nfkt2%RsUks$g0vh>?MMt3Kt2S_chdMM7 zJmY4UVPfmV+>eN61@#yPy|^io=A(e+ruitfKE;p)AkC+i!#Kxegyn~+3dhhIEpz=7o>8Fd@ZZ>%O%ma2beHMkcn$K6>otPU&^(pDx{SLq3tRvEZuJ1G~D2s}N-3yIHInU~!{Fk&{_OmP^$xUQEKRyQt zp#hITcM+&vS&|5-VKlN|8{8HyO0j+el1bg)v{9Z_;cKKi+_BqfGJ8j7 zI%H(<#tpyH=&%0s=3m<2*>d=fJ<(ub&ihyPY((JVaNEyOWZ>X!PTaPgDMn^+K zdXR5e-$AmWqty!og2>fA3mX-UC^i6{Dr7ytlMQaZH(`|i6EQ@9+GTJWI=QKf!KO-h z;ZeSV^o=wdZDrD)Ql*GxPg+dY2%m!i+NN+?n-vOOgD6C2M(P5D^=_7|I2aB~HQz(3 zuiibm)#<+DD#vbCo{=v)j?W%EJQt6)U4o}MPJLBr$6oqy)ebyxN=Qnm&S%Wu7$;&N z_0^vTXFQUO;b4pJm039L)x4s;74*&mJSz4xdgEqu)5VX*%~$!=Y_x#gUxA1?w_`i6 zZAJBB;bW*)2L8#3ydQSimkc-|eBkzdd8MelJ7-+y{h#*EJSysX{o~`+($w%;X*VG- zyqc*<$dW=VCTeB4TuTBM+}JMQhRz_{SRHc=5iJ7+6_m0}M1hedlyO6iVbxqlmQhg_ z89*ReoMGm^-(T!z`s<$S`JMAS=XXy1(J5t_@Av!pexB#^Jn#4GLGVYLPWAYOy!V3e z=N?alnI4ek(YTN1?U;J`+GI=~S8!lJXZy7g;de$x3xEz6YZmjiy!}nUxI-QZM(`IouV;qV&V+%KkoEF2CvSH{xq0)Ud!~U2;c?>wqmzqj zy5kmN=_NhC9@R~K+?hv~-t~U?;r;Q^gWi4OP3t8eTqPB*^ZK@b7n7R}u^(f)&TlKw zrGYbN0O4|VC(#QzdYB`{1=yZ!U34NzVi<@nE#8N^4^}~*mp5sc7vUd?r7C& zzmBafnsmw1kJW?nZ!9t!^UF5T2HFK{vZEYC-~5ET zisjS7;$Hn=dZ?YJ`1s#voQ}}>hrPtvl^P7TG(SEcwMi-y(;v``9yo&c;GVdJv zm!xByp)9w0{GhaZ=rZMy;Zn2uR8cR_7xC^VJ^#a_@60~iRbNdJ3$#wpf$kehzs&jR zHDT4E8#30#Z*#@%ZCqy}zc~xcKbUcQ)Fw@TMupO)*{(Zd3*3xULum9WHRt~p{`S9` zx)+vgpEBbHzJ3c>VM$Y0ZGQ9cWcJN`a~EKhxJ2D}VF^An9{+}+XGWfO2^jV8mkgA1 z)b`UH+Ml}2*jBFA+c}{r0!^VKRH6B-311c$J83m&-$k3k;@sLd!VmAejWse9bfBV` zFA-SCb{!8H%u^xQtg3my-Y6LX9Nxo`sT7zBq^9HR+gcl_{-bCCGkKIo9TAx4GaYY} zo`qdqZ%0T-MDbq#Yc5OlFVTB7tcJFpk-$lvCnUcpqapYA#pVP#=+#MgEflO!bVK4KWc>L_tRcN-eAav~upftv5O8MT*(yRmhbzTGF(I_FoY z6lF7*aJCe#Y)*f4om1A-{dyG&(hLwl+3``V|c)hwvaATgll%ZhwLkBq$&bvxybT z{{Tcx2Vuc9i0{Mc>yQBW9VDTILL0cZ$81H*kE|jdE`{rMJD5SDD}rNY+As5`qRobD7^xbt#5+#<4GA$8M;G6VCXPkDVmyEN4E8})Ge?a^4gHkpNR{1bHQ55yGj%9sL* z!aN>U!F~)Tx`2_nrJo}idOVNcpT0lk%%8@P-;=6N^VR z1ZC_`rlXzu&0?T(kV?&|Tk_YzIfaQcuJ2%t1B#$z6oCLE=x-m3`USt9LN*-Q7nP=+ zY?>hTuP{F;z5bJxJ8L$!W-G`=>mW;Ecn~&PxY&jr&S2#qE;cD>U4XE2w=@!%TI%Db zfzG=h_%4e5$-0Bt!GBZvVJO;2G9YPVG#n2YAL@5#9p{;&Di8%#6pfn3E3%h-S6zv+ zAiED762Q?&^y-z@gt~Qk96eSOugIO?m08Q#1pFoz8qxpT3)rkK7!$v|gvK9mh|{3) zM48J0Q)iCAgVAV|l{2<2<=`@XfqR~?{Ua<80u(P_DUR;St)8?N$|wQp2t*7=_X)%H z!0fHMnJKZ88mc%km69m*N*Y%=W|o*#wV32V<9mxJeAL|7`qlxfRbC$=@iy}H7z$a@ zLKC1lC?}#L0P`$$=VxZQEwhNwuMotnoc4xFi5JT;AfhbmesJHRq6wvz>bZ#zK9sLi zJF#9WOuU8cXi@UI_H$uJ)vv|JxvbnrEiT(}7y&d$U^TP+`ps7}iAVfn*{+>IM_CCb z(#xQ|9n0G1+0N)q5shk-KRi+F>=nq%b*f(4` z90jP-d19RC)~GL;U{0$ii>MR|a3WkngAJ&NSK50-H$QeJ=-uTWAX+!+#UF3qM@xw#Wc;_Yi>GE%*Wl^oTauyC1vh195JJy z`?1Anxd~um)b50l1ay~PTHWlYU%?8p@Up;L=#+M;F)gCzUVH65Sa65Ymcp3Mi)Qn4 zDJq&oDmJgJa7Z}AQG(Tks|cS8_lQ8rTTowB)ru!<+4Lb6O|Pc2xE(^d>@s^)087XWtPDaQeL0>-3EfRK zaVH?N@j$FkN3L939#P3vkb){_x$_0-D)j4pc!84anUJidg9#TIm$l2=!w%|_K%`Lf zEmjtke7Z0rtEO39{&iP+J`}Bc+)(#7G(+2zg3R9ov@x+)8_6ytCybv*(5kBl+&YLqQZASU> z+QOTPSFD!0V!&&};j(lb9(=)RDjXjq2@4K^z)yvf##a_-vBzbeNe$TCCc$7v6~qb> z|FHSGyY7kt^kUOtf2oP9goxAwiDV}F=Hry@`mj~8U9aw+1kL&TfjKFMP?m?O#p_wj zkF2OWvfyEv-GN@|GmU{NNDHJlwdWN(qS2AxR2~8h57oiZi`;RXhd)4lIO4klZ#WMS z7gfb8-1ww-Vt8_L1Ox~y@{50LhCq_LVY{C}{xU4E0^BL;EZnM^K<6|8TReuPa>5C*1x8y&wnVj1L>hB$ zhB86Hk+QV6Q!T-mkqp%$sq*Jw7(R9;2+zO)n#`9Vj8|G3L#u#uNItMoBbGMj^}Q61 zDQ%_b#B&H7=UWqlf*I>jOC^IUeyF5wUBeX%s9ST28aaxF#MOylW3?&qXR5mB#Y#Iw z^i1ufT^8l)D-D@h&4?=_g%Pd5uF1Q5TO2*08+R?|#3X3~HGep#NCNa%e*XEa?bQVt z=d}m!SV@f?sK+CmjR1KpGOE@g{b`^012(Y6iJ)BxZxrsbqv`9?Wkzq=u~bb49~&-+ zd9e6J@yfXge1Gtuf2-IF#z(3agccI}Il`<_Zm>YkYD{BtEU=(DDD##H`94NC9;XyM z98|??>$;z6coPD87o2%|lEqgl`Z?Ghcrh=A(vm(Zj z=S56^tCIV8ZB`fvOPY4E|0{*+bCl-@8y2HHb!s?8EJbh+)0sxn%tvVn6bKc`jYn;R zv(rd^6#z}=o!Zmb@ZhnD$}*Yk)kvohUz~DS`R_p+k;hDUufRoww({EDXMHt4#!i%? zp9DE6sfLv8w``9I|9h%J|3HYUoV+NL@dT=X7TNsNPLS9jp zqC3b04VbPw*tTNa672G^_RH%mW%SD2J?GEF_+T(QufxWCj-%`AdA%$pz7OaT3iN&-HZ9)s>fwG^Hg7VtW{T&8Ikr7fMxb`x!w*+5BUJy8ClUfF@%#_#m3 z`p=GKBtDZ1dUkU$vRd1CU*7qLZN20O*h_fqH*U;@0FdM`a-X&7NMJc~~;y6YwnO7NdY%jA_%SZ1_BNsm8$G%Cnfs@fferK-yUl^Yy~37i(b?i$DfrI)CA$76|k2)V_oLw5_}{ zJrH#X4&0n3`AmwN!f~Z$+OP)4oj&uD5-z1}$^-bp7kywAIdC7jyVsiG!zzyigJZTF zP|{*ktXK^ZhoFmWk4D5W=)j)LKt}3A>1%QjAs&iiNMYlTA>GtIxT@HTVw|*KMb4er z6kKrvBvMA_C5To&5dRmDbmn6T;GrG*f=mEZ2p1X1HCQ82VN}TufsV*5VVYLG3p=GZ zB8>8LqgUhi0CB5AAugT1vP3l!!N@&G@-zWnT2FMQk85DDuDU6H85GDO7}K

G!~l zvAQcrQ(yAwVcV;^qVzo_aX~q_qZvrvz43R`GvNf+&@4>DsUrBF(An8Rkr0R~lL`s@ zMLz>>ca>4riH!AEezpRURw;Z0%ZU0JDqvE+RG*7=$Zfitr<&9z(FWI{$Wy|1Nz>Q4 zb8_a|`imNPa|#F@(=b=NDVBKa^^TI&YHK0y!_g|8Zr3mf0n!m1mot5`mo)7L{v!aH zd~wYx$fyO9o-rIH?f9U+@U<=AN7Rs-c~h+NoRO#i29A01JWK$=wh*D>amo#YvxwhY z1W#Y%iVj?bl5KVkQv3qu<$>6hJs=Cucw_E?+gDWy&8H$a(MG@V3t5m89WFY1F#k&Q z_q`0Z+R{x9S%f!mCO7J(hS`@2@(!U4aT}eUJY5Hsy-wh==y-7Nm7aTo}e7y zeA7|0@`Z6s#gtDVEjoAL!UH@0CT^cmky@B>U`rPua+UQVVsEu(H_u_efW+_Y0QyJ< z_TCiGoV1CCHmMIh28ojF%7wcW(pgE(uLOr^d(t-?;qZ0oDR?uCL5?0DVS7Eb@Fqgy zavbA}?AO+9V{YMq@See}@VoK@X|YbytnYvLp}+|HR0>iZ751WZ#!`pMCV-{W8ED3i z9jk;&^GmWa%jbDnWM@@<)@@W4zQ&^_l!e66HcwOF5>#(~8_8Scc?wj^3+4$*!7SH%N1*0p=nM_wG6S z5Q~j{H%2DlhDlT;VnqZI;|3 z=a|es3T-BG=nDpY7e#Inl@7fPM^Jyqexf9QJ$~;w{17u7*4%ZdFhZ(ANc(0?*M5_c znkCiD&?4&BsYXT^b*0aomUf;{X~Kega;~c@guPaH^-L&N1SDZ_*HvEP7CiiXoaZi? zK&Bp4;Iz>c1~EYZptnuQZ|dFGsL&7wdG6}VAGzl<$s??GKO!qU^O%PUp?jxY zmKHhKS#W!9aRtl6(TiZ3vfR?-Ini+3#3A!(B84Z94GFx)5*~E<-8`G(*9CQ~gP+%H zg!wI^i(y7W9s76Z;|#`OE(&B19F+slh|J(&Qj%d<6y4+x+O z&TcrXjmtKWUm%ka+HA?UhV>(AO(sI{lu+*{N(y2b@Y8ju_wryX6cgwq7V1N!_RJ~M zc6`!^oQWd=DWsw@8<6 zfTfe+ggHSEpQpBU41;!R0s%!sgjL4so z)c>wF|EFO0Y5JdkuBty*)ua0E-`37aL+{2-pX_R!wJQW$ljyyvGhI{PS^Vk00BRWj ADF6Tf literal 44377 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 Date: Tue, 8 Jun 2021 12:37:37 -0700 Subject: [PATCH 15/15] black reformatting --- solo/solo.py | 428 +++++++++++++++++++++++++++++++-------------------- 1 file changed, 262 insertions(+), 166 deletions(-) diff --git a/solo/solo.py b/solo/solo.py index 773e769..c39678f 100755 --- a/solo/solo.py +++ b/solo/solo.py @@ -19,11 +19,11 @@ from .utils import knn_smooth_pred_class -''' +""" solo.py Simulate doublets, train a VAE, and then a classifier on top. -''' +""" ############################################################################### @@ -32,56 +32,87 @@ def main(): - usage = 'solo' + usage = "solo" parser = ArgumentParser(usage, formatter_class=ArgumentDefaultsHelpFormatter) - parser.add_argument(dest='model_json_file', - help='json file to pass VAE parameters') - parser.add_argument(dest='data_path', - help='path to h5ad, loom, or 10x mtx dir cell by genes counts') - parser.add_argument('--set-reproducible-seed', dest='reproducible_seed', - default=None, type=int, - help='Reproducible seed, give an int to set seed') - parser.add_argument('-d', dest='doublet_depth', - default=2., type=float, - help='Depth multiplier for a doublet relative to the \ - average of its constituents') - parser.add_argument('-g', dest='gpu', - default=True, action='store_true', - help='Run on GPU') - parser.add_argument('-a', dest='anndata_output', - default=False, action='store_true', - help='output modified anndata object with solo scores \ - Only works for anndata') - parser.add_argument('-o', dest='out_dir', - default='solo_out') - parser.add_argument('-r', dest='doublet_ratio', - default=2, type=int, - help='Ratio of doublets to true \ - cells') - parser.add_argument('-s', dest='seed', - default=None, help='Path to previous solo output \ + parser.add_argument(dest="model_json_file", help="json file to pass VAE parameters") + parser.add_argument( + dest="data_path", help="path to h5ad, loom, or 10x mtx dir cell by genes counts" + ) + parser.add_argument( + "--set-reproducible-seed", + dest="reproducible_seed", + default=None, + type=int, + help="Reproducible seed, give an int to set seed", + ) + parser.add_argument( + "-d", + dest="doublet_depth", + default=2.0, + type=float, + help="Depth multiplier for a doublet relative to the \ + average of its constituents", + ) + parser.add_argument( + "-g", dest="gpu", default=True, action="store_true", help="Run on GPU" + ) + parser.add_argument( + "-a", + dest="anndata_output", + default=False, + action="store_true", + help="output modified anndata object with solo scores \ + Only works for anndata", + ) + parser.add_argument("-o", dest="out_dir", default="solo_out") + parser.add_argument( + "-r", + dest="doublet_ratio", + default=2, + type=int, + help="Ratio of doublets to true \ + cells", + ) + parser.add_argument( + "-s", + dest="seed", + default=None, + help="Path to previous solo output \ directory. Seed VAE models with previously \ trained solo model. Directory structure is assumed to \ be the same as solo output directory structure. \ should at least have a vae.pt a pickled object of \ vae weights and a latent.npy an np.ndarray of the \ - latents of your cells.') - parser.add_argument('-e', dest='expected_number_of_doublets', - help='Experimentally expected number of doublets', - type=int, default=None) - parser.add_argument('-p', dest='plot', - default=False, action='store_true', - help='Plot outputs for solo') - parser.add_argument('-recalibrate_scores', dest='recalibrate_scores', - default=False, action='store_true', - help='Recalibrate doublet scores') + latents of your cells.", + ) + parser.add_argument( + "-e", + dest="expected_number_of_doublets", + help="Experimentally expected number of doublets", + type=int, + default=None, + ) + parser.add_argument( + "-p", + dest="plot", + default=False, + action="store_true", + help="Plot outputs for solo", + ) + parser.add_argument( + "-recalibrate_scores", + dest="recalibrate_scores", + default=False, + action="store_true", + help="Recalibrate doublet scores", + ) args = parser.parse_args() model_json_file = args.model_json_file data_path = args.data_path if args.gpu and not torch.cuda.is_available(): args.gpu = torch.cuda.is_available() - print('Cuda is not available, switching to cpu running!') + print("Cuda is not available, switching to cpu running!") if not os.path.isdir(args.out_dir): os.mkdir(args.out_dir) @@ -96,9 +127,9 @@ def main(): # read loom/anndata data_ext = os.path.splitext(data_path)[-1] - if data_ext == '.loom': + if data_ext == ".loom": scvi_data = read_loom(data_path) - elif data_ext == '.h5ad': + elif data_ext == ".h5ad": scvi_data = read_h5ad(data_path) elif os.path.isdir(data_path): scvi_data = read_10x_mtx(path=data_path) @@ -107,82 +138,89 @@ def main(): min_cell_umi_depth = np.min(cell_umi_depth) max_cell_umi_depth = np.max(cell_umi_depth) if fifth * 10 < ninetyfifth: - print("""WARNING YOUR DATA HAS A WIDE RANGE OF CELL DEPTHS. - PLEASE MANUALLY REVIEW YOUR DATA""") - print(f"Min cell depth: {min_cell_umi_depth}, Max cell depth: {max_cell_umi_depth}") + print( + """WARNING YOUR DATA HAS A WIDE RANGE OF CELL DEPTHS. + PLEASE MANUALLY REVIEW YOUR DATA""" + ) + print( + f"Min cell depth: {min_cell_umi_depth}, Max cell depth: {max_cell_umi_depth}" + ) else: - msg = f'{data_path} is not a recognized format.\n' - msg += 'must be one of {h5ad, loom, 10x mtx dir}' + msg = f"{data_path} is not a recognized format.\n" + msg += "must be one of {h5ad, loom, 10x mtx dir}" raise TypeError(msg) num_cells, num_genes = scvi_data.X.shape # check for parameters if not os.path.exists(model_json_file): - raise FileNotFoundError(f'{model_json_file} does not exist.') + raise FileNotFoundError(f"{model_json_file} does not exist.") # read parameters - with open(model_json_file, 'r') as model_json_open: + with open(model_json_file, "r") as model_json_open: params = json.load(model_json_open) # set VAE params vae_params = {} - for par in ['n_hidden', 'n_latent', 'n_layers', 'dropout_rate', - 'ignore_batch']: + for par in ["n_hidden", "n_latent", "n_layers", "dropout_rate", "ignore_batch"]: if par in params: vae_params[par] = params[par] # training parameters - batch_key = params.get('batch_key', None) - batch_size = params.get('batch_size', 128) - valid_pct = params.get('valid_pct', 0.1) - learning_rate = params.get('learning_rate', 1e-3) - stopping_params = {'patience': params.get('patience', 40), 'min_delta': 0} + batch_key = params.get("batch_key", None) + batch_size = params.get("batch_size", 128) + valid_pct = params.get("valid_pct", 0.1) + learning_rate = params.get("learning_rate", 1e-3) + stopping_params = {"patience": params.get("patience", 40), "min_delta": 0} # protect against single example batch while num_cells % batch_size == 1: - batch_size = int(np.round(1.25*batch_size)) - print('Increasing batch_size to %d to avoid single example batch.' % batch_size) + batch_size = int(np.round(1.25 * batch_size)) + print("Increasing batch_size to %d to avoid single example batch." % batch_size) scvi.settings.batch_size = batch_size ################################################## # SCVI setup_anndata(scvi_data, batch_key=batch_key) - vae = SCVI(scvi_data, - gene_likelihood='nb', - log_variational=True, - **vae_params, - use_observed_lib_size=False) + vae = SCVI( + scvi_data, + gene_likelihood="nb", + log_variational=True, + **vae_params, + use_observed_lib_size=False, + ) if args.seed: - vae = vae.load(os.path.join(args.seed, 'vae'), use_gpu=args.gpu) + vae = vae.load(os.path.join(args.seed, "vae"), use_gpu=args.gpu) else: scvi_callbacks = [] - scvi_callbacks += [EarlyStopping( - monitor='reconstruction_loss_validation', - mode='min', - **stopping_params - )] - plan_kwargs = {'reduce_lr_on_plateau': True, - 'lr_factor': .1, - 'lr': 1e-2, - 'lr_patience': 10, - 'lr_threshold': 0, - 'lr_min': 1e-4, - 'lr_scheduler_metric': 'reconstruction_loss_validation'} - - vae.train(max_epochs=2000, - validation_size=valid_pct, - check_val_every_n_epoch=1, - plan_kwargs=plan_kwargs, - callbacks=scvi_callbacks - ) + scvi_callbacks += [ + EarlyStopping( + monitor="reconstruction_loss_validation", mode="min", **stopping_params + ) + ] + plan_kwargs = { + "reduce_lr_on_plateau": True, + "lr_factor": 0.1, + "lr": 1e-2, + "lr_patience": 10, + "lr_threshold": 0, + "lr_min": 1e-4, + "lr_scheduler_metric": "reconstruction_loss_validation", + } + + vae.train( + max_epochs=2000, + validation_size=valid_pct, + check_val_every_n_epoch=1, + plan_kwargs=plan_kwargs, + callbacks=scvi_callbacks, + ) # save VAE - vae.save(os.path.join(args.out_dir, 'vae')) + vae.save(os.path.join(args.out_dir, "vae")) latent = vae.get_latent_representation() # save latent representation - np.save(os.path.join(args.out_dir, 'latent.npy'), - latent.astype('float32')) + np.save(os.path.join(args.out_dir, "latent.npy"), latent.astype("float32")) ################################################## # classifier @@ -190,22 +228,26 @@ def main(): # model # todo add doublet ratio solo = SOLO.from_scvi_model(vae, doublet_ratio=args.doublet_ratio) - solo.train(2000, - lr=learning_rate, - train_size=.9, - check_val_every_n_epoch=1, - early_stopping_patience=30) - solo.train(2000, - lr=learning_rate*.1, - train_size=.9, - check_val_every_n_epoch=1, - early_stopping_patience=30, - callbacks=[]) - solo.save(os.path.join(args.out_dir, 'classifier')) + solo.train( + 2000, + lr=learning_rate, + train_size=0.9, + check_val_every_n_epoch=1, + early_stopping_patience=30, + ) + solo.train( + 2000, + lr=learning_rate * 0.1, + train_size=0.9, + check_val_every_n_epoch=1, + early_stopping_patience=30, + callbacks=[], + ) + solo.save(os.path.join(args.out_dir, "classifier")) logit_predictions = solo.predict(include_simulated_doublets=True) - is_doublet_known = solo.adata.obs._solo_doub_sim == 'doublet' + is_doublet_known = solo.adata.obs._solo_doub_sim == "doublet" is_doublet_pred = logit_predictions.idxmin(axis=1) == "singlet" validation_is_doublet_known = is_doublet_known[solo.validation_indices] @@ -215,32 +257,55 @@ def main(): valid_as = accuracy_score(validation_is_doublet_known, validation_is_doublet_pred) valid_roc = roc_auc_score(validation_is_doublet_known, validation_is_doublet_pred) - valid_ap = average_precision_score(validation_is_doublet_known, validation_is_doublet_pred) + valid_ap = average_precision_score( + validation_is_doublet_known, validation_is_doublet_pred + ) train_as = accuracy_score(training_is_doublet_known, training_is_doublet_pred) train_roc = roc_auc_score(training_is_doublet_known, training_is_doublet_pred) - train_ap = average_precision_score(training_is_doublet_known, training_is_doublet_pred) + train_ap = average_precision_score( + training_is_doublet_known, training_is_doublet_pred + ) - print(f'Training results') - print(f'AUROC: {train_roc}, Accuracy: {train_as}, Average precision: {train_ap}') + print(f"Training results") + print(f"AUROC: {train_roc}, Accuracy: {train_as}, Average precision: {train_ap}") - print(f'Validation results') - print(f'AUROC: {valid_roc}, Accuracy: {valid_as}, Average precision: {valid_ap}') + print(f"Validation results") + print(f"AUROC: {valid_roc}, Accuracy: {valid_as}, Average precision: {valid_ap}") # write predictions # softmax predictions softmax_predictions = softmax(logit_predictions, axis=1) - doublet_score = softmax_predictions.loc[:, 'doublet'] - - np.save(os.path.join(args.out_dir, 'no_updates_softmax_scores.npy'), doublet_score[:num_cells]) - np.savetxt(os.path.join(args.out_dir, 'no_updates_softmax_scores.csv'), doublet_score[:num_cells], delimiter=",") - np.save(os.path.join(args.out_dir, 'no_updates_softmax_scores_sim.npy'), doublet_score[num_cells:]) + doublet_score = softmax_predictions.loc[:, "doublet"] + + np.save( + os.path.join(args.out_dir, "no_updates_softmax_scores.npy"), + doublet_score[:num_cells], + ) + np.savetxt( + os.path.join(args.out_dir, "no_updates_softmax_scores.csv"), + doublet_score[:num_cells], + delimiter=",", + ) + np.save( + os.path.join(args.out_dir, "no_updates_softmax_scores_sim.npy"), + doublet_score[num_cells:], + ) # logit predictions - logit_doublet_score = logit_predictions.loc[:, 'doublet'] - np.save(os.path.join(args.out_dir, 'logit_scores.npy'), logit_doublet_score[:num_cells]) - np.savetxt(os.path.join(args.out_dir, 'logit_scores.csv'), logit_doublet_score[:num_cells], delimiter=",") - np.save(os.path.join(args.out_dir, 'logit_scores_sim.npy'), logit_doublet_score[num_cells:]) + logit_doublet_score = logit_predictions.loc[:, "doublet"] + np.save( + os.path.join(args.out_dir, "logit_scores.npy"), logit_doublet_score[:num_cells] + ) + np.savetxt( + os.path.join(args.out_dir, "logit_scores.csv"), + logit_doublet_score[:num_cells], + delimiter=",", + ) + np.save( + os.path.join(args.out_dir, "logit_scores_sim.npy"), + logit_doublet_score[num_cells:], + ) # update threshold as a function of Solo's estimate of the number of # doublets @@ -251,88 +316,113 @@ def main(): counter_update = 0 solo_scores = doublet_score[:num_cells] logit_scores = logit_doublet_score[:num_cells] - d_s = (args.doublet_ratio / (args.doublet_ratio + 1)) + d_s = args.doublet_ratio / (args.doublet_ratio + 1) if args.recalibrate_scores: - while (diff > .01) | (counter_update < 5): + while (diff > 0.01) | (counter_update < 5): # calculate log odds calibration for logits d_o = np.mean(solo_scores) - c = np.log(d_o/(1-d_o)) - np.log(d_s/(1-d_s)) + c = np.log(d_o / (1 - d_o)) - np.log(d_s / (1 - d_s)) # update solo scores - solo_scores = 1 / (1+np.exp(-(logit_scores + c))) + solo_scores = 1 / (1 + np.exp(-(logit_scores + c))) # update while conditions diff = np.abs(d_o - np.mean(solo_scores)) counter_update += 1 - np.save(os.path.join(args.out_dir, 'softmax_scores.npy'), - solo_scores) - np.savetxt(os.path.join(args.out_dir, 'softmax_scores.csv'), - solo_scores, delimiter=",") + np.save(os.path.join(args.out_dir, "softmax_scores.npy"), solo_scores) + np.savetxt( + os.path.join(args.out_dir, "softmax_scores.csv"), solo_scores, delimiter="," + ) if args.expected_number_of_doublets is not None: k = len(solo_scores) - args.expected_number_of_doublets - if args.expected_number_of_doublets / len(solo_scores) > .5: - print('''Make sure you actually expect more than half your cells + if args.expected_number_of_doublets / len(solo_scores) > 0.5: + print( + """Make sure you actually expect more than half your cells to be doublets. If not change your - -e parameter value''') + -e parameter value""" + ) assert k > 0 idx = np.argpartition(solo_scores, k) threshold = np.max(solo_scores[idx[:k]]) is_solo_doublet = solo_scores > threshold else: - is_solo_doublet = solo_scores > .5 - - np.save(os.path.join(args.out_dir, 'is_doublet.npy'), is_solo_doublet[:num_cells]) - np.savetxt(os.path.join(args.out_dir, 'is_doublet.csv'), is_solo_doublet[:num_cells], delimiter=",") - - np.save(os.path.join(args.out_dir, 'is_doublet_sim.npy'), is_solo_doublet[num_cells:]) - - np.save(os.path.join(args.out_dir, 'preds.npy'), is_doublet_pred[:num_cells]) - np.savetxt(os.path.join(args.out_dir, 'preds.csv'), is_doublet_pred[:num_cells], delimiter=",") - - smoothed_preds = knn_smooth_pred_class(X=latent, pred_class=is_doublet_pred[:num_cells]) - np.save(os.path.join(args.out_dir, 'smoothed_preds.npy'), smoothed_preds) - - if args.anndata_output and data_ext == '.h5ad': - scvi_data.obs['is_doublet'] = is_solo_doublet[:num_cells].values.astype(bool) - scvi_data.obs['logit_scores'] = logit_doublet_score[:num_cells].values.astype(float) - scvi_data.obs['softmax_scores'] = solo_scores[:num_cells].values.astype(float) + is_solo_doublet = solo_scores > 0.5 + + np.save(os.path.join(args.out_dir, "is_doublet.npy"), is_solo_doublet[:num_cells]) + np.savetxt( + os.path.join(args.out_dir, "is_doublet.csv"), + is_solo_doublet[:num_cells], + delimiter=",", + ) + + np.save( + os.path.join(args.out_dir, "is_doublet_sim.npy"), is_solo_doublet[num_cells:] + ) + + np.save(os.path.join(args.out_dir, "preds.npy"), is_doublet_pred[:num_cells]) + np.savetxt( + os.path.join(args.out_dir, "preds.csv"), + is_doublet_pred[:num_cells], + delimiter=",", + ) + + smoothed_preds = knn_smooth_pred_class( + X=latent, pred_class=is_doublet_pred[:num_cells] + ) + np.save(os.path.join(args.out_dir, "smoothed_preds.npy"), smoothed_preds) + + if args.anndata_output and data_ext == ".h5ad": + scvi_data.obs["is_doublet"] = is_solo_doublet[:num_cells].values.astype(bool) + scvi_data.obs["logit_scores"] = logit_doublet_score[:num_cells].values.astype( + float + ) + scvi_data.obs["softmax_scores"] = solo_scores[:num_cells].values.astype(float) scvi_data.write(os.path.join(args.out_dir, "soloed.h5ad")) if args.plot: import matplotlib - matplotlib.use('Agg') + + matplotlib.use("Agg") import matplotlib.pyplot as plt import seaborn as sns train_solo_scores = doublet_score[solo.train_indices] validation_solo_scores = doublet_score[solo.validation_indices] - train_fpr, train_tpr, _ = roc_curve(training_is_doublet_known, train_solo_scores) - val_fpr, val_tpr, _ = roc_curve(validation_is_doublet_known, validation_solo_scores) + train_fpr, train_tpr, _ = roc_curve( + training_is_doublet_known, train_solo_scores + ) + val_fpr, val_tpr, _ = roc_curve( + validation_is_doublet_known, validation_solo_scores + ) # plot ROC plt.figure() - plt.plot(train_fpr, train_tpr, label='Train') - plt.plot(val_fpr, val_tpr, label='Validation') - plt.gca().set_xlabel('False positive rate') - plt.gca().set_ylabel('True positive rate') + plt.plot(train_fpr, train_tpr, label="Train") + plt.plot(val_fpr, val_tpr, label="Validation") + plt.gca().set_xlabel("False positive rate") + plt.gca().set_ylabel("True positive rate") plt.legend() - plt.savefig(os.path.join(args.out_dir, 'roc.pdf')) + plt.savefig(os.path.join(args.out_dir, "roc.pdf")) plt.close() - train_precision, train_recall, _ = precision_recall_curve(training_is_doublet_known, train_solo_scores) - val_precision, val_recall, _ = precision_recall_curve(validation_is_doublet_known, validation_solo_scores) + train_precision, train_recall, _ = precision_recall_curve( + training_is_doublet_known, train_solo_scores + ) + val_precision, val_recall, _ = precision_recall_curve( + validation_is_doublet_known, validation_solo_scores + ) # plot accuracy plt.figure() - plt.plot(train_recall, train_precision, label='Train') - plt.plot(val_recall, val_precision, label='Validation') - plt.gca().set_xlabel('Recall') - plt.gca().set_ylabel('pytPrecision') + plt.plot(train_recall, train_precision, label="Train") + plt.plot(val_recall, val_precision, label="Validation") + plt.gca().set_xlabel("Recall") + plt.gca().set_ylabel("pytPrecision") plt.legend() - plt.savefig(os.path.join(args.out_dir, 'precision_recall.pdf')) + plt.savefig(os.path.join(args.out_dir, "precision_recall.pdf")) plt.close() # plot distributions @@ -340,31 +430,37 @@ def main(): sim_indices = solo.validation_indices[solo.validation_indices > num_cells] plt.figure() - sns.displot(doublet_score[sim_indices], label='Simulated') - sns.displot(doublet_score[obs_indices], label='Observed') + sns.displot(doublet_score[sim_indices], label="Simulated") + sns.displot(doublet_score[obs_indices], label="Observed") plt.legend() - plt.savefig(os.path.join(args.out_dir, 'sim_vs_obs_dist.pdf')) + plt.savefig(os.path.join(args.out_dir, "sim_vs_obs_dist.pdf")) plt.close() plt.figure() - sns.distplot(solo_scores[:num_cells], label='Observed (transformed)') + sns.distplot(solo_scores[:num_cells], label="Observed (transformed)") plt.legend() - plt.savefig(os.path.join(args.out_dir, 'real_cells_dist.pdf')) + plt.savefig(os.path.join(args.out_dir, "real_cells_dist.pdf")) plt.close() scvi_umap = umap.UMAP(n_neighbors=16).fit_transform(latent) fig, ax = plt.subplots(1, 1, figsize=(10, 10)) - ax.scatter(scvi_umap[:, 0], scvi_umap[:, 1], - c=doublet_score[:num_cells], s=8, cmap="GnBu") + ax.scatter( + scvi_umap[:, 0], + scvi_umap[:, 1], + c=doublet_score[:num_cells], + s=8, + cmap="GnBu", + ) ax.set_xlabel("UMAP 1") ax.set_ylabel("UMAP 2") - fig.savefig(os.path.join(args.out_dir, 'umap_solo_scores.pdf')) + fig.savefig(os.path.join(args.out_dir, "umap_solo_scores.pdf")) + ############################################################################### # __main__ ############################################################################### -if __name__ == '__main__': +if __name__ == "__main__": main()

DHCMwHIH=*CIwi{caSlgRMVUu;=4(#LWHAYxi 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�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 bRC!{{wgeA0TFn>mRYc- Date: Thu, 18 Feb 2021 15:05:44 -0800 Subject: [PATCH 07/15] precision recall plots where flipped --- solo/solo.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/solo/solo.py b/solo/solo.py index 1f9d78a..dd0b84c 100755 --- a/solo/solo.py +++ b/solo/solo.py @@ -325,9 +325,9 @@ def main(): test_precision, test_recall, _ = precision_recall_curve(test_is_doublet_known, test_solo_scores) # plot accuracy plt.figure() - plt.plot(train_precision, train_recall, label='Train') - plt.plot(val_precision, val_recall, label='Validation') - plt.plot(test_precision, test_recall, label='Test') + plt.plot(train_recall, train_precision, label='Train') + plt.plot(val_recall, val_precision, label='Validation') + plt.plot(test_recall, test_precision, label='Test') plt.gca().set_xlabel('Recall') plt.gca().set_ylabel('pytPrecision') plt.legend() From 0b2f0da8c50bf1f95e7d373701b53cba1367037f Mon Sep 17 00:00:00 2001 From: nick Date: Fri, 19 Feb 2021 14:46:13 -0800 Subject: [PATCH 08/15] adams comments --- requirements.txt | 2 +- solo/solo.py | 45 ++++++++++++++++++++------------------------- 2 files changed, 21 insertions(+), 26 deletions(-) diff --git a/requirements.txt b/requirements.txt index 6503090..5840ef5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,7 +2,7 @@ ConfigArgParse pandas seaborn tqdm -scvi-tools +scvi-tools>=0.9.0a2 leidenalg torch scanpy diff --git a/solo/solo.py b/solo/solo.py index dd0b84c..9cb92a3 100755 --- a/solo/solo.py +++ b/solo/solo.py @@ -7,6 +7,7 @@ import numpy as np from sklearn.metrics import * from scipy.special import softmax +from scanpy.reading import read_10x_mtx import torch from pytorch_lightning.callbacks.early_stopping import EarlyStopping @@ -36,7 +37,7 @@ def main(): parser.add_argument(dest='model_json_file', help='json file to pass VAE parameters') parser.add_argument(dest='data_path', - help='path to h5ad or loom cell by genes counts') + help='path to h5ad, loom, or 10x mtx dir cell by genes counts') parser.add_argument('--set-reproducible-seed', dest='reproducible_seed', default=None, type=int, help='Reproducible seed, give an int to set seed') @@ -96,9 +97,19 @@ def main(): scvi_data = read_loom(data_path) elif data_ext == '.h5ad': scvi_data = read_h5ad(data_path) + elif os.path.isdir(data_path): + scvi_data = read_10x_mtx(path=data_path) + cell_umi_depth = scvi_data.X.sum(axis=1) + fifth, ninetyfifth = np.percentile(cell_umi_depth, [5, 95]) + min_cell_umi_depth = np.min(cell_umi_depth) + max_cell_umi_depth = np.max(cell_umi_depth) + if fifth * 10 < ninetyfifth: + print("""WARNING YOUR DATA HAS A WIDE RANGE OF CELL DEPTHS. + PLEASE MANUALLY REVIEW YOUR DATA""") + print(f"Min cell depth: {min_cell_umi_depth}, Max cell depth: {max_cell_umi_depth}") else: msg = f'{data_path} is not a recognized format.\n' - msg += 'must be one of {h5ad, loom}' + msg += 'must be one of {h5ad, loom, 10x mtx dir}' raise TypeError(msg) num_cells, num_genes = scvi_data.X.shape @@ -139,7 +150,7 @@ def main(): **vae_params) if args.seed: - vae.load(os.path.join(args.seed, 'vae.pt'), use_gpu=args.gpu) + vae.load(os.path.join(args.seed, 'vae'), use_gpu=args.gpu) else: scvi_callbacks = [] scvi_callbacks += [EarlyStopping( @@ -177,18 +188,16 @@ def main(): solo = SOLO.from_scvi_model(vae) solo.train(2000, lr=learning_rate, - train_size=.8, - validation_size=.1, + train_size=.9, check_val_every_n_epoch=1, early_stopping_patience=30) solo.train(2000, lr=learning_rate*.1, - train_size=.8, - validation_size=.1, + train_size=.9, check_val_every_n_epoch=1, early_stopping_patience=30, callbacks=[]) - solo.save(os.path.join(args.out_dir, 'classifier.pt')) + solo.save(os.path.join(args.out_dir, 'classifier')) logit_predictions = solo.predict() @@ -199,8 +208,6 @@ def main(): validation_is_doublet_pred = is_doublet_pred[solo.validation_indices] training_is_doublet_known = is_doublet_known[solo.train_indices] training_is_doublet_pred = is_doublet_pred[solo.train_indices] - test_is_doublet_known = is_doublet_known[solo.test_indices] - test_is_doublet_pred = is_doublet_pred[solo.test_indices] valid_as = accuracy_score(validation_is_doublet_known, validation_is_doublet_pred) valid_roc = roc_auc_score(validation_is_doublet_known, validation_is_doublet_pred) @@ -210,19 +217,12 @@ def main(): train_roc = roc_auc_score(training_is_doublet_known, training_is_doublet_pred) train_ap = average_precision_score(training_is_doublet_known, training_is_doublet_pred) - test_as = accuracy_score(test_is_doublet_known, test_is_doublet_pred) - test_roc = roc_auc_score(test_is_doublet_known, test_is_doublet_pred) - test_ap = average_precision_score(test_is_doublet_known, test_is_doublet_pred) - print(f'Training results') print(f'AUROC: {train_roc}, Accuracy: {train_as}, Average precision: {train_ap}') print(f'Validation results') print(f'AUROC: {valid_roc}, Accuracy: {valid_as}, Average precision: {valid_ap}') - print(f'Test results') - print(f'AUROC: {test_roc}, Accuracy: {test_as}, Average precision: {test_ap}') - # write predictions # softmax predictions softmax_predictions = softmax(logit_predictions, axis=1) @@ -303,17 +303,14 @@ def main(): train_solo_scores = doublet_score[solo.train_indices] validation_solo_scores = doublet_score[solo.validation_indices] - test_solo_scores = doublet_score[solo.test_indices] train_fpr, train_tpr, _ = roc_curve(training_is_doublet_known, train_solo_scores) val_fpr, val_tpr, _ = roc_curve(validation_is_doublet_known, validation_solo_scores) - test_fpr, test_tpr, _ = roc_curve(test_is_doublet_known, test_solo_scores) # plot ROC plt.figure() plt.plot(train_fpr, train_tpr, label='Train') - plt.plot(val_fpr, val_tpr, label='Test') - plt.plot(test_fpr, test_tpr, label='Test') + plt.plot(val_fpr, val_tpr, label='Validation') plt.gca().set_xlabel('False positive rate') plt.gca().set_ylabel('True positive rate') plt.legend() @@ -322,12 +319,10 @@ def main(): train_precision, train_recall, _ = precision_recall_curve(training_is_doublet_known, train_solo_scores) val_precision, val_recall, _ = precision_recall_curve(validation_is_doublet_known, validation_solo_scores) - test_precision, test_recall, _ = precision_recall_curve(test_is_doublet_known, test_solo_scores) # plot accuracy plt.figure() plt.plot(train_recall, train_precision, label='Train') plt.plot(val_recall, val_precision, label='Validation') - plt.plot(test_recall, test_precision, label='Test') plt.gca().set_xlabel('Recall') plt.gca().set_ylabel('pytPrecision') plt.legend() @@ -335,8 +330,8 @@ def main(): plt.close() # plot distributions - obs_indices = solo.test_indices[solo.test_indices < num_cells] - sim_indices = solo.test_indices[solo.test_indices > num_cells] + obs_indices = solo.validation_indices[solo.validation_indices < num_cells] + sim_indices = solo.validation_indices[solo.validation_indices > num_cells] plt.figure() sns.distplot(doublet_score[sim_indices], label='Simulated') From 59d6cebf840dc28823d747cb3bb95d0d77f29729 Mon Sep 17 00:00:00 2001 From: nick Date: Mon, 22 Feb 2021 08:40:16 -0800 Subject: [PATCH 09/15] adams asks --- solo/solo.py | 6 +++--- testdata/pbmc_performance_tracking.png | Bin 39627 -> 41715 bytes testdata/tracking_performance.csv | 5 +++++ 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/solo/solo.py b/solo/solo.py index 9cb92a3..8a76b04 100755 --- a/solo/solo.py +++ b/solo/solo.py @@ -7,7 +7,7 @@ import numpy as np from sklearn.metrics import * from scipy.special import softmax -from scanpy.reading import read_10x_mtx +from scanpy import read_10x_mtx import torch from pytorch_lightning.callbacks.early_stopping import EarlyStopping @@ -334,8 +334,8 @@ def main(): sim_indices = solo.validation_indices[solo.validation_indices > num_cells] plt.figure() - sns.distplot(doublet_score[sim_indices], label='Simulated') - sns.distplot(doublet_score[obs_indices], label='Observed') + sns.displot(doublet_score[sim_indices], label='Simulated') + sns.displot(doublet_score[obs_indices], label='Observed') plt.legend() plt.savefig(os.path.join(args.out_dir, 'sim_vs_obs_dist.pdf')) plt.close() diff --git a/testdata/pbmc_performance_tracking.png b/testdata/pbmc_performance_tracking.png index 0dc94d5d60cf0362ab054366488b6698980efc11..ff61d967c7f0f2b2ea466476a2de9b3ff94ec993 100644 GIT binary patch literal 41715 zcmeFa2Uu0-wgtM?s7Wj&rWi#a9@UW6FanQ7!1C{ z^xtVeD%?88U|cs){%XsCQ^8$zPQh%u5H7b>{Nb@ZpYbhO^5HvtS7#kxnzS}b>ob9q zHWB7ubjL)Mi!R?*wR1!1e365x>wGPaWQL?3T9=%(N%vtA+a^?F6W@>Tei6P*df9n* zf3E=^jKBB6-)let^8fZekV7ue)^u`m3U%(!8|8I-sU6C8E zj9?pna5|^1y&_)Ud*S>CQ z>%QZoY@|5t9cldQW5w_p|Ji>qTYf=Xqd8J3F!`>LdaTklMOrxq_g-X&SX6zL{%{!2|xWo~5)3d1f ztUc{RzB`Ro1$`r*oLj86UAa~mA23*Rb>qo{^M$0=&k58t9(B)o6>RseEra16dm}1w z%hlv9B33xQ`*iv{#wvIEvj6Y@P`UHdwA=YAUYks;3Zf5reR+|qp3^&NzD4Ca^~H+y=z>5rR<^6_d)|;Hs zd4;uS%;f#u9tPd1f8!4&^VV8u`34CdW4-cIPZ6ByUQ`yr#`V0;*Eu=IPLXDDQvHVdB0zWX{lRqT?YKa2M2!e-0ZejJ0);t(Hc{+4;Voz zSRu2Af7o8r5~}bB-jlc;mADk^tm@Kyc4vJ2fsHo(KW-A2C_A;0p(i5w{R~Fs6O~0W zYtMTvxrzgdIVxhvF6_R&8wc0md+AC`REsJ(tJU9k(2E9wRMcc(=V`Gn*neE=SYuDIFFZa3qy9`E~#+@w=I=MR+Kh)dTt~#JVR~RtP$`@3htJw;$)9@tLiY8&8J#Xg5nl3vo$*ZhTtO$ZxSX+$ z!Y~DeTfx>l*>So-11uTKkRi9R(y$g<{@L=cPkXSE9EUn?>t$y&wzAo5f96&!h?x~D zeBpIm{+U_x@|XMTcyBO#awPxC7o4V*3OK2j+xC-g+!43pn)>0?uAK26{<4q4t!~Dhg8rMk{EgG< zPHOj>1_lN`Pc|totEjMFTjR!^Og@t5O-q%HQ#&{{+UV7)$sALUyZh<~71l<>Cl_~z z$!F8)YFwVrs4M)FxWN$h5o^;{jMvNFXk2);FhnNJPzzbFg%uLi*O(hWBL2~e-A^Yt z1Eux#^@&~A&I|6`zkk2~W;Jh1mrm_Pn~v_O@AI@bv-ZR8yyeE7(iLPVjwB)zC7B<;k@2W91x4Gl`?<_iRx#%D{I z1Y2#NkDW1h(MI9YNR@&Blh7)oOy*d5d=fqzeCpNr+IDUX_l<9YW%~k3Gw1l)v@@?U zD%a-Bc9Ch!oIfpmJiTl9Y(QV5Q)%cz5wGAOi?A)TB~1f;!9M-Z#}I!h*s-1Q8$dG6Ky2v8AuL1IM*q5;^a!bE>Vae%G6`6Zx%%5!q;tn15I`ehoi##;vRtLMIB zcEu|qVFTfY%5#6*6YfL(Rv$||US!K~H$S-FaI3M3V940c<#}_g>J{;N-(AWii1bz;>%DKngGO3TOF?{nOuWeg` zx9||wo9k~n8?P z*Vpra$C?uh?Ij-5Bg4?Xnt69%9}laoE7YxZ_=0zxpSFnfWPSVwq}VL9*L$CmFr)JQ z$cqAg50&N@;tYXg;y0TJygA;n<7OYUm|gnS!u(HJopAnxZx%Kf(fhdE`;4F{rC6-s z3twIYuzH-0EoA3QpfmtaXl(BE7e>~+Tb=q(A|qjpuEds41gxg6rydsvNM##;&X5S= zZM{Fhv*`xOSo>dXtY20b7y4u05k{7d#e&&?QE*7u``c%U(Z+TzTFl_Lt?Hg5*7$={ zshuXfT*M#(zBuX~Qa$M(3F-zm;E$flk2VXNrz7>(p`2P5-Y(;00oxT&4uU*DS_ z6=SQbfxQBRp0em&MtIOiZH(KRKRrKxxJ*W!4?<`Y%g8e_{5{YJgqME*-)5MPx|fk=5mG-(! z`|X}f0%GEGG76;CWc$9V=T427ROs5PY~8wbyO&@{1OBXSP0VcN`=}7ydpeQ|L<(>~ zF#y1e{E{NT3#=Q;KK(Dw@EMncZ|S_vG%gBUVpq18Qnv_mqMuTpm%`Mklhwy=dD?}# z3|H;Gx_+sWpu-VYPJzDhi+iUXMqi#!CQS5L4$qmvt{)G?lpl{h-{$$mgWo^VFt_FU z1(BWJchb^K+DfiT4VCS;VQZPhCQk)R*;v0kyRhZ-Y{4DHp>h?OMSzEEBS?)x_To3p-91OKEdGSyZmmChINlakWh5fjh4B|j83F`&S;VJUDY zL^_?jP4x=^AvIKD$`K)Vr{Z<(N04{!(2lwLOe@#I%<^Y{zZdd(z;;b z)0@0^?bFu}14L~4er4#>vkUdEVol=>L$=PB62{%y?VZ(Q7hjO&Ft8D~ZV3>1XI;<5 zMPh`SJj1lLwYMS0E1m|9T5oXA9T?E0{rOE@KT+L`O_|-PHIDjJB8190Mdsw>7*fEj}11mrjj3vk~+)(uH`f!$^5Gu z3^&^M)Os2LYX!*ITRia+V%AsCrWj}~Rs%H5O*${=xQezXj+`saCqHW7Um-VGvbD;l zST60J9*&kE{@&oaBV&W@oF|ewmwT~9oQFbFmweRZrPgTNe)`_Z;7h_%J$D-krFssj z$#a_4YNxIxTwPzE5yD!Ev?ozT zS+fGCy>x%%?z~bpg%EtdA!eYo1x=E)+H zrh7B^3NJ0)y3xG)POw8ufIufzGYXtMH98^Z;pDKQ?>=0%(P_AAiBngiwhI^Ebjpq+ zIM{u$SNa_WV}bdefAG@juW-vhiIm88?(;GT6aJHoz-aSB)-}lfJ?21G{VIG$g5Doc zEyLCZVQpyf27~iu>KP(2s6?F=8vsTaB}K>x?3h0-Q{8*=R9-PE!@n>*-~9UW42rw} zuWMM-7^$D1o_}vU_>*^SK!@DpCEb6!R{wYE`~UUdF)IUckluc|1w4X!=UxUQBSkPp zkl}8v`zQPX!*&bI$_ zysYvP$gf*D{a@a!&|DoLMdMJSY-R#-92N+dH*l4sVWULYnV<5AlcD92S(3zPQAK~@8Me8;%Xmf`;@B6 ztaIwkwkO_IrZ-E>zTUy)QxTo3A1>S81YRR%=oG%!){qr$Z~btdWRst^MV?4z*YiX( zq|&093w18N_tA>76C3fN3>lLW8Opn%Zc`jPKT-W0Sp>!C`(NQ_W}@#nu5=rabo1fE zX{QgdwXst8j}5|8(=s8>j(QHup6w`0huMIY)6D7j?ZN^PUx8TYBkwYHEy0-7quim*IpGe5A>X|Vam)VnFonk68 z<**fe5qt4_bO+xuIqztzAt^5A=P!N!+?&{GM-Y4A+rh%rK6Y6Kl6nBQ=uYD~E1W^X z&36Y?r(Oz8E#%w}!d7dfdWo4ww0;E#%IfJ4gI=Pbz!s*c6F7U_XZBxQw?5^qx`@ zbRB)USPcnV(SAjV%pz&qqZT=wmfHst|52f1qf+1RmnN)CaD~?3Nhz&li1~Q^mz)IPgW+(kO>tJAhvn}62RC~ol)U1)Pv8t~O{Zu3>{pdqjzo5p_DqDQ^lCdh zQ5}PX3Oy&zT)GPFE4^D9Sfg=Up$9*kwY<8gI2_cRT-bPRYtqB{GL+o-bw_sTk3H82 zgkK^W(lguTba&N^9|Mq?~)hUt;ri#-_DAUFM}@ z!r^ZieNyY#`Kw<&GSpGd83^NMvHDX?D~xe}es$QAt$ambsFGOy;H8cfUfuBaXOB;E z#Z5y(u-5}NTYZgN6q>~;vQ+g34hr#R?<4DhB1sc3x#6eu z5KK(8Dqxd#`EWU5+`Pl*1vEPQaLsK`ocYF1KCu_T^ZvcWs>@<+ZZ9t@3Fb+)2KyL# zO07_n8#>_KdEZQS**qj8Mw>oFVFFBbR2A>E93Nexdk^D_^(u^(+b8TEgp)L z@7}W;3xR;t3=O8(u0q#eFWb>>ty^hO{S|GC^qc2=Xe-nqg7o0g%j(qaJ!HZG^ZC5C zR_Dz3IJZhYY-B>aYxS~Dg*4MGJ2!XHzF&S;4;HbdP^`Gnd-*Qh#pm_)q5PIv8-&Iy zbFFKwa?5{tzzYM!1_CRxRuKK!-&|k=h}HD^Az!gRcSyfA*oGDLHtyuio^(@>DPMc& z&Z-%+=kEsgq;p$~*b?tl*O}CtGtPF*()9QVTU!0uQjT(W_TFxKzIH*@;2Zn6U{MKN!Ky7R1TpAh?csWqB$ zg<;%@*1?YQHS^}p(+$;6HPiA~;WRWFjF`aNng~Rw7vhGn8yRM|5bSb=+?*+dSFWWp z5H;!|pbzj7W@9rMA1j4(&!(oP;_+6<6PkK`UN~>s>?M~#tV+u{j;c>%82uUad0_-# ztV$P_H4xHE%lsz53p%!4o4aK5dIc`0m{9#>o-){6^X2q@SQsy%V6`bB= zPump&m8;D62-;iqHk}cgFwh&Xu4wUcn=tIj8er8rw1#NiIl7lPJ!fQ?IJyy?r*1oJ zBj)ngMRsSZOgiG~z<2{!9+|@?H;LAYJE+FJg3^YKoZvph&x2e^tVM$_XN<8eRxujuRIvU;_^k3z1OFMkrS}MG8maC(rTy({ zZqjZ;nr^CJxH{Z+-T5_DrqkrNZ+ijOiFH-9f!f!AwZVHHB8<;gqekc!{Dbxj6FLwQGi)%=)1?;+fw*sT5XvfkbL; zOL-NAe=}5&;*Zp1_eMm~<0`oMOuaJ74y+DaYbsY^YQyB%Pz(}sN*c%%3&$H$*d67L zA2Zx7RB-KnX<5s$iF-!V_eCAy^fycOW)1WYr!lino|#tmlt}Pz=fo9nXt*o>k;q+n zV#CZdrkG$YI2R~JNCuU|eay`>gL zr8P+Tn(Y;Ch)x^rI?4!Pp`uzOWqpM71kYB5$#%6{`=V?evRcIB9ja`mWqnNBm?wyi zJt*!jZ|YjpBIN@%`0OYiJQNyA6zFsu+ixP4a>6J)tPHW;=LsQMMAF0Q3m}#x<--Y1=U}(<}JR%8Z%|z&fBXb;Jf9_tmgg#(PC6M{ZIu=ZiSreNUAs0 zAFrP1&}4RurYrGrKb)@p#IR_M^s9+&=Ho2c++O>8nKaJFAMV`g5^Nxen}8-#NN$+=S}b9 zDV^dWq9QQ|Ry#c8ufG&FHF&EEfkpCeNJ~o#9z3JhFYfF5@d?UqhSGJM^I#MBWEzVlCoz%?sTY z6P$9fbBma0YXzg^FywM6=cap5!2=L@en5$~?y1Tv>GYnA&W$I#Ds_;$jvYIu3<(V& zFN2QF9DOX>U(+xpL1{sLIMFM+qqh$Ei*^KR<~*wHp^G^8`-Fiqv5{sw)YR1bjbydT zNkJA9JNEpBj>}Lv52~SFKXIleganx!0%^~#Z;K!6QXFBUoauAwT}{>FdSK-M3G+iD zU^ga)^tpDqNs>%X5dfK*JOrLrP$dOaJ^;d7*vib9HFt-Li;JI#ZnY8T`ORIDqny6T z$jCu_qM*5JyqD?bw^qwr+?0JoGhVMV%NW}>|LNsrVs29t^H|R_?Ry7%>YO45kOKEO zQIrD^x&g(hb8T+}(@oH2@R@KPaWl9#9u~K72<)HTkg;kKZ$qN9X=N3S_BB?F2LkFJ znVR4nv$X6zI1F5LGb-v>wpFNbfxl?+GA~(goRUfpQ6ffwryyWf5M43=0n>i1(^&hh zf$!Cv|6!QxsnY*Ir5gHCMxMC}9!kJ5$^MXD=ap2@Soi0xG(d_oNC`RDW{Vy>f`(bN`NWGDjwwzkeAeo6W|k4>WE@r(c!%pttdKHg^5!2S zJUbSY)+9kG-6SCqdGn@Gw*LSSf6Z(p?9%|lAH2ndyK1=)e)wb!6=g?oYFf$0D*mlR zsx4N*Mf0l2^v<|Uir;dCU+`J*o0&J#)1^>!76I0gBEZnzJu+%A6w`E3jP`S$9z3!j!-Z^9R6NQG_bZL*7Z(zRet4iik1diC8hYb<;uPLbOu z#J#*XV*5{sk)9T4)ga@%g?R{rpa#*1p{`@?I@Wp1-vZpiMT1=RSPe0JrKeakF`42O zI{O=W*-&runJH#;`Ei`1P?$KXqwp2)jB%q8C28;Dc11!(M&cJh;@3HGet$G1uJ{&Pxbq!1K|?k0Tna=HO@JHi>GbR zB5bId`C(1mQ$S}QVaT*Qq#JDyoNq2;p(f)^l^Ce)$$f$)4NaBb*W=*^zhGbP&ayYycQ-I*_pBKVy-&cFQz&fU zPB!pz6!M)><$9Cv+`DU#-7|>5;u(JSfmbn`CJ(3;R6mG}yx|`pAx`!%xl@O{X6)I& zY*yE$jGYxmZ)NSE)3miw#e=X7pr@p8o@DJM>|`Q~SVUb@fJhOXXAtv8mr#BcC8|dz zC6X_Y2MhQ>*iN*%O_>NH$}B-mpFTC#X)4EF(_*vYUO@^V+|T|YhV3$3&vch%L=F|` zPi+hvE4$UNz#UM4B_(EPNBq?@A21j@?rixU6}2D<393@fR{*@40R-}X+#6wCuC7_` zxEA{?V*~1fBTp_aN*{c_YXHHw1u-cf1!psb&-R*%d6)62$|UR{a7>m1R5O9d;9i&e9cqnWrhrU@O z0P6E!^gzzUXY!jwdO~&wNvvD8{o+$97>MSe{Kz9pte-AL+3mXjZSf4)+yt$IHB_M= zh7-C02aKJa9q$GsL^gxbD$upBQ~w2I--wM}2UNVvd+ulJKPSlUeWX}!r0@)%{K0}} z`1ZCILgMhs0AM<8{QA*%1QsaPJ%=ztk%!U<_B>t8Ra^``!icrr!eNtLCLp{9B&E6% z9ws3aw;=w;^pR7}*2K5tLfUGRY_e(~lBGAQ_S9tj9P*b>j*r9-ZAKLLIC`dk^O>CY z0AF{##Xtr<#Q`5{2e3CI35S}+F<-oHC@IYF;;kT`5!gidnZ-! z_kVCl@K%qdA^As5mjTmoNNn7nDisX(YAc`3$G`pq@?{ugt}KZP;MrQhU^D*`bK$?f zjdEt{I`=(Z1n(X3xmJx&np0~mYTCx|u<4K^jo@rgoy;;N&%$y|{p@->(Yr6cIk4I{ z7ztk6z#4l#HI>Mn%#5z20#f$CAn~MMU|>SuvVdw3W=o_y$+wEV5S~ zl5J=Rn5z&wOP~$s$xi)ZXsdTW8AdvGkG;QWa9tDl$bIsI*Z7)Ysd`Fu4CuZamJJ|I zC7J22ayrygoAK^6W|I~bdQ>$9 zF~x9bvrqnOSDvskF}~z21Lxz4`#9j8CIi_IMUJg3est&NN#aU0?_oWmv`&kPk1s~G zlDSqt!}b^zwL>|PQBhyWISubdHIth(Intm2(XsvRkttXp^TEB0dA8OdgHatuT)9TP zUR`sFXa__E$B~}N)!hVyw14>5U3b8!zEoeO1N7KH^Rbtm4`ziVN}{kT_*?1fWnduu zGEyxplq_=RmsszZ4{5d#81}cq>yf9I3IoO0C{wA@3IRX=&aqPKj;LELBtT$S+JGQk zu1vHJ(!QO8m%z!&r9e@g(gj$Y%Hek*@Ba5?#+=Xo3xl0jj4saCV9i@dWYBrc+*}0; zI>_AtBP>uVHbdo__OjfRc$amv1y32kfE@<)&tzh>k3+iTO?%uN z_t3EhH%8~w%d-wIPR}MUwEu)W!Ag;=*AIeipDT+V zoBRy`b<69;rPzx8PfSIfx=f&Je?7-z8n+K#h9}zc@+1YWPOI<7KP{=P4Tc6XS5WqD zK|eg^tw_iRdrgUr(s7#{qHIcwZ34mxrON)Klik&%WC?WEp-do>5}cxfQLcb}p_*&I z&yo}Ortt?GfvTijnOh8LF#bd@zN~UV@D|apK!Ot-*d>xKjC_@M<%|9Od1|giBef^h z!?^Dc{y`?K-qBPQh8l7ZrE{moCGXauX1JM{nAo@hEl2CJ*Wh?&vyjrMRu~!@(n4DE zZ-$alWC0^leFf?%BeWSH?e!i^#Q{uEArmo^n*^cFD9mM;$0CBHU1D3Zh12iP%(|}y z=lEqmKR?gh>)S5qy{t!yNLY>(5&lnDxVjguk5}%#dWkd8dMi6S+pvlpKZKh)%1zJo zme<$UH!m1wmVxf`j5l)X!=V%%{sQy3aYtE{KqrLHWmNAa6VZk{Kz?&qFxgF&hF*0Y zO{>Uci$Sl-LLGV#EQQZp?rqrtO?%6pDBjb9wQ}P?JoH|b3DLjV~ z_M`FBOG}9jWyuZ{!b#`Y5k;1Et*ld4P}ptoftG61_#zPWDdi)4gfRSnqcB_l2YI#s ziJ6Jlf0S?cx9<~=&tKdWUV@gU1Um@C!pfk3JXT`QA8&uW;#A^?KgxkEeIvwCb77w_ zo`(0xnF3ms?Ks!_K=hPOk}i=~#MHP>j=|(pX6uI-NMz=PPuK0_PEDFh&q+A!sa`3u zS>tfcp67{Z;`vqoqMCv~kZw2epa@o8hrFI`qu-g*SG^Z0g8V?LM8??8o@$ZD2Vbf#RkbPdo*J zaOy_j?>L#v@k}a$blDtOPp%+s8IwiFQ>N#tJ#)N{VpZ+{QH9_aM~q#jEw!XOnxT2_SrUMQe;k4E2GKMe^LabGw5#Z{SmyIFUOr=hL-M zl~;ybf$((W+O?%*AtDYEO*O_5HM)3mJwfb|&#*9}K{mb1u0MGFfdrMk`W#lgDKM903z3r#>{so|@JYb=@0aNN{2Wr;Q) zjMa$YyjsY-dU=@=-B!{ArrN`%j``HIG=J1q^CQ2--KE5Pf`0V|40S|c-)RQnAdiHtgb>)qx(h04^HW{ip{XtMsb|B@Jfc|D7)z9*C* z=yTQ$E+frK3S)aI1(VoX-BimjqoIEXc!5Nq0$g-zUiWE3yN9_Q6*d>EqQko5btwMJqIHy1XV2ji}u{qK7}0@tsG4^3UYu3 zS-um3`TqmLO=I@JZctY`Uy;a$*9~*Y&aLik#E}X;^NfR0B61 zJ5zJi(lWjWG)OsG{t^ty1FYGNQg?`WTglN3QRkO)%1PKgwUYbbL!~8qLnO?rw^z{T zVz~XH+A1FFRmw(|_({)^@d{tGRIEI@zinL1<*Z8aX#)b$cp|PAmgrmz~xy3}`o{ zQTzJesZ$Y%2^)R1G8!uPcud0>J1yG7!$b5~(CdHXc5n%r4H*iJAM`hZm>I8nb^Xib z=Js22J5cTGcR!0z8UoNerCjsU*J@UF(5b$ptGXwv(Bb2@NGJ28xj!=@8=`++!r_PH zma?>!5w%#RO!hUqshyJ8ydD;fwC~}3$;gUJOxytXzmrz4ZeS5d_nvEoZE&8+3BOV4}KI{6(d2cBVZZY)CLyOVmJC2ei5R&1tmZOG1knP^WU_F$f%dk0XE8xSYCc7bv*2o}>eCk0ZcbGr{ zDY}5g@yQ;@Nw*KB9M7(Cuo~}lsykQj1We3{GL2{qPe7;Cwad<%|{{s zB=wa3(0XLN@nHAy=Qor&X>Q|b@NNlUojC9{gyD~Fbm^tFwOLg)KKX^*G?)jhdbHJ>>9B!H!tEv zLR0}9lm&H(6R6P4b5Ax5r>13hb$@wmNsMlt8+VciGUY~U>4K=Gkz`}d31*SdSjl;^ ztdIu{JK*qm^TFm>o%pO5SB~UQj;KmisgY-xK5A)$vEq}#^?ZAD( zs1?wB;Ob3QnnfGF{>r~K_u?WSbaNQ@)TZ-XvBD0>{N%Vo=Sz-ZHWH<%rDJK3^+X?f zbYm8vNh6HcB}5ucoFPAnK}^@l3|R$;JzaRt1JKE#bP4{K7Phu!5gKo66YJrzx(vqy z^*rRI&e>uJ@PZBc@L$udvO-@9asjN4eZ5|h7nL`h@fC9J6M4_M+ zVTb$<02@z@E&Y3n5;Km0SM3^&czn}eFObOzVmfRyDWP(a0u&H}QWCh&mCEE4)HKpy zFE2^kOQ3`&GUAAI&C>D}q|pQC0VKEF@KMc&LpYgS12BtFdy<&z#OOr1{-nD1LXma{ z@{J;y8-WNGsQD2^@93HuCHel#I=0WYaUQLdzl>GdK%2o8#t!nHSHCa=?zPSsN zJZmQI7(DiBqa93?|+Yq_95@ipoDo)wlIG0*fSOq(Hhlbxg$sf?6& zYRnOKcsWa8q`}QCSAjwX;h^M3PZ^6%W4(}QsmHs(Z(RZQW<#I6=+x!Iz?BIpp5;eM zbDxZnC5*Bsj|;}SknNtBijPz`FU_07UC>94I5JNV0K1c#8kv$JuDtQYi+i4K%KBj{ z0{eqx2GHM~?9Az3tCb`iqY>Lt`Glkcl>6CDBj;E=v@$hp$(5i0(@(6C&kB|NSC237 zuo_v5$;)}a+oI#3OW)ku3$EPphFfuQagE83668J0=LyB|$qnuyXhX6ic9%XJAM=~DR=NK>zUP`wLqCYK8pVD@+756Cb+X10*?i4?FAnqLu4JS?LZ{mo)0c+480%WWAHGW zS=VGa`yLYPL@}zav`ct|IYgvke&x(KCv(-Meck!b8`R zMNvgfA*rU+YRjvO4fxZ(e*6OgTgrq~agnXEr+-nKo$AX$tjI2m!a1@3&k`hn09VP(?5ar2gu4_XWn z%ubKzD27k02v2Po?2H>od$UFaBXd#_JWf}HiR3$3W#mt;%zS`38NKoQe6H*1S*3s$ zo9M(y&~4w_IgR07Gy-Q0b@S0okK7~zo6x@WbBnRgO7d`;BGmNcq2dj~s_{|`nbB|C zXOaam-*=5o* z=!V_5uM7Sk>QuWdB9@*>BTN_1rn5eurYyDm`|zp z-?VAd4Sl97r!rUGkBU@;6`qd*Y-R1KMvrz_2R#+0Mh|s~pev*YBWr5z(&!SvfrGq| zN0Ud${6%8IH+)a`O~*csAoyG6`g;xjYFX(2)rykVW6*j0w?yKb zZZMb)L%}%G0Gp^7o1WBnrn|_HqskcUTZ$l#zUmQJ|0E33DRZ3rkCHSQ!k+yPwp2pI zU95(mm+b_r2_d-p*}G+-iVdu+Q(8`-7-zz{`642IX5SWk=2xuZfASxW8)F(*?cfd@ zbnQm-`fJ21h`e?AvsM=dDI5qIqPxjbT zr+YkG1h{0+vgs~jNPb2E@-B|V)Ka65R9pBNVg$)=+NsMW?;6p8&OK{VcF2=AJ?gYFkbCX*`5f!09l9rm>f53MKj&Ej@g>)|Fts71ZHpb37a^A zv#(C*EhHBLArcnq$XFL+j1tgf$>Mq%Ws@JX8aRV1XerIPzy9ZreYnYy++S6eLKd>3|C- zqxPcT56?n@a3njP&;cQMYF1SRkf!bf9jnKmkkpkcO-d>CU?Jm~X4f1{I-*Rz6;ROa z%bC5v6hF_uDyZC#?@9gibdIkxMoqBDz+8c585%1f58kSU#zN`V&EbAXjdL^{fQTPE z)*a>oG2_A=XnV*tq^^YORP2mXL+=h2y`78@Z!dV}hnc zcP)2#**|nE)NwU6JW+K&*!FB0Axd=a#@|r#5`^)z;8#3{Q(kWkH6j3i7a(f6_v1@T zKtU2ZK!-v1K{hzDbemRVNa_48<}}I;WFvX3S!hjbB;*ZHzSd4XDo9b$cD zr{&M>tl6kixS;A_=z|lAxwhvv%h*g#y>2ag#E_mf5c<-USr=EM!cK`x(KEG;^3tkE z5&55iph3x(`D@|}Veg>^MV`hfKl)-tMP0(-t@7hl#m0zj)R{$cD;h#lv|4G90&29Y zXhgIx^9BN3(Q-V64%m&_}1F!T(s2RV{59zNgpEjmF6a^SC41{ji!#(Ht!oZZ!Sl!Dp+I^eA$L2 zWfCz&wHHw{7#d@y3wi0z0ZmQn8mVb=Jy~a0;f#?8`P7HkRKBK-1}%YHtiF~W6d1Tq zTRRBq0j}QmC|bT0D{djDzVA5uwmwsyMrSnT`DptOAt(5(RAT{4H1wFVW3~O^uezh9 zp{pB$oF88|6ciL>)94{dE%%ffgIeR5Q)9>x3PkNtmPbOfv}W6Nve9c6Rm4jiT_sgB zY`38g8!am=0DzjcLYq$*KrVUSV;Z?Tz?-Il(sTkE@&v1l33y<9(jvK@23JzW-d&y2 zUXx~Nkv+uj0yh*}?Dk@Y&{G;)Lm3Bl-#jLFoY~r!D@0^%O`Ro>f&4%~aaP_kblV%4 zLeu5V3Izirj?1u&j*h0z`(Ws{WEQS6&PGe~N-x>|9dNG<0LF+S=|25t=A1*zCTZ41 zX9m&6(0y!((*U7dh?XA7>Rxg(!yLp`kc5w@GU2dx`znN}wpEr^z3#{y z@S|?|1|(&6<^$$1b}BkZvS$$FfK`ipSFr_flx{>5p$Dkb3i55!5D{?Ic_d{M%bMJo zh6cyF47(ubDNHF)_J*BnbVvxtVm$8qbYwo66v*L3N;?5J5`ds(t)|v3?Qa zb9;l`&%9A^^@5Y2l1B|%_nA)-wU4&;#Kk~G`)=Yws1t&*#5 z>t;$&tME_FCUjf~-$8)SH|;_&g+m@Z_1EZq+mD9;BS+R#PY>}#%N>UDC&`Y+)}J*O zOba0|G>fLTCt~NmPHS~4NfXQIeA|iROjC#dYD3K5?_BtMMgRA9)uhVZ{`@s!)=f{T z5G8^SeNuPx>?F-9FBOAIrfD`5CJMF;j0gWGl%i#VAWR*d zBybLP*GSTng0`vDe6lSjbiX?|KchV|Xd}X5Fc=h?qbG*GZIZ5w6}Zlsoy9P!XzIJz zk!+7?B%6_L52Zf&9#1~W3qeFia+eprF@F{Yu4V*}6MK+NL6zSK1@X13NRVE+qkUTO=LE@LC+C9paU#7l z;}@+rP$cb)G7jqBUh-McW`k$PBxr~d9ci~@Siz0s%>@8IqU?>9e5ZDegqEzENBzp)vg$&2$jH6myID%fEsD8dd~a*G)>;g+2(@cmI~;at`R~P z)XAUT00}M4)x5?O##Tmtqgb23ChU50DG|{#A3&6PcIbAJH(59jBM`454M(E0QJI$K z2%3^e+8`Z;r`7`#E=t=bb0=TZO58xe=_8_jVdJ)br!{t32v zvItM;^UjPjH2b(2SGfsP6b#~X$f}qGnUk_JoLZ*YR<$_!8s{8mdX6#Jf;_vlw7j9< zPzog^ot@BtO!EscR#84BC56T$@V=UQvpS{yb*z;Enl7W8$O!m>hN2O3V3yoSE8O{7 zuB~QKgB`}{&}0^QdhNlVI3fT4^^;1G>DlNeAdliYOA8BCSPxgykSd0`-MAuA4>qu0 z5klpcOM`=rkUNQTD|cg67;fzD8Ix3cKnDv!eQ_+J^(35i6QHM@Xm+{k)w%f8)a{zt zW8jso5i~9PIWUQD!f?*ERQ`9vFGN}D_=G7`T^f5L9)jV!ifO4^P52U0fXa4ZI=rR? zX96zD{^z?y%^!Zx$nXquP2ZH#^LfPTs37STr7P$5b|s=o_@;&1OcyvaNU_3i zkrSPqYV=#@aPU}6g;?j?wBKf7x;MtO_}Y#uhCz~M!FmJNpB2^RzJHCS?60 z#i~$?gXN1`UYgT)(S+c|7$r2rp{HS{`@`0U~Q*$SigDKaP{e)=`hxDc|5 zAr{;AUtu&aDtBug{BdW{j$SQw-^-JdIqfSL3`@Ng83-%xy5%6M>2Pu#O);F731=e9n(pZIi_sCP%m-kEGtT zXxB}>Kc-It^Z??%gmMxjeVQp2BKx5tXI6#A95jHN8)Uva2(Y}KGe&KnAfjAYyYE$*~gZ^ooJ96l`%CkkL<^xda(+?S1E%t5L@Tv_IKTQRi~xqrVVd7Jnrz|bbC*bPx)2)h zMI2#7;zr!w;g9-q5QM(0?mU}O32owOfzX~VogBvkA~ zHSeL$idGux!W*ZL2^lKhG;GiT=8G^Iv(rx$e3on zC)9$AhDem?#psKuuQFtO+}eIl-TalTGB%lPX+nk#Z4@(d&D5!fY?$moK#Uhk z;l@9%60uk?LXHDu4`pu@gY>2eIP;Guvz*`^V0|_({M3+#X}|5mXe>r@8m6?HZL6DF z*CXd>#!;CL8U}TL{j5@3c}v4-_22zjFmq?VxksOl;49Y2r}}T6eQH?;f5n|A4*eY! zu`b7Zu9r#1wb$N9*o(r3W!M&$&Wovbp6%$pNprPBGdt_9pKX< zwFd64WBh9Gl!(8%S2tB|j3A_7jqK|8U|hgKgeG|2Zqzl4GAFEwE1-#x>8Pv8ie`bi zVfhkoZVv_0o9X+Mi=(5R4|hzn_!vXV5mSR6nX{-yCCdXr07{^?!<%cq<=?`vJmAt8 zh|ML9-671H7S8`{R&)EXW{IQ;wn8CcV?LL*tw;ijiNC}hrgANT1tfYF$&+xaU@{|3 zc80GNlXK{i4WX!Pi3n%!fJjG^LU|@sa>AL*QqS|9^6nWfG?x2NmsRWOe^t}oQ8m^ejnUd+;obOBXefp`fn!HfZRnjo2 z9p$u1O`XasSF{fpV_3x^*;6M(GTN?_8-fE{0nU~R37oBFi4P4kBey5-Aox<=d>%k& zYC$gm25+dMaiWSN%x|WMSqFMjFYS&GPa`jX9*oJ4c`ps2aK{palF3LdUei`1#$1lYrYEqw z|9u(;bY*)u{^CEj>y-H(dGTqgJ9TNkdh|URJ0;V52(r*5KfQ zpd4?&8`xF2$ZLDXsAfU)jm^`g=bLcYqq%i?romRt4TXFs3$4)HUZ#^B zTY$>)5Vy9hY;Zf@LhN~S#c<1Ih&x);@=D%P+~9ngl|*g&ID|1s0}LQSps8+qf1G@( zY^ETlTg}1tTl%vMa=Ma3o#!wkJ7bj=#ROp*%v|l_3U@W`jF}5L zzv5dzz|ENj5g+a6~kGo?VkeD0Zc5FWybn7P$#H6Ek3J%Ck^N#MkBUZ{mqaJ z8mdgA4d}g2+QH2~v9WjST7hOlP~J(rDKOXd{AC3uI8t6wIXPTY3J6VfsxsA;SU|D@ zP~5f#;X?0VDj?eQ9 zbY?gXjt=mDOmCMWnS?rr8gg80a9mzfC=H{|V9|Syn#$w%jqjp%6zk{8D{q2`AY=IR zu>yA*?Sw)Dbt+3kfrjj-iZqfG*2h@s&Cd>aA6TA#qWbFYu=Tw3+2*ISWp=nOAlsovS>@Hr_{?6- z=NN{#;PiaOOhLyMuUM<8z@6S_i?hlWH6m0wVQT+LQq#WXNC>`zIlXwz;n9lG4=wZb z(@v?Y_m3>AfBwY)K4?!LoEI0%I$QeWMlP56-08sbg{lHRRJqA~#!!@O7U^M_Js*7U zp-o%;45~0Mb}@bMrnAZ)FafvJizri#7{@sCQ8n{an6M5$d%69Dq zluZ$kb^_sKS1RgnJY1_(x=-2hz;cuVN5;N=NpM9mtqGu@JK9pGbTM8vxlb8Y@#Qt` zNL$}4;x4L5-ahUzQ1KfCjCUzii$`-=?R(2lY5}Wak@vsB#=M{WRBDvR_|_*!uhzfn zs0iq3-w!lb$9o}-GU$ckYfgMm#pcC`C2>_>Ey0izycNle{i6E#VS4%3sSCtR{hM#) z`s?rm2}Jao4HBC$jm#Lq1eWX5ZyS?H3>%2*3fjXEJz zdTyboPnqhU70Ogx%;T51Qw0dp6NI)pOKT?XzU@4ylz#vj`Z-y@fDC#&!%b-2G@+bc z$A^KSCo3%B7sK1>0_d$VBrkhYSwM~{GLlzhH~dCqes|EkiJDjSoVtB!00))hG##Jb z!y@N+hnr>q(x2vJQ!lDyN<&6QMj4x(Dvw1Tj!dO#2<)XLGU0CAsrIVm*6sFc|1M^D zmO;}QwV19hda&^0G%-aIYm_+D2PQ1%egqNf+8_LLKH3DngrGNGDhymeN7fpenoVA( z6nV|413b!|dYWjWCuS9;ICMiPrtX>4s$QCy1t*w=H4|)zD$rvP)eX&61o5KD$v}O` z;b-RO(;H)UiDqvi2t;os6s8t0dPQ$pdHHf>8eK>)s3Dn^`nAcih#P~tZyAl{2{6kEpuuSv272Wo_S zNhNSgQBZ|r<6WG2D#w`vhaMiJV6r!o;!pFSY3zi##pp@+@|P>mSD1J$F%HC#<4XoE zWi+VylXs2U1j(&H4vjTvHPMjMz{RJ^|COkrWFA8Cukxq+{Ax;{j2A`e?f$#OoO&XT zMG4DAduK!$ZghF@nk6{LUGnKCcz>D5ZE#Jdct_-}<(#tGZE-hd*wXu1!{<0<99B0C zW=5v(%R>N_G5MS!y&DCc?cs>A-e5s>bN`{Y>;p@YVS5$tNNan5_lmKTFo!nMsHEGFgRhJvVL~k ztE_*uE#}{I9Hm|ct<2&0%mam8S{1P;oR_{pQQTKy>I7EV2&wE^-oDqjOhv#4XKX)w z@Z(2VECj^guU6?fTsfmM|M!gZ+ZXf2njPSVltx5%Cxxo3TtRHfp8yDNtl(*`8-gJ1g8NW|p!5+L<@R=W>#WL~v^;-RWK{d^_52zw^6P9OPBjUb=qZ|{>}Yolx&f)CC^Hh6v0j7VwX+pd~YbJ?*n}wsrDII z)@iS2rGJB$K%NCmJ?4Q|Q$`7g1!g|=wRIQS!FwwHfM68Q)5aG0;|6%wef~$N5Ogc? zXwU`=Rgc$je9Ofx($TKV^O^Q~dpch2thi7TkLr?)5%*u1w~ST1S5ac4eA>d$4JMZI zHx!HQ4B{{cR`NS@r4$#oP${BY`zL#vk+p?3gYDtp?FE7GIeO;~f4Fw^?!FTZZw5$uFqPz4xoxZQsxfC&MoU zf$bg^C=+Emx7^(Q8OQIUz_1@n@ICkW1Tb}jGw;r@fjN%Brhdg7wz18eC zdEU|SzDY*i`JX~f>$gn)YU8RtH_1on+{wTjwBFpFyjbQTwsDm?(~)ITa&6Ds^$3o* zQ$P(q83{!$v+C4sS6#5wG1!F?0&xr8nT%NtckgxbzAynepVTS27`@m*Jhq$%Wixc- z&OaD^GE$R+! zvlS0{;luo1rfwzb6L5(hyjy7I&AWqU%W`Ii6j{xLg~xy&Vx`&lYp@^;?SS4btwTKU z{p2HD*Vad{DVML1Tgb_R;Gz`Vl2f9wa{R+nKA1sZfmEBK=(eDd^;mU z8jMNdZ*Hg`>bQ)i@9+sM%5X6tZDtaS6@9 zlo%`oni&MQizo^x#*8q)paBDn1H=d%keS)%`B_J|th9h_G>he&d5)7s2cd3PcoP`QgOL>I?ISP(@R$h$)Xl%w8S`_rXZJ zG1yFXb*QY1`{zerIUzbJ<|8w1S6Q+QRV#bXjKIl7uY-&owz`f6rHBSfT4=zezmmg6 zA`2Y&12GuR^VB`328#_YH0~}VO?&uN(9qqZgK#TOThedKDEy;f3PpnL&lEz(#BfEfjjyP;tHsLP7a4 zJAUJfy4a5Eqx8oye~Lh}Uzlid;Kv3%+{`3#&XCal%!QLsd=7#%JUDu`L=A>d8k9z4G+Aaax=6Ezu3FGc? z;)n8pi}wlJ?sd#W+5c$|o`y+ccjhjSjz0(+M6xjGERq}1GvKK6j$KVA%|dxxTi8_> z%%T6hm4Q<*!VidF;L$vj5Un3s_m@t*74wZP<8!Y=Z#X9KG;tfu_5b??jYt_jGHnDZQm=`60*H8}v?weotz39n9ny%9702dFhLz*(+M^ zACAq%*+>Y`*!HF`MGj7&&ff74I~?_r_6gIPN?liF{Q8k}jCF5|Ftb))hQgR4K1Ks7 zfI8cQA28ZFYwNh`wZ0X?9(c$@C~<#c@D%sVPtI|EybrU?=75QqBu+^)3*e(8j|Q^rP)t{_Em(m~liM7G;}Dkr=EDnT zVID$>Bk2{;xhEBx^D)C4v!r(yY8O0eSd>|#@bM6uRgi89{tAjKNSUFp!f`AlF|yDs zM+=Hm9EyAHUfzKZBrLxDB3tK)*C@9=|(Gf}7Y z^p;&M@DCFumW>eeLa`rJdUSfQ;YSq>K`bSHgYDIICX@t^k_46-2U57S@ex1#N9{&U z-CABf9{|)BgNh*}C82C;hvdESTBCGP7_XZZwCw~=%sH~+D49ybxiJSH_~_zX)^=&$ zX}~_9HVbZp3{ra?TXPz$kvdHl^9ql7ALFbrqp`Z&X)a&OJ7W}M)?6>Bl$1uAOmPDq z%V=DV&LjDRX;j1JpXZ(y406G2;%t3~^z3n_q4%U5p5m^=Tk#xISIX)&5F9+i;OC8l zzO&PUx#_3TZ*Zh-($MzOEi>Pk@Sq;3onWkm1gXtgm13P@#=vbh(5 zC9xoCa>k;gu3FFch88kIlQpR-!E*5tYgaZtRrqnXi4WU1@7SgUnx%qXIUzj@@ZMC!zsFalN04tFPn$q4el8=X}xXb(1w>`_7_Pz9j{MZBumfCA-I3G+mflU9gu(W+v;AwQM! z*-|YUVUSsGfAXf!Dy$T}redS6Vf=T3VDohYdsQ&pP8gJjh8_TD{OT(Ey?NM|UlY zsw1I(Y}UhvM%2!36i|R1O2tG;Qc8lraTK5Cc~;=Z-H6Kwe8~ z_0jCvAr)!4c{8>mSVbC|s-w)R9!*BWAdQ!V_tW;P@4VOkqHy0E(yfs}# zrqz9W#xtNanXformh*6SWy5hatSRrtX9~g0QaTw~Gj8Xe!BeP6y;$`_y=L{zR@^*q ze;-0E)vJaz>D7zFU_Npis{A$1epC6?M0D2MvcZ!SjLon8!Uw}~FwOEchMojuUG)No zR$W(2nILVlf=(Axedr(NVdJ`x;Ziv;F-<2HhLcyz*RfZU{KL${fTU%`owCW}!Q^do@X9LDYPn6ub1zh>>~GxU^9qCn=gLr%)z-vL24Q#VomyJ$nsXC&OsPG_u9QB zRnP!TgwRyr=&(D_qo>fF2YgFVk2BVdc{mawq7V*$+A3@b+#>`$92QG^(%R2)#OfpH zvFcN(it;qygUuQii{W49yMc3_)%Q;iY}=Jc={>( zdv>L}~j%KL4wi3vV2hIQoIh{492#d?n*z~m(sUkE@& zi@`P1>9^p;Z0;!hgdq@pT{Zbfxbi(N5|y}yKvl&8VcpS=Q*b<~7gz1Ir~Jc8qH)cm zojG4IWy;-O?lNWQUrXYM*I~YpiJh0bHT{iv`h@5+UMn2I1JC8DIt6vzI+o4TklVyWDqKI!iL`Njlanq%2C%?c_8+PQ> zfVqdfDmuyw>_L!3jd~VXYiGA`yFNo!5VPxHL`V+AUW$$CoEZyTw0LI11UiPck{wjFUv24R2kZx4cD2eUVWNQ|UOtW_7)*K{Mn5BrCgd^N;%Gr1Y z;0W?Vv!=c^wq&ceEcU+cg_P|<>VIi?{a-exs5O_ZT}*CbDZ_TvMktkJSf4peV`g$x zq4+W?Q`$zcSX!)4P99!E+aT>Xn7R3PeRQNjw$`fp&=E7GCgZISn<{AHFlz8yhYGOD zN+KmIal@YVM<;3)J5Dv(IDgn)0bXP|*uihw4_*clH97fGZQM@qst@l()*7Mz9+qL4eDA7)~s+ zcaM2cJ3^h{Y~~{R8k$glyQYN~p0Qn(HQmq=*H(${2G1mEQ1?{ARx+qBd)VHenTN(l z9^(;fOH`IhIAmut47H6Nt82ya-@x4@`nK5{hqM;e=id>O&?LU&%=U9%=nvE4%;Zo7 zveZjQ;eQsZd8WddvJcUzaRW1f-eSA_mY_!7$Oa8Zf zL?+Bx_cy?q10hOvmeV3i>zFj#LMJy`C~er@HM9irhvbi6f}Nh(jFMDJ%kZSom6Ym@ z^QO>{D@f|k<5^C~%qCbF-~B{Y%6O0BG2cluJv=5kj*6X+;X6v9j?<4g#BOzJE5nqD z1Q!TfuuSVOMUlHmHwV<6E2&>X8?Jrd)ct2MI(?f=G6`K$tP=&ACCay=vH=Qb5rLD1 z8R?&;UXOT0hp`Rjv2*`6G`tFNkSDlAQ&0O2LzMe#XuPIzHrzdIito%h$ZO_Jx-IdU zu_ZTQxMkM4@D9zvg->*K_qbwadyVygZ}gC-6ec5{TR8S)9fkesQB>DFvq4bKf(~^e3M`A|I5V4LpN__87fgcxC5y z?>L6nM3Rb@sWF0#FCJepyKO)5#RKN$=t`PJXaULB@q*#F)XFud)5hd%&;`!Kjo`nLLaYY>datxp@^{>XpL9gk;Y=^1D&bZ)?H4gf9*|Wq08ecdx-+ sJNNBQ;?M0$|K{d(_n-Y27tt*aZaLZg@eMC();%Q4RzIbE;`!J90iV7lPXGV_ literal 39627 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 Date: Mon, 22 Feb 2021 08:46:22 -0800 Subject: [PATCH 10/15] I think this qualifies as a major version updata, moving to solo 1.0 --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 54cef1e..7c9aaf6 100644 --- a/setup.py +++ b/setup.py @@ -13,12 +13,12 @@ setup( name="solo-sc", - version="0.6", + version="1.0", description="Neural network classifiers for doublets", long_description=Path("README.md").read_text("utf-8"), long_description_content_type="text/markdown", url="http://github.com/calico/solo", - download_url="https://github.com/calico/solo/archive/0.1.tar.gz", + download_url="https://github.com/calico/solo/archive/1.0.tar.gz", author=__author__, author_email=__email__, license="Apache", From f5a90946d58637f477657559a177d9a31682567f Mon Sep 17 00:00:00 2001 From: nick Date: Mon, 22 Feb 2021 15:29:32 -0800 Subject: [PATCH 11/15] vae.pt to vae --- solo/solo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solo/solo.py b/solo/solo.py index 8a76b04..0ad9116 100755 --- a/solo/solo.py +++ b/solo/solo.py @@ -173,7 +173,7 @@ def main(): callbacks=scvi_callbacks ) # save VAE - vae.save(os.path.join(args.out_dir, 'vae.pt')) + vae.save(os.path.join(args.out_dir, 'vae')) latent = vae.get_latent_representation() # save latent representation From 15243611e5d6fe18768a24d1e8061f09617c0e47 Mon Sep 17 00:00:00 2001 From: nick Date: Tue, 8 Jun 2021 10:59:50 -0700 Subject: [PATCH 12/15] moar changes --- requirements.txt | 2 +- solo/solo.py | 54 ++++++++++++++++++++++++++---------------------- 2 files changed, 30 insertions(+), 26 deletions(-) diff --git a/requirements.txt b/requirements.txt index 5840ef5..6503090 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,7 +2,7 @@ ConfigArgParse pandas seaborn tqdm -scvi-tools>=0.9.0a2 +scvi-tools leidenalg torch scanpy diff --git a/solo/solo.py b/solo/solo.py index 0ad9116..e1d0162 100755 --- a/solo/solo.py +++ b/solo/solo.py @@ -55,7 +55,7 @@ def main(): parser.add_argument('-o', dest='out_dir', default='solo_out') parser.add_argument('-r', dest='doublet_ratio', - default=2., type=float, + default=2, type=int, help='Ratio of doublets to true \ cells') parser.add_argument('-s', dest='seed', @@ -72,6 +72,9 @@ def main(): parser.add_argument('-p', dest='plot', default=False, action='store_true', help='Plot outputs for solo') + parser.add_argument('-recalibrate_scores', dest='recalibrate_scores', + default=False, action='store_true', + help='Recalibrate doublet scores') args = parser.parse_args() model_json_file = args.model_json_file @@ -133,7 +136,7 @@ def main(): batch_size = params.get('batch_size', 128) valid_pct = params.get('valid_pct', 0.1) learning_rate = params.get('learning_rate', 1e-3) - stopping_params = {'patience': params.get('patience', 100), 'min_delta': 0} + stopping_params = {'patience': params.get('patience', 40), 'min_delta': 0} # protect against single example batch while num_cells % batch_size == 1: @@ -147,10 +150,11 @@ def main(): vae = SCVI(scvi_data, gene_likelihood='nb', log_variational=True, - **vae_params) + **vae_params, + use_observed_lib_size=False) if args.seed: - vae.load(os.path.join(args.seed, 'vae'), use_gpu=args.gpu) + vae = vae.load(os.path.join(args.seed, 'vae'), use_gpu=args.gpu) else: scvi_callbacks = [] scvi_callbacks += [EarlyStopping( @@ -161,9 +165,9 @@ def main(): plan_kwargs = {'reduce_lr_on_plateau': True, 'lr_factor': .1, 'lr': 1e-2, - 'lr_patience': 20, + 'lr_patience': 10, 'lr_threshold': 0, - 'lr_min': 1e-7, + 'lr_min': 1e-5, 'lr_scheduler_metric': 'reconstruction_loss_validation'} vae.train(max_epochs=2000, @@ -185,7 +189,7 @@ def main(): # model # todo add doublet ratio - solo = SOLO.from_scvi_model(vae) + solo = SOLO.from_scvi_model(vae, doublet_ratio=args.doublet_ratio) solo.train(2000, lr=learning_rate, train_size=.9, @@ -199,10 +203,10 @@ def main(): callbacks=[]) solo.save(os.path.join(args.out_dir, 'classifier')) - logit_predictions = solo.predict() + logit_predictions = solo.predict(include_simulated_doublets=True) is_doublet_known = solo.adata.obs._solo_doub_sim == 'doublet' - is_doublet_pred = np.argmin(logit_predictions, axis=1) + is_doublet_pred = logit_predictions.idxmin(axis=1) == "singlet" validation_is_doublet_known = is_doublet_known[solo.validation_indices] validation_is_doublet_pred = is_doublet_pred[solo.validation_indices] @@ -226,13 +230,14 @@ def main(): # write predictions # softmax predictions softmax_predictions = softmax(logit_predictions, axis=1) - doublet_score = softmax_predictions[:, 0] + doublet_score = softmax_predictions.loc[:, 'doublet'] + np.save(os.path.join(args.out_dir, 'no_updates_softmax_scores.npy'), doublet_score[:num_cells]) np.savetxt(os.path.join(args.out_dir, 'no_updates_softmax_scores.csv'), doublet_score[:num_cells], delimiter=",") np.save(os.path.join(args.out_dir, 'no_updates_softmax_scores_sim.npy'), doublet_score[num_cells:]) # logit predictions - logit_doublet_score = logit_predictions[:, 0] + logit_doublet_score = logit_predictions.loc[:, 'doublet'] np.save(os.path.join(args.out_dir, 'logit_scores.npy'), logit_doublet_score[:num_cells]) np.savetxt(os.path.join(args.out_dir, 'logit_scores.csv'), logit_doublet_score[:num_cells], delimiter=",") np.save(os.path.join(args.out_dir, 'logit_scores_sim.npy'), logit_doublet_score[num_cells:]) @@ -247,18 +252,19 @@ def main(): solo_scores = doublet_score[:num_cells] logit_scores = logit_doublet_score[:num_cells] d_s = (args.doublet_ratio / (args.doublet_ratio + 1)) - while (diff > .01) | (counter_update < 5): + if args.recalibrate_scores: + while (diff > .01) | (counter_update < 5): - # calculate log odds calibration for logits - d_o = np.mean(solo_scores) - c = np.log(d_o/(1-d_o)) - np.log(d_s/(1-d_s)) + # calculate log odds calibration for logits + d_o = np.mean(solo_scores) + c = np.log(d_o/(1-d_o)) - np.log(d_s/(1-d_s)) - # update solo scores - solo_scores = 1 / (1+np.exp(-(logit_scores + c))) + # update solo scores + solo_scores = 1 / (1+np.exp(-(logit_scores + c))) - # update while conditions - diff = np.abs(d_o - np.mean(solo_scores)) - counter_update += 1 + # update while conditions + diff = np.abs(d_o - np.mean(solo_scores)) + counter_update += 1 np.save(os.path.join(args.out_dir, 'softmax_scores.npy'), solo_scores) @@ -290,9 +296,9 @@ def main(): np.save(os.path.join(args.out_dir, 'smoothed_preds.npy'), smoothed_preds) if args.anndata_output and data_ext == '.h5ad': - scvi_data.obs['is_doublet'] = is_solo_doublet[:num_cells] - scvi_data.obs['logit_scores'] = logit_doublet_score[:num_cells] - scvi_data.obs['softmax_scores'] = solo_scores[:num_cells] + scvi_data.obs['is_doublet'] = is_solo_doublet[:num_cells].values.astype(bool) + scvi_data.obs['logit_scores'] = logit_doublet_score[:num_cells].values.astype(float) + scvi_data.obs['softmax_scores'] = solo_scores[:num_cells].values.astype(float) scvi_data.write(os.path.join(args.out_dir, "soloed.h5ad")) if args.plot: @@ -353,8 +359,6 @@ def main(): ax.set_xlabel("UMAP 1") ax.set_ylabel("UMAP 2") - ax.set_xticks([], []) - ax.set_yticks([], []) fig.savefig(os.path.join(args.out_dir, 'umap_solo_scores.pdf')) ############################################################################### From 595a2ba3f1fcf01f0c61d87a4cc5aa6ca4a33cf8 Mon Sep 17 00:00:00 2001 From: nick Date: Tue, 8 Jun 2021 11:06:14 -0700 Subject: [PATCH 13/15] performance check --- solo/solo.py | 2 +- testdata/kidney_performance_tracking.png | Bin 46682 -> 49485 bytes testdata/pbmc_performance_tracking.png | Bin 41715 -> 44377 bytes testdata/tracking_performance.csv | 12 ++++++++++++ 4 files changed, 13 insertions(+), 1 deletion(-) diff --git a/solo/solo.py b/solo/solo.py index e1d0162..773e769 100755 --- a/solo/solo.py +++ b/solo/solo.py @@ -167,7 +167,7 @@ def main(): 'lr': 1e-2, 'lr_patience': 10, 'lr_threshold': 0, - 'lr_min': 1e-5, + 'lr_min': 1e-4, 'lr_scheduler_metric': 'reconstruction_loss_validation'} vae.train(max_epochs=2000, diff --git a/testdata/kidney_performance_tracking.png b/testdata/kidney_performance_tracking.png index ed1dab3c4c222d33a0b39bedafcdd4cb58db75af..32cd60961830febc7deca592b5e8693a28167e63 100644 GIT binary patch literal 49485 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 literal 46682 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