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

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. pertpy/__init__.py +2 -1
  2. pertpy/data/__init__.py +61 -0
  3. pertpy/data/_dataloader.py +27 -23
  4. pertpy/data/_datasets.py +58 -0
  5. pertpy/metadata/__init__.py +2 -0
  6. pertpy/metadata/_cell_line.py +39 -70
  7. pertpy/metadata/_compound.py +3 -4
  8. pertpy/metadata/_drug.py +2 -6
  9. pertpy/metadata/_look_up.py +38 -51
  10. pertpy/metadata/_metadata.py +7 -10
  11. pertpy/metadata/_moa.py +2 -6
  12. pertpy/plot/__init__.py +0 -5
  13. pertpy/preprocessing/__init__.py +2 -0
  14. pertpy/preprocessing/_guide_rna.py +2 -3
  15. pertpy/tools/__init__.py +42 -4
  16. pertpy/tools/_augur.py +14 -15
  17. pertpy/tools/_cinemaot.py +2 -2
  18. pertpy/tools/_coda/_base_coda.py +118 -142
  19. pertpy/tools/_coda/_sccoda.py +16 -15
  20. pertpy/tools/_coda/_tasccoda.py +21 -22
  21. pertpy/tools/_dialogue.py +18 -23
  22. pertpy/tools/_differential_gene_expression/__init__.py +20 -0
  23. pertpy/tools/_differential_gene_expression/_base.py +657 -0
  24. pertpy/tools/_differential_gene_expression/_checks.py +41 -0
  25. pertpy/tools/_differential_gene_expression/_dge_comparison.py +86 -0
  26. pertpy/tools/_differential_gene_expression/_edger.py +125 -0
  27. pertpy/tools/_differential_gene_expression/_formulaic.py +189 -0
  28. pertpy/tools/_differential_gene_expression/_pydeseq2.py +95 -0
  29. pertpy/tools/_differential_gene_expression/_simple_tests.py +162 -0
  30. pertpy/tools/_differential_gene_expression/_statsmodels.py +72 -0
  31. pertpy/tools/_distances/_distance_tests.py +21 -16
  32. pertpy/tools/_distances/_distances.py +406 -70
  33. pertpy/tools/_enrichment.py +10 -15
  34. pertpy/tools/_kernel_pca.py +1 -1
  35. pertpy/tools/_milo.py +76 -53
  36. pertpy/tools/_mixscape.py +15 -11
  37. pertpy/tools/_perturbation_space/_clustering.py +5 -2
  38. pertpy/tools/_perturbation_space/_comparison.py +112 -0
  39. pertpy/tools/_perturbation_space/_discriminator_classifiers.py +20 -22
  40. pertpy/tools/_perturbation_space/_perturbation_space.py +23 -21
  41. pertpy/tools/_perturbation_space/_simple.py +3 -3
  42. pertpy/tools/_scgen/__init__.py +1 -1
  43. pertpy/tools/_scgen/_base_components.py +2 -3
  44. pertpy/tools/_scgen/_scgen.py +33 -28
  45. pertpy/tools/_scgen/_utils.py +2 -2
  46. {pertpy-0.7.0.dist-info → pertpy-0.8.0.dist-info}/METADATA +22 -13
  47. pertpy-0.8.0.dist-info/RECORD +57 -0
  48. {pertpy-0.7.0.dist-info → pertpy-0.8.0.dist-info}/WHEEL +1 -1
  49. pertpy/plot/_augur.py +0 -171
  50. pertpy/plot/_coda.py +0 -601
  51. pertpy/plot/_guide_rna.py +0 -64
  52. pertpy/plot/_milopy.py +0 -209
  53. pertpy/plot/_mixscape.py +0 -355
  54. pertpy/tools/_differential_gene_expression.py +0 -325
  55. pertpy-0.7.0.dist-info/RECORD +0 -53
  56. {pertpy-0.7.0.dist-info → pertpy-0.8.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,325 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from typing import TYPE_CHECKING, Literal
4
-
5
- import decoupler as dc
6
- import numpy as np
7
- import numpy.typing as npt
8
- import pandas as pd
9
- from scipy.stats import kendalltau, pearsonr, spearmanr
10
- from statsmodels.stats.multitest import fdrcorrection
11
-
12
- if TYPE_CHECKING:
13
- from anndata import AnnData
14
-
15
-
16
- class DifferentialGeneExpression:
17
- """Support for differential gene expression for scverse."""
18
-
19
- def get_pseudobulk(
20
- self,
21
- adata: AnnData,
22
- sample_col: str,
23
- groups_col: str,
24
- obs: pd.DataFrame = None,
25
- layer: str = None,
26
- use_raw: bool = False,
27
- mode: str = "sum",
28
- min_cells=10,
29
- min_counts: int = 1000,
30
- dtype: npt.DTypeLike = np.float32,
31
- skip_checks: bool = False,
32
- ) -> AnnData:
33
- """Summarizes expression profiles across cells per sample and group.
34
-
35
- Generates summarized expression profiles across cells per sample (e.g. sample id) and group (e.g. cell type) based on the metadata found in .obs.
36
- To ensure a minimum quality control, this function removes genes that are not expressed enough across cells (min_prop) or samples (min_smpls),
37
- and samples with not enough cells (min_cells) or gene counts (min_counts).
38
-
39
- By default this function expects raw integer counts as input and sums them per sample and group (mode='sum'), but other modes are available.
40
-
41
- This function produces some quality control metrics to assess if is necessary to filter some samples.
42
- The number of cells that belong to each sample is stored in `.obs['psbulk_n_cells']`,
43
- the total sum of counts per sample in .obs['psbulk_counts'], and the proportion of cells that express a given gene in `.layers[‘psbulk_props’]`.
44
-
45
- Wraps decoupler's `get_pseudobulk` function.
46
- See: https://decoupler-py.readthedocs.io/en/latest/generated/decoupler.get_pseudobulk.html#decoupler.get_pseudobulk
47
- for more details.
48
-
49
- Args:
50
- adata: Input AnnData object.
51
- sample_col: Column of obs where to extract the samples names.
52
- groups_col: Column of obs where to extract the groups names.
53
- obs: If provided, metadata DataFrame.
54
- layer: If provided, which layer to use.
55
- use_raw: Use raw attribute of the AnnData object if present.
56
- mode: How to perform the pseudobulk.
57
- Available options are 'sum', 'mean' or 'median'. Also accepts callback functions to perform custom aggregations.
58
- Additionally, it is also possible to provide a dictionary of different callback functions, each one stored in a different resulting `.layer`.
59
- In this case, the result of the first callback function of the dictionary is stored in .X by default.
60
- min_cells: Filter to remove samples by a minimum number of cells in a sample-group pair.
61
- min_counts: Filter to remove samples by a minimum number of summed counts in a sample-group pair.
62
- dtype: Type of float used.
63
- skip_checks: Whether to skip input checks.
64
- Set to True when working with positive and negative data, or when counts are not integers.
65
-
66
- Returns:
67
- Returns new AnnData object with unormalized pseudobulk profiles per sample and group.
68
- """
69
- pseudobulk_adata = dc.get_pseudobulk(
70
- adata,
71
- sample_col=sample_col,
72
- groups_col=groups_col,
73
- obs=obs,
74
- layer=layer,
75
- use_raw=use_raw,
76
- mode=mode,
77
- min_counts=min_counts,
78
- dtype=dtype,
79
- min_cells=min_cells,
80
- skip_checks=skip_checks,
81
- )
82
-
83
- return pseudobulk_adata
84
-
85
- def filter_by_expr(
86
- self,
87
- adata: AnnData,
88
- obs: pd.DataFrame = None,
89
- group: str | None = None,
90
- lib_size: int | float | None = None,
91
- min_count: int = 10,
92
- min_total_count: int = 15,
93
- large_n: int = 10,
94
- min_prop: float = 0.7,
95
- ) -> AnnData:
96
- """Filter AnnData by which genes have sufficiently large counts to be retained in a statistical analysis.
97
-
98
- Wraps decoupler's `filter_by_expr` function.
99
- See https://decoupler-py.readthedocs.io/en/latest/generated/decoupler.filter_by_expr.html#decoupler.filter_by_expr
100
- for more details.
101
-
102
- Args:
103
- adata: AnnData obtained after running `get_pseudobulk`.
104
- obs: Metadata dataframe, only needed if `adata` is not an `AnnData`.
105
- group: Name of the `.obs` column to group by. If None, assumes all samples belong to one group.
106
- lib_size: Library size. Defaults to the sum of reads per sample if None.
107
- min_count: Minimum count required per gene for at least some samples.
108
- min_total_count: Minimum total count required per gene across all samples.
109
- large_n: Number of samples per group considered to be "large".
110
- min_prop: Minimum proportion of samples in the smallest group that express the gene.
111
-
112
- Returns:
113
- AnnData with only the genes that are to be kept.
114
- """
115
- genes = dc.filter_by_expr(
116
- adata=adata,
117
- obs=obs,
118
- group=group,
119
- lib_size=lib_size,
120
- min_count=min_count,
121
- min_total_count=min_total_count,
122
- large_n=large_n,
123
- min_prop=min_prop,
124
- )
125
- filtered_adata = adata[:, genes].copy()
126
-
127
- return filtered_adata
128
-
129
- def filter_by_prop(self, adata: AnnData, min_prop: float = 0.2, min_samples: int = 2) -> AnnData:
130
- """Determine which genes are expressed in a sufficient proportion of cells across samples.
131
-
132
- This function selects genes that are sufficiently expressed across cells in each sample and that this condition
133
- is met across a minimum number of samples.
134
-
135
- Args:
136
- adata: AnnData obtained after running `get_pseudobulk`. It requieres `.layer['psbulk_props']`.
137
- min_prop: Minimum proportion of cells that express a gene in a sample.
138
- min_samples: Minimum number of samples with bigger or equal proportion of cells with expression than `min_prop`.
139
-
140
- Returns:
141
- AnnData with only the genes that are to be kept.
142
- """
143
- genes = dc.filter_by_prop(adata=adata, min_prop=min_prop, min_smpls=min_samples)
144
- filtered_adata = adata[:, genes].copy()
145
-
146
- return filtered_adata
147
-
148
- def calculate_correlation(
149
- self,
150
- de_res_1: pd.DataFrame,
151
- de_res_2: pd.DataFrame,
152
- method: Literal["spearman", "pearson", "kendall-tau"] = "spearman",
153
- ) -> pd.DataFrame:
154
- """Calculate the Spearman correlation coefficient for 'pvals_adj' and 'logfoldchanges' columns.
155
-
156
- Args:
157
- de_res_1: A DataFrame with DE result columns.
158
- de_res_2: Another DataFrame with the same DE result columns.
159
- method: The correlation method to apply. One of `spearman`, `pearson`, `kendall-tau`.
160
- Defaults to `spearman`.
161
-
162
- Returns:
163
- A DataFrame with the Spearman correlation coefficients for 'pvals_adj' and 'logfoldchanges'.
164
- """
165
- columns_of_interest = ["pvals_adj", "logfoldchanges"]
166
- correlation_data = {}
167
- for col in columns_of_interest:
168
- match method:
169
- case "spearman":
170
- correlation, _ = spearmanr(de_res_1[col], de_res_2[col])
171
- case "pearson":
172
- correlation, _ = pearsonr(de_res_1[col], de_res_2[col])
173
- case "kendall-tau":
174
- correlation, _ = kendalltau(de_res_1[col], de_res_2[col])
175
- case _:
176
- raise ValueError("Unknown correlation method.")
177
- correlation_data[col] = correlation
178
-
179
- return pd.DataFrame([correlation_data], columns=columns_of_interest)
180
-
181
- def calculate_jaccard_index(self, de_res_1: pd.DataFrame, de_res_2: pd.DataFrame, threshold: float = 0.05) -> float:
182
- """Calculate the Jaccard index for sets of significantly expressed genes/features based on a p-value threshold.
183
-
184
- Args:
185
- de_res_1: A DataFrame with DE result columns, including 'pvals'.
186
- de_res_2: Another DataFrame with the same DE result columns.
187
- threshold: A threshold for determining significant expression (default is 0.05).
188
-
189
- Returns:
190
- The Jaccard index.
191
- """
192
- significant_set_1 = set(de_res_1[de_res_1["pvals"] <= threshold].index)
193
- significant_set_2 = set(de_res_2[de_res_2["pvals"] <= threshold].index)
194
-
195
- intersection = significant_set_1.intersection(significant_set_2)
196
- union = significant_set_1.union(significant_set_2)
197
-
198
- return len(intersection) / len(union) if union else 0
199
-
200
- def calculate_cohens_d(self, de_res_1: pd.DataFrame, de_res_2: pd.DataFrame) -> pd.Series:
201
- """Calculate Cohen's D for the logfoldchanges.
202
-
203
- Args:
204
- de_res_1: A DataFrame with DE result columns, including 'logfoldchanges'.
205
- de_res_2: Another DataFrame with the same DE result columns.
206
-
207
- Returns:
208
- A pandas Series containing Cohen's D for each gene/feature.
209
- """
210
- means_1 = de_res_1["logfoldchanges"].mean()
211
- means_2 = de_res_2["logfoldchanges"].mean()
212
- sd_1 = de_res_1["logfoldchanges"].std()
213
- sd_2 = de_res_2["logfoldchanges"].std()
214
-
215
- pooled_sd = np.sqrt((sd_1**2 + sd_2**2) / 2)
216
- cohens_d = (means_1 - means_2) / pooled_sd
217
-
218
- return cohens_d
219
-
220
- def de_res_to_anndata(
221
- self,
222
- adata: AnnData,
223
- de_res: pd.DataFrame,
224
- *,
225
- groupby: str,
226
- gene_id_col: str = "gene_symbols",
227
- score_col: str = "scores",
228
- pval_col: str = "pvals",
229
- pval_adj_col: str | None = "pvals_adj",
230
- lfc_col: str = "logfoldchanges",
231
- key_added: str = "rank_genes_groups",
232
- ) -> None:
233
- """Add tabular differential expression result to AnnData as if it was produced by `scanpy.tl.rank_genes_groups`.
234
-
235
- Args:
236
- adata:
237
- Annotated data matrix
238
- de_res:
239
- Tablular de result
240
- groupby:
241
- Column in `de_res` that indicates the group. This column must also exist in `adata.obs`.
242
- gene_id_col:
243
- Column in `de_res` that holds the gene identifiers
244
- score_col:
245
- Column in `de_res` that holds the score (results will be ordered by score).
246
- pval_col:
247
- Column in `de_res` that holds the unadjusted pvalue
248
- pval_adj_col:
249
- Column in `de_res` that holds the adjusted pvalue.
250
- If not specified, the unadjusted pvalues will be FDR-adjusted.
251
- lfc_col:
252
- Column in `de_res` that holds the log fold change
253
- key_added:
254
- Key under which the results will be stored in `adata.uns`
255
- """
256
- if groupby not in adata.obs.columns or groupby not in de_res.columns:
257
- raise ValueError("groupby column must exist in both adata and de_res.")
258
- res_dict = {
259
- "params": {
260
- "groupby": groupby,
261
- "reference": "rest",
262
- "method": "other",
263
- "use_raw": True,
264
- "layer": None,
265
- "corr_method": "other",
266
- },
267
- "names": [],
268
- "scores": [],
269
- "pvals": [],
270
- "pvals_adj": [],
271
- "logfoldchanges": [],
272
- }
273
- df_groupby = de_res.groupby(groupby)
274
- for _, tmp_df in df_groupby:
275
- tmp_df = tmp_df.sort_values(score_col, ascending=False)
276
- res_dict["names"].append(tmp_df[gene_id_col].values) # type: ignore
277
- res_dict["scores"].append(tmp_df[score_col].values) # type: ignore
278
- res_dict["pvals"].append(tmp_df[pval_col].values) # type: ignore
279
- if pval_adj_col is not None:
280
- res_dict["pvals_adj"].append(tmp_df[pval_adj_col].values) # type: ignore
281
- else:
282
- res_dict["pvals_adj"].append(fdrcorrection(tmp_df[pval_col].values)[1]) # type: ignore
283
- res_dict["logfoldchanges"].append(tmp_df[lfc_col].values) # type: ignore
284
-
285
- for key in ["names", "scores", "pvals", "pvals_adj", "logfoldchanges"]:
286
- res_dict[key] = pd.DataFrame(
287
- np.vstack(res_dict[key]).T,
288
- columns=list(df_groupby.groups.keys()),
289
- ).to_records(index=False, column_dtypes="O")
290
- adata.uns[key_added] = res_dict
291
-
292
- def de_analysis(
293
- self,
294
- adata: AnnData,
295
- groupby: str,
296
- method: Literal["t-test", "wilcoxon", "pydeseq2", "deseq2", "edger"],
297
- *formula: str | None,
298
- contrast: str | None,
299
- inplace: bool = True,
300
- key_added: str | None,
301
- ) -> pd.DataFrame:
302
- """Perform differential expression analysis.
303
-
304
- Args:
305
- adata: single-cell or pseudobulk AnnData object
306
- groupby: Column in adata.obs that contains the factor to test, e.g. `treatment`.
307
- For simple statistical tests (t-test, wilcoxon), it is sufficient to specify groupby.
308
- Linear models require to specify a formula.
309
- In that case, the `groupby` column is used to compute the contrast.
310
- method: Which method to use to perform the DE test.
311
- formula: model specification for linear models. E.g. `~ treatment + sex + age`.
312
- MUST contain the factor specified in `groupby`.
313
- contrast: See e.g. https://www.statsmodels.org/devel/contrasts.html for more information.
314
- inplace: if True, save the result in `adata.varm[key_added]`
315
- key_added: Key under which the result is saved in `adata.varm` if inplace is True.
316
- If set to None this defaults to `de_{method}_{groupby}`.
317
- Returns:
318
- Depending on the method a Pandas DataFrame containing at least:
319
- * gene_id
320
- * log2 fold change
321
- * mean expression
322
- * unadjusted p-value
323
- * adjusted p-value
324
- """
325
- raise NotImplementedError
@@ -1,53 +0,0 @@
1
- pertpy/__init__.py,sha256=HI_6a6S0V2YQmRZrlopJ9fxrHVEsBc0GhcX-fZZQCWk,600
2
- pertpy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
- pertpy/data/__init__.py,sha256=zj4jWyw_Dr6HJvdznQi9QUkZCoFN6vdFRhFF_tw4jts,1275
4
- pertpy/data/_dataloader.py,sha256=UTIFK2pofjO6HJjj1dJRbZiQ04_Sslg0d6ggBRkaTnk,2325
5
- pertpy/data/_datasets.py,sha256=78RQb4lGFhCDQdAwb8p_MYy4ZxFjRhhfAsKkuWMl5EQ,63179
6
- pertpy/metadata/__init__.py,sha256=9FC_FfcpGTsc3j5orjr3USkfsT63REnQBy4r7_VRjco,171
7
- pertpy/metadata/_cell_line.py,sha256=tA17gWp9uY0jn36S5bt5lfc9zU2HC2DxZ6x5jVRUosU,40644
8
- pertpy/metadata/_compound.py,sha256=Y1oaV_Nq4-wDVFPQhenJTjvOlY4HYi8bCxUUN3VNbMc,4861
9
- pertpy/metadata/_drug.py,sha256=q3snazwU_wTLC3Js-9pr_CvfBCRGuFBLlHSFVV-h3ko,9357
10
- pertpy/metadata/_look_up.py,sha256=Tb9BHZVc05aH4Kg2KLcfrgvra8gEV5aBqwAZ433krMc,29476
11
- pertpy/metadata/_metadata.py,sha256=h_m5bjn_DvCOuiie_q_DB6eM9ermJKXSnLJ0i84AGqI,3419
12
- pertpy/metadata/_moa.py,sha256=gLjM59ANqK5Ov-Y-v6COr5Bz4nI2O_LEBfJ2jRpR5U8,4941
13
- pertpy/plot/__init__.py,sha256=ZbOAZMpnnAy8GR8oSXJhuwA3gr9GDqgzx0fEkz0TFaE,257
14
- pertpy/plot/_augur.py,sha256=uHBoKVeNMcQUV23eHX_k3KQ4sa7wJUxn8VYgoGM0XSw,6713
15
- pertpy/plot/_coda.py,sha256=qZfkfFT61pwf-rlOYPwJiYDkx_1DTkT4TfG9fObQWoc,26891
16
- pertpy/plot/_guide_rna.py,sha256=iIjkOus7tftIv01zaCTamSX2q8bHBI8O4dxv6QDRVM0,2702
17
- pertpy/plot/_milopy.py,sha256=LGMJ4UQFAoRXtBC5LrUtskCU3YEQLzGvMOPuxBg1Tak,7414
18
- pertpy/plot/_mixscape.py,sha256=wKsY1efBP9VtQptAq79w5-ODcgzomD3QgW8iOF-5LZY,14862
19
- pertpy/preprocessing/__init__.py,sha256=uja9T469LLYQAGgrTyFa4MudXci6NXnAgOn97FHXcxA,40
20
- pertpy/preprocessing/_guide_rna.py,sha256=9FSu0QCxZujGPxhl-PcU4yRR7ZSGhgg99eJaLmf8hRA,7713
21
- pertpy/tools/__init__.py,sha256=zs_xmmmefEFbOQFMFhh_ds9StyuZ1iiSDdk4qhNlQq4,931
22
- pertpy/tools/_augur.py,sha256=Lws7-oSjSFGRupoloj7yIA3YNvVt_dcjSnQ8_Ctt2u0,55797
23
- pertpy/tools/_cinemaot.py,sha256=EbnucYl-Q3sfPDL9RiA-cXjpGFJYvfF4CaDEkyr7Snc,39501
24
- pertpy/tools/_dialogue.py,sha256=u98h147h2PwhWxFQo8limNmt20e2r5La9-wZvS6tXjo,52143
25
- pertpy/tools/_differential_gene_expression.py,sha256=eqit0SJ_fIpSYRS5grYZxEln_JkpXyng-q3LUw9ArY8,14360
26
- pertpy/tools/_enrichment.py,sha256=U2WY7t--FCQFZsXXBLZYBwF4WO9t5WToWjCGn_-tP6I,21922
27
- pertpy/tools/_kernel_pca.py,sha256=3S1D_wrp4vlHUPiRbCAoRbUyY-rVs112Qh-BZHSmTxE,1578
28
- pertpy/tools/_milo.py,sha256=SxpEjhvn2FOYQcQ56tG9ts8fS2vpp4DsB3V7lr8QHbc,43388
29
- pertpy/tools/_mixscape.py,sha256=5s0BrLsv1uv1tbZkZnNXN2qUzWjxvIuGe2iu9czBIxA,52500
30
- pertpy/tools/decoupler_LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
31
- pertpy/tools/transferlearning_MMD_LICENSE,sha256=MUvDA-o_j9htRpI8fStVdCRuyLdPkQUuIH0a_EIc57w,1069
32
- pertpy/tools/_coda/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
- pertpy/tools/_coda/_base_coda.py,sha256=L6OEz7PHDve_geS6JdyjMC5fSMNitZ4pYQOyMjSW04E,115262
34
- pertpy/tools/_coda/_sccoda.py,sha256=K_zsU8z_YP1hwJV1Urug4fd7kS-q23eLkcSsX_hxqYg,22849
35
- pertpy/tools/_coda/_tasccoda.py,sha256=xTe89TMtbUkw7WAEAvWzOQsMotdekP3Vs5zhMtB2t6c,31033
36
- pertpy/tools/_distances/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
- pertpy/tools/_distances/_distance_tests.py,sha256=aC4zspn4nJ2JRk56c76xTgSxl9znY7QI7zLktwsQ8SY,13604
38
- pertpy/tools/_distances/_distances.py,sha256=_dB9dyqWvg_yJBMJTuruFw5w-CLtQWqol-28KVifPBM,35619
39
- pertpy/tools/_perturbation_space/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
40
- pertpy/tools/_perturbation_space/_clustering.py,sha256=a1p0vzjN9nsmtWXWaKIeR3To3mL-7mzqD3HTTiHCpRk,3470
41
- pertpy/tools/_perturbation_space/_discriminator_classifiers.py,sha256=JYDPJlyqxeFbBqWqXk0el6ClXIwrUIYTye5ehmQvmao,22080
42
- pertpy/tools/_perturbation_space/_metrics.py,sha256=y8-baP8WRdB1iDgvP3uuQxSCDxA2lcxvEHHM2C_vWHY,3248
43
- pertpy/tools/_perturbation_space/_perturbation_space.py,sha256=VwwYjQ8-VfRHp8_97Id320xd3tnvv-wea6iLFkRE0RY,18868
44
- pertpy/tools/_perturbation_space/_simple.py,sha256=37zZweW-50Oa8pTQyC53KyNZQH157HurSc8qXZZt7JA,12681
45
- pertpy/tools/_scgen/__init__.py,sha256=neOj3JEcXxnIvgSMrSuPaUSGl1upo7yQ7K_NXHb8Rb8,45
46
- pertpy/tools/_scgen/_base_components.py,sha256=dIw-_7Z8iCietPF4tnpM7bFHtDksjnaHXwUjp9GoCIQ,2936
47
- pertpy/tools/_scgen/_scgen.py,sha256=qPu_zWCdLvcuOqSDNb2FLzxE5Y1uH0uSbpPGu7kOKks,30705
48
- pertpy/tools/_scgen/_scgenvae.py,sha256=v_6tZ4wY-JjdMH1QVd_wG4_N0PoaqB-FM8zC2JsDu1o,3935
49
- pertpy/tools/_scgen/_utils.py,sha256=y0LGS1OLmIVUBq2ZYySM2Up51o3c08-yjTvUkFb3E0U,2841
50
- pertpy-0.7.0.dist-info/METADATA,sha256=tSfWThb8uxC4jwbO5VfOIikt8DRBpO4UdHdFde0al3w,5782
51
- pertpy-0.7.0.dist-info/WHEEL,sha256=as-1oFTWSeWBgyzh0O_qF439xqBe6AbBgt4MfYe5zwY,87
52
- pertpy-0.7.0.dist-info/licenses/LICENSE,sha256=OZ-ZkXM5CmExJiEMM90b_7dGNNvRpj7kdE-49AnrLuI,1070
53
- pertpy-0.7.0.dist-info/RECORD,,