univii 0.1.0__tar.gz
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.
- univii-0.1.0/CHANGELOG.md +280 -0
- univii-0.1.0/CITATION.cff +37 -0
- univii-0.1.0/LICENSE +21 -0
- univii-0.1.0/MANIFEST.in +8 -0
- univii-0.1.0/PKG-INFO +325 -0
- univii-0.1.0/README.md +261 -0
- univii-0.1.0/RELEASE.md +164 -0
- univii-0.1.0/pyproject.toml +83 -0
- univii-0.1.0/scripts/update_conda_recipe.py +134 -0
- univii-0.1.0/scripts/verify_release.py +61 -0
- univii-0.1.0/setup.cfg +4 -0
- univii-0.1.0/tests/test_backward_compatibility.py +65 -0
- univii-0.1.0/tests/test_biological_workflows.py +211 -0
- univii-0.1.0/tests/test_datasets.py +117 -0
- univii-0.1.0/tests/test_export.py +101 -0
- univii-0.1.0/tests/test_latent_geometry.py +322 -0
- univii-0.1.0/tests/test_spatial_conv.py +380 -0
- univii-0.1.0/tests/test_transformer_fixes.py +139 -0
- univii-0.1.0/tests/test_tutorials.py +77 -0
- univii-0.1.0/univii/__init__.py +161 -0
- univii-0.1.0/univii/__main__.py +5 -0
- univii-0.1.0/univii/cli.py +60 -0
- univii-0.1.0/univii/config.py +661 -0
- univii-0.1.0/univii/data.py +568 -0
- univii-0.1.0/univii/datasets/__init__.py +66 -0
- univii-0.1.0/univii/datasets/_export.py +190 -0
- univii-0.1.0/univii/datasets/_registry.py +394 -0
- univii-0.1.0/univii/datasets/registry.json +266 -0
- univii-0.1.0/univii/datasets/scnmt.py +660 -0
- univii-0.1.0/univii/diagnostics.py +130 -0
- univii-0.1.0/univii/evaluation.py +1554 -0
- univii-0.1.0/univii/geometry.py +603 -0
- univii-0.1.0/univii/hyperparam_optimization/__init__.py +17 -0
- univii-0.1.0/univii/hyperparam_optimization/common.py +339 -0
- univii-0.1.0/univii/hyperparam_optimization/run_adt_hparam_search.py +109 -0
- univii-0.1.0/univii/hyperparam_optimization/run_atac_hparam_search.py +109 -0
- univii-0.1.0/univii/hyperparam_optimization/run_citeseq_hparam_search.py +137 -0
- univii-0.1.0/univii/hyperparam_optimization/run_multiome_hparam_search.py +145 -0
- univii-0.1.0/univii/hyperparam_optimization/run_rna_hparam_search.py +111 -0
- univii-0.1.0/univii/hyperparam_optimization/run_teaseq_hparam_search.py +146 -0
- univii-0.1.0/univii/interpretability.py +399 -0
- univii-0.1.0/univii/matching.py +394 -0
- univii-0.1.0/univii/models/__init__.py +14 -0
- univii-0.1.0/univii/models/conv.py +228 -0
- univii-0.1.0/univii/models/decoders.py +420 -0
- univii-0.1.0/univii/models/encoders.py +927 -0
- univii-0.1.0/univii/models/mlp.py +35 -0
- univii-0.1.0/univii/models/registry.py +79 -0
- univii-0.1.0/univii/models/tokenizers.py +376 -0
- univii-0.1.0/univii/models/transformer.py +362 -0
- univii-0.1.0/univii/models/univii.py +2183 -0
- univii-0.1.0/univii/objectives.py +46 -0
- univii-0.1.0/univii/perturbation.py +55 -0
- univii-0.1.0/univii/pipeline.py +194 -0
- univii-0.1.0/univii/plotting.py +1151 -0
- univii-0.1.0/univii/preprocessing.py +241 -0
- univii-0.1.0/univii/reference.py +119 -0
- univii-0.1.0/univii/refinement.py +298 -0
- univii-0.1.0/univii/spatial.py +345 -0
- univii-0.1.0/univii/trainer.py +712 -0
- univii-0.1.0/univii/utils/__init__.py +5 -0
- univii-0.1.0/univii/utils/io.py +621 -0
- univii-0.1.0/univii/utils/logging.py +16 -0
- univii-0.1.0/univii/utils/seed.py +18 -0
- univii-0.1.0/univii/utils/stats.py +23 -0
- univii-0.1.0/univii/utils/torch_utils.py +23 -0
- univii-0.1.0/univii/workflows.py +185 -0
- univii-0.1.0/univii.egg-info/PKG-INFO +325 -0
- univii-0.1.0/univii.egg-info/SOURCES.txt +71 -0
- univii-0.1.0/univii.egg-info/dependency_links.txt +1 -0
- univii-0.1.0/univii.egg-info/entry_points.txt +2 -0
- univii-0.1.0/univii.egg-info/requires.txt +39 -0
- univii-0.1.0/univii.egg-info/top_level.txt +1 -0
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.1.0
|
|
4
|
+
|
|
5
|
+
First release of **UniVII**, a new package that continues from UniVI 1.2.1 in its own repository. Everything
|
|
6
|
+
below this entry is the history of UniVI, kept for reference; module paths there read `univi`.
|
|
7
|
+
|
|
8
|
+
### Changed
|
|
9
|
+
|
|
10
|
+
- The package is named `univii`: `import univii`, the `univii` command, and the `univii` distribution. It
|
|
11
|
+
installs alongside the published `univi` package without touching it. Class and function names are
|
|
12
|
+
unchanged (`UniVIConfig`, `UniVIMultiModalVAE`, `UniVITrainer`, ...), so existing code needs only its
|
|
13
|
+
imports changed; `UniVIIConfig`, `UniVIIMultiModalVAE`, `UniVIITrainer` and `UniVIIRefiner` are aliases for
|
|
14
|
+
the same classes.
|
|
15
|
+
- Environment variables are `UNIVII_DATA_DIR` and `UNIVII_DATASET_REGISTRY`, and datasets are cached in
|
|
16
|
+
`~/.cache/univii`, separately from UniVI's cache.
|
|
17
|
+
- Unchanged on purpose, so that files written by UniVI stay readable: the AnnData keys `X_univi`,
|
|
18
|
+
`X_univi_fused` and `univi_modality`, and the reference-bundle format `univi-reference-1`. Reference bundles
|
|
19
|
+
saved by UniVI 1.2.1 load, including their fitted preprocessors.
|
|
20
|
+
- With default settings the model is numerically identical to UniVI 1.2.1.
|
|
21
|
+
|
|
22
|
+
### Added
|
|
23
|
+
|
|
24
|
+
- *Latent geometry*: `UniVIConfig(latent_geometry="hyperbolic" | "product", hyperbolic_dim=..., curvature=...,
|
|
25
|
+
learn_curvature=...)` puts some or all latent dimensions in hyperbolic space (Lorentz model, wrapped-normal
|
|
26
|
+
posteriors). The default is `"euclidean"`. The forward pass additionally reports `kl_e`, `kl_h` and `curvature`.
|
|
27
|
+
- *Geometry API*: `model.latent_distance`, `pairwise_latent_distance`, `latent_radius`, `to_poincare`,
|
|
28
|
+
`set_latent_anchor` / `anchor_latent` / `clear_latent_anchor`, and `encode_fused(..., anchored=True)`;
|
|
29
|
+
the same operations for plain arrays in the new `univii.geometry` module.
|
|
30
|
+
- *Hierarchy supervision*: `model.set_hierarchy(dist, root_index=...)` with `hierarchy_weight`,
|
|
31
|
+
`hierarchy_root_weight`, `hierarchy_scale` and `hierarchy_head` ties latent distances to a label tree in any
|
|
32
|
+
geometry; `univii.geometry.tree_distance_matrix` and `hierarchy_metrics` build and score it.
|
|
33
|
+
- *Reference anchoring*: new `univii.reference` module (`refine_latent`, `reconstruction_nll`,
|
|
34
|
+
`deviation_scores`, `anchor_on_label`) for placing query cells on a frozen model and scoring how far they
|
|
35
|
+
sit from it.
|
|
36
|
+
- *Convolutional encoders and decoders*: `ModalityConfig(encoder_type="conv", decoder_type="conv",
|
|
37
|
+
conv=ConvConfig(...))` for image tiles (2-D) and ordered tracks (1-D). Conv modalities are stored flat, so
|
|
38
|
+
loaders and likelihoods are unchanged. The conv decoder supports the gaussian, gaussian_diag and bernoulli
|
|
39
|
+
likelihoods.
|
|
40
|
+
- *Plug-in registry*: `univii.models.register_encoder` / `register_decoder` add custom architectures by name;
|
|
41
|
+
`BackboneGaussianEncoder` wraps any feature extractor, frozen or trainable. `ModalityConfig` gains
|
|
42
|
+
`decoder_type`, `conv` and `encoder_kwargs`; `encoder_type` now accepts registered names.
|
|
43
|
+
- *Spatial utilities*: new `univii.spatial` module with `niche_modality`, `tiles_from_visium`, `extract_tiles`,
|
|
44
|
+
`make_spatial_loader`, `SpatialBlockSampler` and neighbour-graph helpers.
|
|
45
|
+
- *Spatial smoothness prior*: `UniVIConfig(spatial_weight=..., spatial_sigma=..., spatial_k=...)` pulls the
|
|
46
|
+
latents of neighbouring spots together when batches carry coordinates; reported as `spatial`.
|
|
47
|
+
- *Repository*: new README, release guide and installation page; `scripts/switch_install_commands.py`
|
|
48
|
+
replaces the install-from-GitHub commands once the package is on PyPI;
|
|
49
|
+
`tests/test_backward_compatibility.py` loads reference bundles written by UniVI 1.2.1 and checks their
|
|
50
|
+
outputs are unchanged.
|
|
51
|
+
- User guide pages "Latent geometry" and "Spatial data and conv encoders";
|
|
52
|
+
`tests/test_latent_geometry.py` and `tests/test_spatial_conv.py`.
|
|
53
|
+
|
|
54
|
+
### Changed (documentation only)
|
|
55
|
+
|
|
56
|
+
- *In-silico chromatin perturbation*: the chance rate of motif matches is measured with a
|
|
57
|
+
dinucleotide-preserving shuffle (Altschul & Erickson). A single-base shuffle restores CpG, which the genome
|
|
58
|
+
is depleted of, and so overstated the chance rate of CpG-containing motifs such as PAX5's and CEBPB's.
|
|
59
|
+
- *Unified PBMC atlas*: RNA features default to genes that are highly variable in at least two of the three
|
|
60
|
+
cohorts (`RNA_FEATURES = "consensus"`), and the validation table reports how well a fresh classifier can
|
|
61
|
+
still predict the cohort from each model's embedding.
|
|
62
|
+
- *Transformer encoders*: the peak–gene benchmark adds reference links computed within lineages (T/NK, B,
|
|
63
|
+
myeloid), which are not dominated by cell-type co-variation, and a check of how often each score ranks a
|
|
64
|
+
promoter peak first.
|
|
65
|
+
- *Fig. 7 (AML)*: a note on reading AUROC and average precision against the mutant fraction.
|
|
66
|
+
|
|
67
|
+
## 1.2.1
|
|
68
|
+
|
|
69
|
+
### Fixed
|
|
70
|
+
|
|
71
|
+
- Relative-position attention bias (`TransformerConfig(use_relpos_bias=True)` with peak coordinates
|
|
72
|
+
attached): distances are now computed in float32 per chromosome, instead of float64 with per-chromosome
|
|
73
|
+
offsets, and the gradient of the small bias table is computed as a histogram (`torch.bincount`) instead
|
|
74
|
+
of through the scatter of the default indexing backward. In a real-data run of the transformer tutorial
|
|
75
|
+
on a consumer GPU, the model with genomic position had trained about 18 times slower than the same model
|
|
76
|
+
without it. Bins are unchanged within a chromosome (up to float32 rounding of positions, 16 bp at 250 Mb)
|
|
77
|
+
and pairs on different chromosomes still fall in the farthest bin.
|
|
78
|
+
|
|
79
|
+
### Changed
|
|
80
|
+
|
|
81
|
+
- Experimental tutorials, after a first run on the real data:
|
|
82
|
+
- *In-silico chromatin perturbation*: the chance rate of motif matches is measured on shuffled peak
|
|
83
|
+
sequences rather than assumed, so short motifs are no longer flagged merely for being short; flagged
|
|
84
|
+
motif sets are no longer used by default; the tiling-screen null is matched on accessibility, width and
|
|
85
|
+
GC; the genome-wide axis shows canonical chromosomes only.
|
|
86
|
+
- *Unified PBMC atlas*: the adversarial cohort models also train on mixed-cohort RNA-only batches (with
|
|
87
|
+
single-cohort batches alone, mixing did not improve at any adversary strength); "who is the expert" now
|
|
88
|
+
measures how far the fused embedding moves when each modality is left out; the latent walk reports how
|
|
89
|
+
well its decoded protein changes agree with the observed ones.
|
|
90
|
+
- *Transformer encoders*: ATAC features default to peaks near the modeled genes (`ATAC_FEATURES =
|
|
91
|
+
"near_genes"`); in a run with the most accessible peaks genome-wide, only about four gene tokens per
|
|
92
|
+
cell had a nearby peak among the peak tokens. A new peak–gene link benchmark scores every gene–peak
|
|
93
|
+
pair within 100 kb by distance, fused-transformer attention and gradient attribution, against
|
|
94
|
+
correlation-based reference links across pseudobulks (with a background of accessibility-matched peaks
|
|
95
|
+
on other chromosomes), overall and within distance bins, with loop-style locus views.
|
|
96
|
+
- *Prediction uncertainty* and *cross-modal QC*: conformal calibration uses a split kept apart from the
|
|
97
|
+
validation cells used for early stopping. With validation cells doubling as calibration cells, the QC
|
|
98
|
+
notebook's realized false discovery rate was 16% at a 10% target.
|
|
99
|
+
|
|
100
|
+
## 1.2.0
|
|
101
|
+
|
|
102
|
+
### Added
|
|
103
|
+
|
|
104
|
+
- *Extended and experimental tutorials* (`docs/tutorials/experimental/`), five Colab-ready notebooks that use the
|
|
105
|
+
public API and `univi.datasets`: in-silico chromatin perturbation of transcription regulators (ATAC → RNA),
|
|
106
|
+
with matched random-peak nulls, length-corrected JASPAR motif peak sets, a single-peak in-silico tiling
|
|
107
|
+
screen at each regulator's locus and genome-wide views of where effects land; per-modality and fused
|
|
108
|
+
transformer encoders, with attention maps, attention entropy, attention rollout and a permutation-calibrated
|
|
109
|
+
cis-attention test against untrained controls; a unified PBMC atlas from CITE-seq, Multiome and TEA-seq,
|
|
110
|
+
validated on a held-out TEA-seq well, with an adversarial cohort head tuned on validation cells,
|
|
111
|
+
mixture-of-experts weights per cell type, modality agreement and latent traversals; calibrated
|
|
112
|
+
(split-conformal) uncertainty for cross-modal predictions; and quality control from cross-modal
|
|
113
|
+
disagreement (mis-paired barcodes and doublets, conformal p-values, false discovery rate control).
|
|
114
|
+
`tests/test_tutorials.py` executes them on synthetic data and `scripts/execute_tutorials.py --experimental`
|
|
115
|
+
on the real data.
|
|
116
|
+
- `TokenizerConfig` fields for the options the encoders' tokenizer reads: `use_feature_embedding`,
|
|
117
|
+
`feature_emb_dim`, `feature_emb_mode`, `use_coord_embedding`, `n_chroms`, `coord_emb_dim`, `coord_mode`,
|
|
118
|
+
`coord_mlp_hidden`, `coord_num_frequencies` and `token_proj_dim`. As fields they reach the fused encoder and
|
|
119
|
+
are written by `save_reference` and read by `load_reference`.
|
|
120
|
+
- Tokenizer mode `topk_embed` now works in the encoders: top-k channel tokens with a learned feature-ID
|
|
121
|
+
embedding of width `d_model`, and coordinate embeddings when `use_coords=True` (coordinates can be given in
|
|
122
|
+
`feature_info`).
|
|
123
|
+
- `TransformerConfig(use_relpos_bias=True)` now reaches the per-modality transformer encoders; when peak
|
|
124
|
+
coordinates are attached (`vec2tok.set_feature_coords`), the binned genomic-distance attention bias is
|
|
125
|
+
applied, with tokens on different chromosomes in the farthest bin.
|
|
126
|
+
- `tests/test_transformer_fixes.py` covers the fixes below.
|
|
127
|
+
- The synthetic Multiome stand-in used by the tests includes gene and peak coordinates and a panel of
|
|
128
|
+
transcription-factor genes.
|
|
129
|
+
|
|
130
|
+
### Changed
|
|
131
|
+
|
|
132
|
+
- The Datasets documentation page now describes every hosted dataset (files, feature counts, what `.X` and
|
|
133
|
+
`.obs` hold, splits, original data) and includes the export recipes previously on *How the hosted datasets
|
|
134
|
+
are built*, which now points there.
|
|
135
|
+
- The Genome Research manuscript notebooks (`notebooks/GR_manuscript_reproducibility/`) render inline figures
|
|
136
|
+
at `DISPLAY_DPI` (80) so the executed notebooks stay small; figures saved to disk keep their own resolution.
|
|
137
|
+
- `.gitignore` excludes files written by the tutorials (`univi_outputs/`).
|
|
138
|
+
|
|
139
|
+
### Fixed
|
|
140
|
+
|
|
141
|
+
- Fused multimodal transformer with `loss_mode="v2"`: the per-modality encoders are trained only by the
|
|
142
|
+
alignment term. While that term was annealed to weight 0 it stayed in the backpropagated loss, so the
|
|
143
|
+
encoders received zero gradients, and the coupled weight decay of `torch.optim.Adam` drove their weights to
|
|
144
|
+
zero before alignment started; they did not recover, and every per-modality embedding became constant. A
|
|
145
|
+
zero-weighted alignment term is now left out of the backpropagated loss, so the optimizer leaves those
|
|
146
|
+
encoders untouched until alignment begins. Other models are unaffected (the term contributed nothing).
|
|
147
|
+
- Feature-ID embedding options set on a `TokenizerConfig` were silently dropped by the fused encoder, which
|
|
148
|
+
copies tokenizer configs with `dataclasses.replace`; they are now fields.
|
|
149
|
+
- Genomic coordinate embeddings ignored the position: the coordinate MLP normalized a single scalar with
|
|
150
|
+
`LayerNorm`, which maps every value to the same output (and `coord_scale` was multiplied where
|
|
151
|
+
`univi.models.tokenizers` divides). Positions are now encoded with multi-scale sinusoidal features
|
|
152
|
+
(wavelengths 1 kb to 100 Mb) before the MLP.
|
|
153
|
+
- `topk_embed` passed configuration validation but was rejected when the encoder was built.
|
|
154
|
+
- `use_relpos_bias`, `relpos_num_bins` and `relpos_max_dist` were dropped when a `TransformerConfig` was
|
|
155
|
+
converted for the encoder.
|
|
156
|
+
- `aml_mosaic`: the Knorr et al. (2023) CITE-seq data are cited as GEO GSE220473 (the CITE-seq SubSeries of
|
|
157
|
+
SuperSeries GSE220474). The registry description and the documented export recipe now match the hosted
|
|
158
|
+
DAb-seq file, which holds processed protein values and variant-level genotype columns rather than
|
|
159
|
+
`mut_<GENE>` columns.
|
|
160
|
+
- `shareseq_mouse_skin`: the documentation and the Supplemental Fig. S3 API notebook now give the split stored
|
|
161
|
+
in the hosted files (21,845 / 3,112 / 6,263 cells, stratified 70/10/20) instead of describing it as 80/10/10.
|
|
162
|
+
|
|
163
|
+
## 1.1.0
|
|
164
|
+
|
|
165
|
+
### Fixed
|
|
166
|
+
|
|
167
|
+
- Replaced the scNMT-seq dataset-catalog placeholder and added the published dataset DOI
|
|
168
|
+
([10.5281/zenodo.22885463](https://doi.org/10.5281/zenodo.22885463)), file links,
|
|
169
|
+
dimensions, and loading guidance across the documentation and S4 notebooks.
|
|
170
|
+
|
|
171
|
+
- `MultiModalDataset` copies AnnData views once instead of re-slicing them for every item, which made
|
|
172
|
+
training on subsets (for example `adata[train_idx]`) extremely slow or run out of memory.
|
|
173
|
+
|
|
174
|
+
### Added
|
|
175
|
+
|
|
176
|
+
- `univi.datasets.export_dataset` packages AnnData objects (raw counts, selected metadata, an optional
|
|
177
|
+
train/validation/test split in `obs["split"]`) with md5 checksums, a manifest, and a record description.
|
|
178
|
+
- `scripts/zenodo_upload.py` uploads an exported dataset to a Zenodo draft through the deposit API, verifies
|
|
179
|
+
each file's checksum, and links the record to the article. `scripts/prepare_zenodo_release.py prepare` now
|
|
180
|
+
uses `export_dataset`.
|
|
181
|
+
- Seven notebooks under *Paper analyses with the public API* that run the analyses of Figs. 2–7 and
|
|
182
|
+
Supplemental Figs. S3–S4 through `univi.datasets`, the fitted preprocessors, `UniVITrainer`, and
|
|
183
|
+
`UniVIRefiner`, with the settings of the archived notebooks.
|
|
184
|
+
- Documentation of how each hosted dataset is exported from the archived notebooks.
|
|
185
|
+
|
|
186
|
+
### Changed
|
|
187
|
+
|
|
188
|
+
- Placeholder registry entries use the file names written by `export_dataset`.
|
|
189
|
+
- The tutorial test suite also executes the paper-analysis notebooks on synthetic stand-in data.
|
|
190
|
+
- `scnmt_gastrulation` downloads three compact `.h5ad` files from Zenodo (RNA counts; CpG/GpC fractions
|
|
191
|
+
with success/coverage layers; the article's split) instead of the 33 GB EBI bundle.
|
|
192
|
+
|
|
193
|
+
## 1.0.0
|
|
194
|
+
|
|
195
|
+
First stable release following publication of the UniVI article in *Genome Research*
|
|
196
|
+
([doi:10.1101/gr.281431.125](https://doi.org/10.1101/gr.281431.125)). The public API documented
|
|
197
|
+
at <https://univi.readthedocs.io> now follows semantic versioning; transformer encoders and the
|
|
198
|
+
multimodal transformer remain experimental. There are no changes to the training objective, model
|
|
199
|
+
architecture, or checkpoint and reference-bundle formats, so code written for 0.5.x runs unchanged.
|
|
200
|
+
|
|
201
|
+
### Added
|
|
202
|
+
|
|
203
|
+
- `univi.datasets` downloads, verifies (md5/sha256), and caches the datasets used in the tutorials and
|
|
204
|
+
the article: `list_datasets()`, `load()`, `fetch()`, `dataset_info()`, `register_dataset()`, and
|
|
205
|
+
shortcuts such as `pbmc_multiome_10k()`. Mirrors, `file://` URLs, `UNIVI_DATA_DIR`, and
|
|
206
|
+
`UNIVI_DATASET_REGISTRY` support offline clusters and private data.
|
|
207
|
+
- A warning when `use_moe_gating=True` is combined with an objective that gives the gating network no
|
|
208
|
+
training signal (`loss_mode="v1"` with a non-fused `v1_recon` and no classification heads).
|
|
209
|
+
- Rebuilt documentation: six tutorial notebooks (quickstart, CITE-seq, query mapping, classification
|
|
210
|
+
heads and refinement, generation and perturbation, custom modalities) that open in Colab and are
|
|
211
|
+
executed in CI; a user guide; a figure-by-figure guide to the article's analyses; and an API reference.
|
|
212
|
+
- `CITATION.cff`, a contributing guide, and issue templates.
|
|
213
|
+
|
|
214
|
+
### Changed
|
|
215
|
+
|
|
216
|
+
- `univi.datasets` is now a package; the scNMT-seq readers live in `univi.datasets.scnmt` and all
|
|
217
|
+
previous import paths still work.
|
|
218
|
+
- Package metadata: keywords, classifiers, documentation and paper links, and `docs`/`test` extras.
|
|
219
|
+
|
|
220
|
+
### Fixed
|
|
221
|
+
|
|
222
|
+
- `MultiModalDataset` copies label arrays before converting them to tensors, avoiding a PyTorch warning
|
|
223
|
+
for read-only arrays (for example those returned by pandas 3).
|
|
224
|
+
- Documentation examples that did not match the API (`MultiModalDataset(X_key=...)`,
|
|
225
|
+
`export_supplemental_table_s1`, `TokenizerConfig` coordinate fields, the hyperparameter-search entry point).
|
|
226
|
+
|
|
227
|
+
### Removed
|
|
228
|
+
|
|
229
|
+
- The script-generated tutorial pages under `docs/examples/`, `scripts/build_tutorial_docs.py`,
|
|
230
|
+
`tests/smoke_examples.py`, and `RELEASE_NOTES_v0.5.0.md` (superseded by the notebooks, the notebook
|
|
231
|
+
tests, and this changelog).
|
|
232
|
+
|
|
233
|
+
## 0.5.0
|
|
234
|
+
|
|
235
|
+
This feature release packages the biological workflows accompanying the published
|
|
236
|
+
Genome Research manuscript. It adds a Sphinx / Read the Docs site and public APIs
|
|
237
|
+
for analyses previously expressed through manuscript-specific notebook code.
|
|
238
|
+
|
|
239
|
+
### Added
|
|
240
|
+
|
|
241
|
+
- Decoder/encoder freeze and unfreeze methods that preserve frozen BatchNorm
|
|
242
|
+
statistics and Dropout behavior across `model.train()` calls.
|
|
243
|
+
- `add_classification_head()` without reinitializing the generative reference,
|
|
244
|
+
plus optional LayerNorm heads and serializable class-label mappings.
|
|
245
|
+
- `UniVIRefiner` for head warmup and selected-encoder adaptation, with per-head
|
|
246
|
+
missing-label masks, separate learning rates, reference latent preservation,
|
|
247
|
+
paired reconstruction replay, and validation checkpoint selection.
|
|
248
|
+
- RNA, ADT, and ATAC preprocessors fit on training cells and reused on queries.
|
|
249
|
+
- Reference bundles preserving weights, configuration, transforms, feature order,
|
|
250
|
+
freeze state, head vocabulary, and user-supplied run metadata.
|
|
251
|
+
- Loader and stacked-embedding helpers, scNMT success/coverage adapters, and
|
|
252
|
+
explicit feature-perturbation predictions.
|
|
253
|
+
- Lazy top-level imports for the new public workflow APIs.
|
|
254
|
+
- Figure-linked biological tutorials through Figure 8, biological supplemental
|
|
255
|
+
Figures S1–S7, and Supplemental Notebook S1, with downloadable notebooks.
|
|
256
|
+
- Notebook-source provenance audit, automated helper checks, synthetic tutorial
|
|
257
|
+
checks, documentation CI, and release artifact verification.
|
|
258
|
+
|
|
259
|
+
### Fixed
|
|
260
|
+
|
|
261
|
+
- Recursive resolution of lazy submodule imports.
|
|
262
|
+
- Classification-head `None` defaults now inherit model dropout/BatchNorm values.
|
|
263
|
+
- Fractional perturbations of integer-typed inputs are not silently truncated.
|
|
264
|
+
- A stale preprocessing bundle is rejected before overwriting model weights.
|
|
265
|
+
|
|
266
|
+
### Compatibility and scope
|
|
267
|
+
|
|
268
|
+
The generative training objective and archived manuscript notebooks are retained.
|
|
269
|
+
The new refiner is an explicit opt-in workflow with its own documented checkpoint
|
|
270
|
+
and normalization rules. A corrected head default can change behavior in code
|
|
271
|
+
that relied on `batchnorm=None` being treated as false; use `batchnorm=False`
|
|
272
|
+
explicitly when that is intended. Prior checkpoint formats are not rewritten;
|
|
273
|
+
the new reference bundle is a separate format.
|
|
274
|
+
|
|
275
|
+
Tutorials using Seurat v3 HVGs need the `tutorials` extra (or `scikit-misc` in a
|
|
276
|
+
conda environment). `joblib>=1.3` is a core dependency for reference bundles.
|
|
277
|
+
Several tutorial preprocessing choices deliberately improve separation of
|
|
278
|
+
training and held-out cells; consult the provenance audit before exact numerical
|
|
279
|
+
replication. Software checks use small synthetic inputs, not reruns of the full
|
|
280
|
+
published biological experiments.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
cff-version: 1.2.0
|
|
2
|
+
message: "If you use UniVII, please cite the Genome Research article below, and name this repository and its version if you used the features it adds."
|
|
3
|
+
type: software
|
|
4
|
+
title: "UniVII"
|
|
5
|
+
abstract: "UniVI, a mixture-of-experts multimodal variational autoencoder for integrating, translating, and generating single-cell multi-omics data, extended with hyperbolic and product latent spaces, convolutional encoders and decoders, spatial tools, and plug-in architectures."
|
|
6
|
+
version: 0.1.0
|
|
7
|
+
license: MIT
|
|
8
|
+
repository-code: "https://github.com/Ashford-A/UniVII"
|
|
9
|
+
url: "https://github.com/Ashford-A/UniVII"
|
|
10
|
+
keywords: [single-cell, multi-omics, variational autoencoder, data integration, hyperbolic geometry, spatial transcriptomics]
|
|
11
|
+
authors:
|
|
12
|
+
- family-names: Ashford
|
|
13
|
+
given-names: Andrew J.
|
|
14
|
+
orcid: "https://orcid.org/0000-0002-1234-2118"
|
|
15
|
+
- family-names: Enright
|
|
16
|
+
given-names: Trevor
|
|
17
|
+
preferred-citation:
|
|
18
|
+
type: article
|
|
19
|
+
title: "Unifying multimodal single-cell data with a mixture-of-experts β-variational autoencoder framework"
|
|
20
|
+
journal: "Genome Research"
|
|
21
|
+
year: 2026
|
|
22
|
+
volume: 36
|
|
23
|
+
issue: 10
|
|
24
|
+
start: 2068
|
|
25
|
+
end: 2090
|
|
26
|
+
doi: "10.1101/gr.281431.125"
|
|
27
|
+
authors:
|
|
28
|
+
- family-names: Ashford
|
|
29
|
+
given-names: Andrew J.
|
|
30
|
+
- family-names: Enright
|
|
31
|
+
given-names: Trevor
|
|
32
|
+
- family-names: Somers
|
|
33
|
+
given-names: Julia
|
|
34
|
+
- family-names: Nikolova
|
|
35
|
+
given-names: Olga
|
|
36
|
+
- family-names: Demir
|
|
37
|
+
given-names: Emek
|
univii-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Andrew J. Ashford
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the “Software”), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|