. . .
. .. . . .. . . .
. . . . .. . . --> . .. . --> λ(·)
. .. . . . . . .
. . .
m a n y l a t e n t s
one geometry, learned through many latents
uv add manylatentsOptional extras:
uv add manylatents[hf] # HuggingFace trainer
uv add manylatents[torchdr] # GPU-accelerated DR via TorchDR
uv add manylatents[jax] # JAX backend (diffrax)
uv add manylatents[all] # everythingpip also works
pip install manylatents# embed a swiss roll with UMAP
manylatents algorithms/latent=umap data=swissroll
# add metrics
manylatents algorithms/latent=umap data=swissroll \
metrics=trustworthiness
# sweep algorithms
manylatents --multirun \
algorithms/latent=umap,phate,tsne \
data=swissroll metrics=trustworthinessdevelopment install
git clone https://github.com/latent-reasoning-works/manylatents.git
cd manylatents && uv syncfrom manylatents.api import run
result = run(data="swissroll", algorithm="pca", metrics=["trustworthiness"])
embeddings = result["embeddings"] # (n, d) ndarray
scores = result["scores"] # {"trustworthiness": 0.95}
# chain: PCA 50d -> PHATE 2d
result2 = run(input_data=result["embeddings"], algorithm="phate") CLI API
manylatents ... run(data=, algorithm=, ...)
│ │
▼ ▼
┌─────────┐ ┌───────────┐
│ main.py │ │ api.py │
│ Hydra │ │ registries│
└────┬────┘ └─────┬─────┘
│ instantiate objects │
└──────────┬───────────────┘
▼
┌──────────────────┐ ┌────────────────┐
│ experiment.py │─────►│ evaluate.py │
│ run_experiment()│ │ evaluate() │
│ │ │ prewarm_cache │
│ LatentModule │ │ compute_knn │
│ fit/transform │ │ metric_fn( │
│ LightningModule │ │ cache=cache) │
│ trainer.fit │ └────────────────┘
└──────────────────┘
Two base classes, one decision rule:
| if the algorithm... | use | interface |
|---|---|---|
| has no training loop | LatentModule |
fit(x) / transform(x) |
| trains with backprop | LightningModule |
trainer.fit() / encode(x) |
Both produce LatentOutputs — a dict keyed by "embeddings". All metrics receive a shared cache dict for deduplicated kNN and eigenvalue computation.
17 algorithms -- 12 latent modules, 5 lightning modules
PCA, t-SNE, UMAP, PHATE, DiffusionMap, MDS, MultiscalePHATE, Merging, Classifier, Leiden, ReebGraph, SelectiveCorrection, Autoencoder, AANet, LatentODE, HF Trainer, Reconstruction AE.
neighborhood_size=k sweeps kNN uniformly across algorithms.
20+ metrics across three evaluation contexts
Embedding fidelity (trustworthiness, continuity, kNN preservation), spectral analysis (affinity spectrum, spectral decay rate), topological features (persistent homology), and dataset properties (stratification).
All metrics share a cache dict for deduplicated kNN computation.
List-valued parameters expand via flatten_and_unroll_metrics() --
one kNN computation covers the entire sweep.
Config pattern: metrics=<name> (each metric config has an at: field for evaluation context)
6 synthetic manifolds + precomputed loader
Swiss roll, torus, saddle surface, gaussian blobs, DLA tree, and custom .npy/.npz files.
Domain-specific datasets (genomics, single-cell) available via extensions.
If manylatents was useful in your research, a citation goes a long way:
@software{manylatents2026,
title = {manyLatents: Unified Dimensionality Reduction and Neural Network Analysis},
author = {Valdez C{\'o}rdova, C{\'e}sar Miguel and Scicluna, Matthew and Ni, Shuang},
year = {2026},
url = {https://github.com/latent-reasoning-works/manylatents},
license = {MIT}
}MIT License · Latent Reasoning Works