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.
Files changed (73) hide show
  1. univii-0.1.0/CHANGELOG.md +280 -0
  2. univii-0.1.0/CITATION.cff +37 -0
  3. univii-0.1.0/LICENSE +21 -0
  4. univii-0.1.0/MANIFEST.in +8 -0
  5. univii-0.1.0/PKG-INFO +325 -0
  6. univii-0.1.0/README.md +261 -0
  7. univii-0.1.0/RELEASE.md +164 -0
  8. univii-0.1.0/pyproject.toml +83 -0
  9. univii-0.1.0/scripts/update_conda_recipe.py +134 -0
  10. univii-0.1.0/scripts/verify_release.py +61 -0
  11. univii-0.1.0/setup.cfg +4 -0
  12. univii-0.1.0/tests/test_backward_compatibility.py +65 -0
  13. univii-0.1.0/tests/test_biological_workflows.py +211 -0
  14. univii-0.1.0/tests/test_datasets.py +117 -0
  15. univii-0.1.0/tests/test_export.py +101 -0
  16. univii-0.1.0/tests/test_latent_geometry.py +322 -0
  17. univii-0.1.0/tests/test_spatial_conv.py +380 -0
  18. univii-0.1.0/tests/test_transformer_fixes.py +139 -0
  19. univii-0.1.0/tests/test_tutorials.py +77 -0
  20. univii-0.1.0/univii/__init__.py +161 -0
  21. univii-0.1.0/univii/__main__.py +5 -0
  22. univii-0.1.0/univii/cli.py +60 -0
  23. univii-0.1.0/univii/config.py +661 -0
  24. univii-0.1.0/univii/data.py +568 -0
  25. univii-0.1.0/univii/datasets/__init__.py +66 -0
  26. univii-0.1.0/univii/datasets/_export.py +190 -0
  27. univii-0.1.0/univii/datasets/_registry.py +394 -0
  28. univii-0.1.0/univii/datasets/registry.json +266 -0
  29. univii-0.1.0/univii/datasets/scnmt.py +660 -0
  30. univii-0.1.0/univii/diagnostics.py +130 -0
  31. univii-0.1.0/univii/evaluation.py +1554 -0
  32. univii-0.1.0/univii/geometry.py +603 -0
  33. univii-0.1.0/univii/hyperparam_optimization/__init__.py +17 -0
  34. univii-0.1.0/univii/hyperparam_optimization/common.py +339 -0
  35. univii-0.1.0/univii/hyperparam_optimization/run_adt_hparam_search.py +109 -0
  36. univii-0.1.0/univii/hyperparam_optimization/run_atac_hparam_search.py +109 -0
  37. univii-0.1.0/univii/hyperparam_optimization/run_citeseq_hparam_search.py +137 -0
  38. univii-0.1.0/univii/hyperparam_optimization/run_multiome_hparam_search.py +145 -0
  39. univii-0.1.0/univii/hyperparam_optimization/run_rna_hparam_search.py +111 -0
  40. univii-0.1.0/univii/hyperparam_optimization/run_teaseq_hparam_search.py +146 -0
  41. univii-0.1.0/univii/interpretability.py +399 -0
  42. univii-0.1.0/univii/matching.py +394 -0
  43. univii-0.1.0/univii/models/__init__.py +14 -0
  44. univii-0.1.0/univii/models/conv.py +228 -0
  45. univii-0.1.0/univii/models/decoders.py +420 -0
  46. univii-0.1.0/univii/models/encoders.py +927 -0
  47. univii-0.1.0/univii/models/mlp.py +35 -0
  48. univii-0.1.0/univii/models/registry.py +79 -0
  49. univii-0.1.0/univii/models/tokenizers.py +376 -0
  50. univii-0.1.0/univii/models/transformer.py +362 -0
  51. univii-0.1.0/univii/models/univii.py +2183 -0
  52. univii-0.1.0/univii/objectives.py +46 -0
  53. univii-0.1.0/univii/perturbation.py +55 -0
  54. univii-0.1.0/univii/pipeline.py +194 -0
  55. univii-0.1.0/univii/plotting.py +1151 -0
  56. univii-0.1.0/univii/preprocessing.py +241 -0
  57. univii-0.1.0/univii/reference.py +119 -0
  58. univii-0.1.0/univii/refinement.py +298 -0
  59. univii-0.1.0/univii/spatial.py +345 -0
  60. univii-0.1.0/univii/trainer.py +712 -0
  61. univii-0.1.0/univii/utils/__init__.py +5 -0
  62. univii-0.1.0/univii/utils/io.py +621 -0
  63. univii-0.1.0/univii/utils/logging.py +16 -0
  64. univii-0.1.0/univii/utils/seed.py +18 -0
  65. univii-0.1.0/univii/utils/stats.py +23 -0
  66. univii-0.1.0/univii/utils/torch_utils.py +23 -0
  67. univii-0.1.0/univii/workflows.py +185 -0
  68. univii-0.1.0/univii.egg-info/PKG-INFO +325 -0
  69. univii-0.1.0/univii.egg-info/SOURCES.txt +71 -0
  70. univii-0.1.0/univii.egg-info/dependency_links.txt +1 -0
  71. univii-0.1.0/univii.egg-info/entry_points.txt +2 -0
  72. univii-0.1.0/univii.egg-info/requires.txt +39 -0
  73. 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.
@@ -0,0 +1,8 @@
1
+ include LICENSE
2
+ include README.md
3
+ include CHANGELOG.md
4
+ include CITATION.cff
5
+ include RELEASE.md
6
+ recursive-include univii/datasets *.json
7
+ include scripts/verify_release.py
8
+ include scripts/update_conda_recipe.py