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_ari PR #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#

  • Remove clustering module PR #212.

  • Remove unnormalized affinity PR #209.

  • Remove use_float16 parameter from FaissConfig PR #228.

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#

  • Fix PyKeOps and FAISS import errors PR #177.

  • Fix hyperbolic optimization without geoopt dependency PR #183.

  • Fix InfoTSNE docstring typo PR #184.

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#

  • Rename tol parameter to min_grad_norm PR #162.

  • Switch to Ruff for fast linting and formatting PR #151.

  • Improve citation style via sphinxcontrib-bibtex PR #143.

  • Set sparsity to True by default PR #156.

Fixed#

  • Fix clustering base methods PR #126.

  • Fix documentation consistency with bibliography PR #144.

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#

  • Improve UMAP and LargeVis with stable attractive term PR #89.

  • Support affinity initialization from precomputed arrays PR #80.

  • Rename Gibbs affinity to Gaussian affinity PR #74.

  • Make PyKeOps an optional dependency PR #77.

Removed#

  • Remove SNEkhorn in favor of TSNEkhorn PR #90.