Releases#
Release Notes#
Version 0.5 (2026-09-14)#
Parametric and out-of-sample neighbor embeddings, memory-scalable multi-GPU FAISS, and more faithful and efficient UMAP optimization.
Added#
Add neural-network encoder support for parametric neighbor embeddings and out-of-sample transforms PR #263.
Add non-parametric transforms for UMAP, LargeVis, and InfoTSNE PR #276.
Add immutable exact FAISS execution plans and expose the resolved plan through
faiss_plan_PR #333.Add an explicit exact-Flat index-sharding topology for multi-GPU search PR #338.
Add true rank-local sharded inputs for exact-Flat UMAP, including uneven shards, distributed PCA initialization, and explicit FAISS plan composition PR #360, PR #364, PR #365, PR #375, and PR #376.
Changed#
Flatten UMAP’s attractive graph so optimization processes only real edges, substantially reducing fit time and peak GPU memory PR #320.
Reuse FAISS GPU resources with correct CUDA stream ownership PR #310.
Stream DataLoader tensors directly into FAISS with automatic internal batching PR #311.
Keep FAISS tensor inputs and FAISS K-means data on-device instead of routing them through host NumPy PR #291 and PR #292.
Train distributed IVF and IVFPQ indexes once and broadcast the trained template to all ranks PR #326.
Make replicated and sharded FAISS distribution explicit; replication remains the default and sharding is an opt-in capacity strategy PR #374.
Rework distributed sparse symmetrization to reduce peak GPU memory, exchange flat buffers, and accelerate the default device-coalescing path PR #254, PR #298, and PR #316.
Require Python 3.8 or newer PR #284.
Fixed#
Align UMAP fit-time neighbor counts with umap-learn semantics PR #361.
Account for both endpoints of each UMAP attractive edge PR #362.
Clip UMAP attractive and repulsive contributions per edge before aggregation PR #378.
Remove UMAP’s fixed per-row negative-sampling cap with a flat representation that realizes every scheduled draw PR #379.
Match UMAP negative edge sampling periods to umap-learn PR #381.
Stabilize PHATE potential-distance computation to prevent NaNs PR #274.
Correct PACMAP mid-near pair selection to use global sample indices PR #277.
Preserve expert IVFPQ settings and tuple outputs through distributed and contiguous wrappers PR #278 and PR #279.
Release DataLoader metadata and compiled-function cache entries when their owning objects are destroyed PR #281 and PR #290.
Preserve NumPy random state and prevent integer overflow in
kmeans_ariPR #283 and PR #332.Preserve distributed sparse index and value dtypes PR #288.
Remove FAISS self-neighbors by global identity rather than result position PR #295.
Validate distributed launch and input contracts early, and propagate rank-local sharded-search failures without deadlocks PR #296, PR #300, PR #324, and PR #349.
Include every TorchDR subpackage in built distributions PR #287.
Version 0.4 (2026-02-03)#
Multi-GPU distributed training, CLI tool, and DataLoader integration.
Added#
Add TorchDR CLI for easy multi-GPU execution PR #233.
Add DistributedContext for multi-GPU distance computations PR #229.
Add multi-GPU affinity computations PR #217.
Add multi-GPU neighbor embedding PR #218.
Add distributed symmetrize sparse operations PR #219.
Add distributed support for neighborhood preservation metric PR #231.
Add DistributedPCA for multi-GPU PCA computation PR #248.
Add distributed support to PCA and ExactIncrementalPCA PR #253.
Add exact incremental PCA PR #213.
Add k-NN label accuracy metric PR #230.
Add k-means and neighborhood preservation evaluation scores PR #214.
Add IVF support in FAISS k-NN backend PR #220.
Add pairwise distances with query and key indexes PR #216.
Add DataLoader support for memory-efficient k-NN computation PR #236.
Add FAISS configuration options PR #208.
Add automatic releases via GitHub Actions PR #226.
Add cross-platform CI testing for macOS and Windows PR #258.
Add tests for CLI, distributed, and sparse modules PR #246.
Changed#
Rename SampledNeighborEmbedding to NegativeSamplingNeighborEmbedding PR #225.
Standardize device parameter to ‘auto’ default across all modules PR #241.
Refactor device management for consistency PR #211.
Improve memory management with torch buffers PR #203.
Optimize root_search with masked_scatter_ PR #204.
Fixed#
Fix memory leak in AffinityMatcher by freeing input data after initialization PR #223.
Fix PACMAP device handling PR #215.
Fix AffinityMatcher kwargs mutation PR #240.
Fix CLI port conflicts with –standalone flag PR #251.
Fix TSNEkhorn docstring parameter name PR #237.
Fix UMAP spectral init docstring PR #207.
Add warning when distributed launch detected without GPU PR #238.
Removed#
Documentation#
Add multi-GPU distributed training documentation PR #243.
Add DistributedPCA documentation PR #252.
Add DataLoader feature documentation PR #245.
Reorganize User Guide and API documentation PR #244.
Improve FAISS installation error detection and messages PR #227.
Fix documentation warnings and improve README PR #239.
Version 0.3 (2025-07-15)#
New algorithms (PHATE, PACMAP), torch.compile support, and Python 3.8+ compatibility.
Added#
Add PHATE algorithm PR #185.
Add PACMAP algorithm PR #182.
Add COSNE support for hyperbolic embeddings PR #178.
Add support for torch.compile PR #194.
Add direct gradient computation for neighbor embeddings PR #196.
Add support for any Torch optimizer or scheduler PR #174.
Add automatic duplicate handling PR #188.
Changed#
Optimize UMAP memory via direct gradient computation and edge masking PR #198.
Make affinity_out optional in AffinityMatcher PR #186.
Standardize logging across modules PR #187.
Enhance logging with timing information PR #193.
Align DRModule with scikit-learn API and improve type hints PR #191.
Reorganize affinity module structure PR #189.
Ensure compatibility with Python 3.8+ PR #173.
Fixed#
Version 0.2 (2025-02-07)#
FAISS support, incremental PCA, and improved developer tooling.
Added#
Add FAISS support for k-NN PR #160.
Add extensible k-NN backend system PR #159.
Add incremental PCA PR #137.
Add automatic fallback to KeOps backend on out-of-memory errors PR #130.
Add improved random seeding system PR #154.
Add CIFAR examples with DINOv2 features PR #158.
Add single-cell RNA-seq example with Census data PR #166.
Add pre-commit hooks for code quality PR #147.
Add code of conduct PR #127.
Add pull request template PR #125.
Changed#
Fixed#
Version 0.1 (2024-09-17)#
Initial release with core dimensionality reduction algorithms.
Added#
Add basic affinities: scalar product, Gaussian, and Student kernels.
Add k-NN normalized affinities: Self-tuning affinities and MAGIC.
Add doubly stochastic affinities with entropic and quadratic projections.
Add adaptive affinities with entropy control (entropic affinity) and symmetric version.
Add UMAP input and output affinities.
Add AffinityMatcher template for DR with gradient descent and custom affinities.
Add batched AffinityMatcher for efficient batch processing PR #12.
Add neighbor embedding methods: SNE, t-SNE, t-SNEkhorn, UMAP, LargeVis, InfoTSNE.
Add SampledNeighborEmbedding for efficient negative sampling PR #72.
Add template objects for neighbor embedding methods.
Add spectral embeddings via eigendecomposition of input affinity matrix.
Add Kernel PCA for nonlinear dimensionality reduction PR #41.
Add k-means clustering PR #111.
Add sparse affinity computations PR #70.
Add SparseAffinityMatcher PR #71.
Add transform method for affinities to apply to new data PR #69.
Add callable affinity objects PR #84.
Add pairwise symmetric distances with indices PR #75.
Add KeOps compatibility for all components except spectral embeddings.
Add silhouette score evaluation metric.
Changed#
Removed#
Remove SNEkhorn in favor of TSNEkhorn PR #90.