pertpy 0.6.0__py3-none-any.whl → 0.7.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. pertpy/__init__.py +3 -2
  2. pertpy/data/__init__.py +5 -1
  3. pertpy/data/_dataloader.py +2 -4
  4. pertpy/data/_datasets.py +203 -92
  5. pertpy/metadata/__init__.py +4 -0
  6. pertpy/metadata/_cell_line.py +826 -0
  7. pertpy/metadata/_compound.py +129 -0
  8. pertpy/metadata/_drug.py +242 -0
  9. pertpy/metadata/_look_up.py +582 -0
  10. pertpy/metadata/_metadata.py +73 -0
  11. pertpy/metadata/_moa.py +129 -0
  12. pertpy/plot/__init__.py +1 -9
  13. pertpy/plot/_augur.py +53 -116
  14. pertpy/plot/_coda.py +277 -677
  15. pertpy/plot/_guide_rna.py +17 -35
  16. pertpy/plot/_milopy.py +59 -134
  17. pertpy/plot/_mixscape.py +152 -391
  18. pertpy/preprocessing/_guide_rna.py +88 -4
  19. pertpy/tools/__init__.py +8 -13
  20. pertpy/tools/_augur.py +315 -17
  21. pertpy/tools/_cinemaot.py +143 -4
  22. pertpy/tools/_coda/_base_coda.py +1210 -65
  23. pertpy/tools/_coda/_sccoda.py +50 -21
  24. pertpy/tools/_coda/_tasccoda.py +27 -19
  25. pertpy/tools/_dialogue.py +164 -56
  26. pertpy/tools/_differential_gene_expression.py +240 -14
  27. pertpy/tools/_distances/_distance_tests.py +8 -8
  28. pertpy/tools/_distances/_distances.py +184 -34
  29. pertpy/tools/_enrichment.py +465 -0
  30. pertpy/tools/_milo.py +345 -11
  31. pertpy/tools/_mixscape.py +668 -50
  32. pertpy/tools/_perturbation_space/_clustering.py +5 -1
  33. pertpy/tools/_perturbation_space/_discriminator_classifiers.py +526 -0
  34. pertpy/tools/_perturbation_space/_perturbation_space.py +135 -43
  35. pertpy/tools/_perturbation_space/_simple.py +51 -10
  36. pertpy/tools/_scgen/__init__.py +1 -1
  37. pertpy/tools/_scgen/_scgen.py +701 -0
  38. pertpy/tools/_scgen/_utils.py +1 -3
  39. pertpy/tools/decoupler_LICENSE +674 -0
  40. {pertpy-0.6.0.dist-info → pertpy-0.7.0.dist-info}/METADATA +31 -12
  41. pertpy-0.7.0.dist-info/RECORD +53 -0
  42. {pertpy-0.6.0.dist-info → pertpy-0.7.0.dist-info}/WHEEL +1 -1
  43. pertpy/plot/_cinemaot.py +0 -81
  44. pertpy/plot/_dialogue.py +0 -91
  45. pertpy/plot/_scgen.py +0 -337
  46. pertpy/tools/_metadata/__init__.py +0 -0
  47. pertpy/tools/_metadata/_cell_line.py +0 -613
  48. pertpy/tools/_metadata/_look_up.py +0 -342
  49. pertpy/tools/_perturbation_space/_discriminator_classifier.py +0 -381
  50. pertpy/tools/_scgen/_jax_scgen.py +0 -370
  51. pertpy-0.6.0.dist-info/RECORD +0 -50
  52. /pertpy/tools/_scgen/{_jax_scgenvae.py → _scgenvae.py} +0 -0
  53. {pertpy-0.6.0.dist-info → pertpy-0.7.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,370 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from typing import TYPE_CHECKING, Any
4
-
5
- import jax.numpy as jnp
6
- import numpy as np
7
- from anndata import AnnData
8
- from jax import Array
9
- from scvi import REGISTRY_KEYS
10
- from scvi.data import AnnDataManager
11
- from scvi.data.fields import CategoricalObsField, LayerField
12
- from scvi.model.base import BaseModelClass, JaxTrainingMixin
13
- from scvi.utils import setup_anndata_dsp
14
-
15
- from ._jax_scgenvae import JaxSCGENVAE
16
- from ._utils import balancer, extractor
17
-
18
- if TYPE_CHECKING:
19
- from collections.abc import Sequence
20
-
21
- font = {"family": "Arial", "size": 14}
22
-
23
-
24
- class SCGEN(JaxTrainingMixin, BaseModelClass):
25
- """Jax Implementation of scGen model for batch removal and perturbation prediction."""
26
-
27
- def __init__(
28
- self,
29
- adata: AnnData,
30
- n_hidden: int = 800,
31
- n_latent: int = 100,
32
- n_layers: int = 2,
33
- dropout_rate: float = 0.2,
34
- **model_kwargs,
35
- ):
36
- super().__init__(adata)
37
-
38
- self.module = JaxSCGENVAE(
39
- n_input=self.summary_stats.n_vars,
40
- n_hidden=n_hidden,
41
- n_latent=n_latent,
42
- n_layers=n_layers,
43
- dropout_rate=dropout_rate,
44
- **model_kwargs,
45
- )
46
- self._model_summary_string = (
47
- "SCGEN Model with the following params: \nn_hidden: {}, n_latent: {}, n_layers: {}, dropout_rate: " "{}"
48
- ).format(
49
- n_hidden,
50
- n_latent,
51
- n_layers,
52
- dropout_rate,
53
- )
54
- self.init_params_ = self._get_init_params(locals())
55
-
56
- def predict(
57
- self,
58
- ctrl_key=None,
59
- stim_key=None,
60
- adata_to_predict=None,
61
- celltype_to_predict=None,
62
- restrict_arithmetic_to="all",
63
- ) -> tuple[AnnData, Any]:
64
- """Predicts the cell type provided by the user in stimulated condition.
65
-
66
- Args:
67
- ctrl_key: Key for `control` part of the `data` found in `condition_key`.
68
- stim_key: Key for `stimulated` part of the `data` found in `condition_key`.
69
- adata_to_predict: Adata for unperturbed cells you want to be predicted.
70
- celltype_to_predict: The cell type you want to be predicted.
71
- restrict_arithmetic_to: Dictionary of celltypes you want to be observed for prediction.
72
-
73
- Returns:
74
- `np nd-array` of predicted cells in primary space.
75
- delta: float
76
- Difference between stimulated and control cells in latent space
77
-
78
- Examples:
79
- >>> import pertpy as pt
80
- >>> data = pt.dt.kang_2018()
81
- >>> pt.tl.SCGEN.setup_anndata(data, batch_key="label", labels_key="cell_type")
82
- >>> model = pt.tl.SCGEN(data)
83
- >>> model.train(max_epochs=10, batch_size=64, early_stopping=True, early_stopping_patience=5)
84
- >>> pred, delta = model.predict(ctrl_key='ctrl', stim_key='stim', celltype_to_predict='CD4 T cells')
85
- """
86
- # use keys registered from `setup_anndata()`
87
- cell_type_key = self.adata_manager.get_state_registry(REGISTRY_KEYS.LABELS_KEY).original_key
88
- condition_key = self.adata_manager.get_state_registry(REGISTRY_KEYS.BATCH_KEY).original_key
89
-
90
- if restrict_arithmetic_to == "all":
91
- ctrl_x = self.adata[self.adata.obs[condition_key] == ctrl_key, :]
92
- stim_x = self.adata[self.adata.obs[condition_key] == stim_key, :]
93
- ctrl_x = balancer(ctrl_x, cell_type_key)
94
- stim_x = balancer(stim_x, cell_type_key)
95
- else:
96
- key = list(restrict_arithmetic_to.keys())[0]
97
- values = restrict_arithmetic_to[key]
98
- subset = self.adata[self.adata.obs[key].isin(values)]
99
- ctrl_x = subset[subset.obs[condition_key] == ctrl_key, :]
100
- stim_x = subset[subset.obs[condition_key] == stim_key, :]
101
- if len(values) > 1:
102
- ctrl_x = balancer(ctrl_x, cell_type_key)
103
- stim_x = balancer(stim_x, cell_type_key)
104
- if celltype_to_predict is not None and adata_to_predict is not None:
105
- raise Exception("Please provide either a cell type or adata not both!")
106
- if celltype_to_predict is None and adata_to_predict is None:
107
- raise Exception("Please provide a cell type name or adata for your unperturbed cells")
108
- if celltype_to_predict is not None:
109
- ctrl_pred = extractor(
110
- self.adata,
111
- celltype_to_predict,
112
- condition_key,
113
- cell_type_key,
114
- ctrl_key,
115
- stim_key,
116
- )[1]
117
- else:
118
- ctrl_pred = adata_to_predict
119
-
120
- eq = min(ctrl_x.X.shape[0], stim_x.X.shape[0])
121
- rng = np.random.default_rng()
122
- cd_ind = rng.choice(range(ctrl_x.shape[0]), size=eq, replace=False)
123
- stim_ind = rng.choice(range(stim_x.shape[0]), size=eq, replace=False)
124
- ctrl_adata = ctrl_x[cd_ind, :]
125
- stim_adata = stim_x[stim_ind, :]
126
-
127
- latent_ctrl = self._avg_vector(ctrl_adata)
128
- latent_stim = self._avg_vector(stim_adata)
129
-
130
- delta = latent_stim - latent_ctrl
131
-
132
- latent_cd = self.get_latent_representation(ctrl_pred)
133
-
134
- stim_pred = delta + latent_cd
135
- predicted_cells = self.module.as_bound().generative(stim_pred)["px"]
136
-
137
- predicted_adata = AnnData(
138
- X=np.array(predicted_cells),
139
- obs=ctrl_pred.obs.copy(),
140
- var=ctrl_pred.var.copy(),
141
- obsm=ctrl_pred.obsm.copy(),
142
- )
143
- return predicted_adata, delta
144
-
145
- def _avg_vector(self, adata):
146
- return np.mean(self.get_latent_representation(adata), axis=0)
147
-
148
- def get_decoded_expression(
149
- self,
150
- adata: AnnData | None = None,
151
- indices: Sequence[int] | None = None,
152
- batch_size: int | None = None,
153
- ) -> Array:
154
- """Get decoded expression.
155
-
156
- Args:
157
- adata: AnnData object with equivalent structure to initial AnnData. If `None`, defaults to the
158
- AnnData object used to initialize the model.
159
- indices: Indices of cells in adata to use. If `None`, all cells are used.
160
- batch_size: Minibatch size for data loading into model. Defaults to `scvi.settings.batch_size`.
161
-
162
- Returns:
163
- Decoded expression for each cell
164
-
165
- Examples:
166
- >>> import pertpy as pt
167
- >>> data = pt.dt.kang_2018()
168
- >>> pt.tl.SCGEN.setup_anndata(data, batch_key="label", labels_key="cell_type")
169
- >>> model = pt.tl.SCGEN(data)
170
- >>> model.train(max_epochs=10, batch_size=64, early_stopping=True, early_stopping_patience=5)
171
- >>> decoded_X = model.get_decoded_expression()
172
- """
173
- if self.is_trained_ is False:
174
- raise RuntimeError("Please train the model first.")
175
-
176
- adata = self._validate_anndata(adata)
177
- scdl = self._make_data_loader(adata=adata, indices=indices, batch_size=batch_size)
178
- decoded = []
179
- for tensors in scdl:
180
- _, generative_outputs = self.module.as_bound()(tensors, compute_loss=False)
181
- px = generative_outputs["px"]
182
- decoded.append(px)
183
-
184
- return jnp.concatenate(decoded)
185
-
186
- def batch_removal(self, adata: AnnData | None = None) -> AnnData:
187
- """Removes batch effects.
188
-
189
- Args:
190
- adata: AnnData object with equivalent structure to initial AnnData. If `None`, defaults to the
191
- AnnData object used to initialize the model. Must have been setup with `batch_key` and `labels_key`,
192
- corresponding to batch and cell type metadata, respectively.
193
-
194
- Returns:
195
- corrected: `~anndata.AnnData`
196
- AnnData of corrected gene expression in adata.X and corrected latent space in adata.obsm["latent"].
197
- A reference to the original AnnData is in `corrected.raw` if the input adata had no `raw` attribute.
198
-
199
- Examples:
200
- >>> import pertpy as pt
201
- >>> data = pt.dt.kang_2018()
202
- >>> pt.tl.SCGEN.setup_anndata(data, batch_key="label", labels_key="cell_type")
203
- >>> model = pt.tl.SCGEN(data)
204
- >>> model.train(max_epochs=10, batch_size=64, early_stopping=True, early_stopping_patience=5)
205
- >>> corrected_adata = model.batch_removal()
206
- """
207
- adata = self._validate_anndata(adata)
208
- latent_all = self.get_latent_representation(adata)
209
- # use keys registered from `setup_anndata()`
210
- cell_label_key = self.adata_manager.get_state_registry(REGISTRY_KEYS.LABELS_KEY).original_key
211
- batch_key = self.adata_manager.get_state_registry(REGISTRY_KEYS.BATCH_KEY).original_key
212
-
213
- adata_latent = AnnData(latent_all)
214
- adata_latent.obs = adata.obs.copy(deep=True)
215
- unique_cell_types = np.unique(adata_latent.obs[cell_label_key])
216
- shared_ct = []
217
- not_shared_ct = []
218
- for cell_type in unique_cell_types:
219
- temp_cell = adata_latent[adata_latent.obs[cell_label_key] == cell_type].copy()
220
- if len(np.unique(temp_cell.obs[batch_key])) < 2:
221
- cell_type_ann = adata_latent[adata_latent.obs[cell_label_key] == cell_type]
222
- not_shared_ct.append(cell_type_ann)
223
- continue
224
- temp_cell = adata_latent[adata_latent.obs[cell_label_key] == cell_type].copy()
225
- batch_list = {}
226
- batch_ind = {}
227
- max_batch = 0
228
- max_batch_ind = ""
229
- batches = np.unique(temp_cell.obs[batch_key])
230
- for i in batches:
231
- temp = temp_cell[temp_cell.obs[batch_key] == i]
232
- temp_ind = temp_cell.obs[batch_key] == i
233
- if max_batch < len(temp):
234
- max_batch = len(temp)
235
- max_batch_ind = i
236
- batch_list[i] = temp
237
- batch_ind[i] = temp_ind
238
- max_batch_ann = batch_list[max_batch_ind]
239
- for study in batch_list:
240
- delta = np.average(max_batch_ann.X, axis=0) - np.average(batch_list[study].X, axis=0)
241
- batch_list[study].X = delta + batch_list[study].X
242
- temp_cell[batch_ind[study]].X = batch_list[study].X
243
- shared_ct.append(temp_cell)
244
-
245
- all_shared_ann = AnnData.concatenate(*shared_ct, batch_key="concat_batch", index_unique=None)
246
- if "concat_batch" in all_shared_ann.obs.columns:
247
- del all_shared_ann.obs["concat_batch"]
248
- if len(not_shared_ct) < 1:
249
- corrected = AnnData(
250
- np.array(self.module.as_bound().generative(all_shared_ann.X)["px"]),
251
- obs=all_shared_ann.obs,
252
- )
253
- corrected.var_names = adata.var_names.tolist()
254
- corrected = corrected[adata.obs_names]
255
- if adata.raw is not None:
256
- adata_raw = AnnData(X=adata.raw.X, var=adata.raw.var)
257
- adata_raw.obs_names = adata.obs_names
258
- corrected.raw = adata_raw
259
- corrected.obsm["latent"] = all_shared_ann.X
260
- corrected.obsm["corrected_latent"] = self.get_latent_representation(corrected)
261
- return corrected
262
- else:
263
- all_not_shared_ann = AnnData.concatenate(*not_shared_ct, batch_key="concat_batch", index_unique=None)
264
- all_corrected_data = AnnData.concatenate(
265
- all_shared_ann,
266
- all_not_shared_ann,
267
- batch_key="concat_batch",
268
- index_unique=None,
269
- )
270
- if "concat_batch" in all_shared_ann.obs.columns:
271
- del all_corrected_data.obs["concat_batch"]
272
- corrected = AnnData(
273
- np.array(self.module.as_bound().generative(all_corrected_data.X)["px"]),
274
- obs=all_corrected_data.obs,
275
- )
276
- corrected.var_names = adata.var_names.tolist()
277
- corrected = corrected[adata.obs_names]
278
- if adata.raw is not None:
279
- adata_raw = AnnData(X=adata.raw.X, var=adata.raw.var)
280
- adata_raw.obs_names = adata.obs_names
281
- corrected.raw = adata_raw
282
- corrected.obsm["latent"] = all_corrected_data.X
283
- corrected.obsm["corrected_latent"] = self.get_latent_representation(corrected)
284
-
285
- return corrected
286
-
287
- @classmethod
288
- @setup_anndata_dsp.dedent
289
- def setup_anndata(
290
- cls,
291
- adata: AnnData,
292
- batch_key: str | None = None,
293
- labels_key: str | None = None,
294
- **kwargs,
295
- ):
296
- """%(summary)s.
297
-
298
- scGen expects the expression data to come from `adata.X`
299
-
300
- %(param_batch_key)s
301
- %(param_labels_key)s
302
-
303
- Examples:
304
- >>> import pertpy as pt
305
- >>> data = pt.dt.kang_2018()
306
- >>> pt.tl.SCGEN.setup_anndata(data, batch_key="label", labels_key="cell_type")
307
- """
308
- setup_method_args = cls._get_setup_method_args(**locals())
309
- anndata_fields = [
310
- LayerField(REGISTRY_KEYS.X_KEY, None, is_count_data=False),
311
- CategoricalObsField(REGISTRY_KEYS.BATCH_KEY, batch_key),
312
- CategoricalObsField(REGISTRY_KEYS.LABELS_KEY, labels_key),
313
- ]
314
- adata_manager = AnnDataManager(fields=anndata_fields, setup_method_args=setup_method_args)
315
- adata_manager.register_fields(adata, **kwargs)
316
- cls.register_manager(adata_manager)
317
-
318
- def to_device(self, device):
319
- pass
320
-
321
- @property
322
- def device(self):
323
- return self.module.device
324
-
325
- def get_latent_representation(
326
- self,
327
- adata: AnnData | None = None,
328
- indices: Sequence[int] | None = None,
329
- give_mean: bool = True,
330
- n_samples: int = 1,
331
- batch_size: int | None = None,
332
- ) -> np.ndarray:
333
- """Return the latent representation for each cell.
334
-
335
- Args:
336
- adata: AnnData object with equivalent structure to initial AnnData. If `None`, defaults to the
337
- AnnData object used to initialize the model.
338
- indices: Indices of cells in adata to use. If `None`, all cells are used.
339
- batch_size: Minibatch size for data loading into model. Defaults to `scvi.settings.batch_size`.
340
-
341
- Returns:
342
- Low-dimensional representation for each cell
343
-
344
- Examples:
345
- >>> import pertpy as pt
346
- >>> data = pt.dt.kang_2018()
347
- >>> pt.tl.SCGEN.setup_anndata(data, batch_key="label", labels_key="cell_type")
348
- >>> model = pt.tl.SCGEN(data)
349
- >>> model.train(max_epochs=10, batch_size=64, early_stopping=True, early_stopping_patience=5)
350
- >>> latent_X = model.get_latent_representation()
351
- """
352
- self._check_if_trained(warn=False)
353
-
354
- adata = self._validate_anndata(adata)
355
- scdl = self._make_data_loader(adata=adata, indices=indices, batch_size=batch_size, iter_ndarray=True)
356
-
357
- jit_inference_fn = self.module.get_jit_inference_fn(inference_kwargs={"n_samples": n_samples})
358
-
359
- latent = []
360
- for array_dict in scdl:
361
- out = jit_inference_fn(self.module.rngs, array_dict)
362
- if give_mean:
363
- z = out["qz"].mean
364
- else:
365
- z = out["z"]
366
- latent.append(z)
367
- concat_axis = 0 if ((n_samples == 1) or give_mean) else 1
368
- latent = jnp.concatenate(latent, axis=concat_axis) # type: ignore
369
-
370
- return self.module.as_numpy_array(latent)
@@ -1,50 +0,0 @@
1
- pertpy/__init__.py,sha256=3__crpMVG7ky5lmD91Pq9qIGWgUuZQTH8xpiM5qcUJA,546
2
- pertpy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
- pertpy/data/__init__.py,sha256=dvFUk-vAVelA65esA4EbIAVEQoE3s9K6LmE31-j2fC0,1197
4
- pertpy/data/_dataloader.py,sha256=pNDXLSNzOLeFM_mqf9nNvN_6Y4uA4gJfG3Y7VS-03ko,2397
5
- pertpy/data/_datasets.py,sha256=q20-f7MT2neWTplN300QOBlu-ihWa8IRTKxUgLgemIw,59496
6
- pertpy/plot/__init__.py,sha256=HB6nEBfOPmOVRHOJsJ7IJcxx2j6-6oQ__sJRaszBKuk,455
7
- pertpy/plot/_augur.py,sha256=pRhgc1RdRhXp6xl7-y8Z4o8beUBfltJY3XUeN9GJKbs,9064
8
- pertpy/plot/_cinemaot.py,sha256=tPTab-5jqalGLfa1NNeevG3_ExbKRfnIE8RRnt8Eecc,3199
9
- pertpy/plot/_coda.py,sha256=Ma24jc5KhuY3dtIJ6xO-pp0JpW7vWc-TPhSKJMXBEmQ,43650
10
- pertpy/plot/_dialogue.py,sha256=TGv_fb5f1zPEaJA8SgCue77IJkHKsQLR8f8oIz9SEcE,3881
11
- pertpy/plot/_guide_rna.py,sha256=Z-_vjHcOIK-DXLDTZGl5HmG6A2TnJBHv9L8VK7L3_fA,3286
12
- pertpy/plot/_milopy.py,sha256=6K9DtmHiCh6FUb5xScUZTxXUZoRCwD0oyfAMu0SmRGA,10994
13
- pertpy/plot/_mixscape.py,sha256=KeLCqWRcn2092VqB94PqBtP_wxD_OY4uS8GcZ2RXc7Y,27903
14
- pertpy/plot/_scgen.py,sha256=KnPe8iOqDDZw0MpSxOU7Xr-2t1UtHKehYgBQ7_4O8d4,15125
15
- pertpy/preprocessing/__init__.py,sha256=uja9T469LLYQAGgrTyFa4MudXci6NXnAgOn97FHXcxA,40
16
- pertpy/preprocessing/_guide_rna.py,sha256=EYSrsMP7FpztS0NQhn1xg0oBZZ5RT5fz6YBFvmOab58,4247
17
- pertpy/tools/__init__.py,sha256=QiFFM1IL7K47vuTbQqjgB8rVzauWmn6JVVpQG9AikvA,1108
18
- pertpy/tools/_augur.py,sha256=EUe-aRGO-PzszTS8vMfUJtzpfC3CmUSorSJTkEEU60w,45193
19
- pertpy/tools/_cinemaot.py,sha256=bqbxc88AH4vo2--Y5yLH3anuu1prWDAxoRZaiNvOgtQ,33374
20
- pertpy/tools/_dialogue.py,sha256=OUSjPzTRi46WG5QARoj2_fpmr7IQ2ftTlXT3-OiiWJc,48116
21
- pertpy/tools/_differential_gene_expression.py,sha256=mR06huO71KRLcU32ktCWzL-XxA9IGz8OYiRZA26eH0E,3681
22
- pertpy/tools/_kernel_pca.py,sha256=3S1D_wrp4vlHUPiRbCAoRbUyY-rVs112Qh-BZHSmTxE,1578
23
- pertpy/tools/_milo.py,sha256=OyLztlNO4Jt1c2aN3WsBbcA0UKVXVvWAnTaKwjPwJ2I,30737
24
- pertpy/tools/_mixscape.py,sha256=l3YHeyaUUrtuP9P8L5Z7gH47lJpzb0glszMX84DyJBI,23559
25
- pertpy/tools/transferlearning_MMD_LICENSE,sha256=MUvDA-o_j9htRpI8fStVdCRuyLdPkQUuIH0a_EIc57w,1069
26
- pertpy/tools/_coda/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
- pertpy/tools/_coda/_base_coda.py,sha256=mxNe5PT1XvIlZmvjQg50kh_bSmeTGVzOC63XLw2TdiI,66859
28
- pertpy/tools/_coda/_sccoda.py,sha256=cxaqGsXxeLf4guTU1HApAzXN2maQPexsGXIJOlW8UTM,21616
29
- pertpy/tools/_coda/_tasccoda.py,sha256=q0I7zM_hGjPrpy5dF2Z9trw6u8OqdkrypGgeuAhi26k,30721
30
- pertpy/tools/_distances/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
- pertpy/tools/_distances/_distance_tests.py,sha256=zRcOeLc18mRnUJ-_usUdVxWn3cZqZ8gLhglt77SaF9k,13604
32
- pertpy/tools/_distances/_distances.py,sha256=RMNtCD1zkORDE35XWcrh_6mw1c03hOQflmXNfoNtSRA,29780
33
- pertpy/tools/_metadata/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
34
- pertpy/tools/_metadata/_cell_line.py,sha256=4sUULdmxQ3TFUZDCwikN9TcHG5hf2hzlEO6gOglGl-A,33830
35
- pertpy/tools/_metadata/_look_up.py,sha256=H7kp9MgfgYMVdxyg3Qpf3_QmqNUkKFNMsswWeA_e1rQ,18200
36
- pertpy/tools/_perturbation_space/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
- pertpy/tools/_perturbation_space/_clustering.py,sha256=ha0TfRKUIFJmL6LE-xIfENAlYyQf4nfTpgg47X_2pHA,3237
38
- pertpy/tools/_perturbation_space/_discriminator_classifier.py,sha256=hTEAKTnLH4ToSdEHYuJnwui3B8L-zlSR667oG3yb49M,13861
39
- pertpy/tools/_perturbation_space/_metrics.py,sha256=y8-baP8WRdB1iDgvP3uuQxSCDxA2lcxvEHHM2C_vWHY,3248
40
- pertpy/tools/_perturbation_space/_perturbation_space.py,sha256=_A96OFbpjZULcQGfbsDhXiBjvD0chBl6c-4FoQNoV3w,14169
41
- pertpy/tools/_perturbation_space/_simple.py,sha256=AZx8GaNJV67evSi5oUkY11QcUkq3EcL0mtkCipjcx6c,10367
42
- pertpy/tools/_scgen/__init__.py,sha256=bMQ_2QbB4nnzQ7TzhI4DEFfuCDUNbZkL5xDClhQjhcA,49
43
- pertpy/tools/_scgen/_base_components.py,sha256=dIw-_7Z8iCietPF4tnpM7bFHtDksjnaHXwUjp9GoCIQ,2936
44
- pertpy/tools/_scgen/_jax_scgen.py,sha256=6fmen3zQm54Yprmd3r7zJK3GIWqpMd034DLGmi-krrs,15368
45
- pertpy/tools/_scgen/_jax_scgenvae.py,sha256=v_6tZ4wY-JjdMH1QVd_wG4_N0PoaqB-FM8zC2JsDu1o,3935
46
- pertpy/tools/_scgen/_utils.py,sha256=_G9cxBVcTIOs4wN0pgtOSkCsPJoohkeRDIb_anUqSfY,2871
47
- pertpy-0.6.0.dist-info/METADATA,sha256=bmYUVV99CMPm870ehtSiTbB6lPsYg0kSrmK1aoCvuu8,5046
48
- pertpy-0.6.0.dist-info/WHEEL,sha256=9QBuHhg6FNW7lppboF2vKVbCGTVzsFykgRQjjlajrhA,87
49
- pertpy-0.6.0.dist-info/licenses/LICENSE,sha256=OZ-ZkXM5CmExJiEMM90b_7dGNNvRpj7kdE-49AnrLuI,1070
50
- pertpy-0.6.0.dist-info/RECORD,,
File without changes