2026 Releases ============= 2026 builds on the foundation of :ref:`2025 <2025>` to improve the ergonomics of data access, querying, and metrics, and clean up some APIs that seemed good at the time, while making it even easier to use LensKit for recommendation scenarios besides ID-based personalized recommendation. There are no new major paradigm shifts, though — pipelines, datasets, and components work as they do in the 2025 series, but with more features, some rough corners polished off the interfaces, and hopefully fewer bugs. .. _2026.0.0: 2026.0.0 ~~~~~~~~ Breaking Changes ---------------- - LensKit now requires Python 3.12 or newer, along with NumPy 2.x, Pandas 2.3 or newer, and SciPy 1.13 or newer (see :ref:`dep-policy`, :pr:`954`). - We no longer publish 32-bit binary wheels. - Removed ``DecomposedMetric``, as the :class:`~lenskit.metrics.Metric` interface is now decomposed. All metrics based on listwise measurements or intermediate results should directly extend from ``Metric`` or :class:`~lenskit.metrics.ListMetric`. (:pr:`983`) - ``GlobalMetric`` no longer inherits from ``Metric``, and may be removed in a future release. - Stopped providing wheels for macOS on Intel. Users who still need to run LensKit on Intel-based Macs should use the Conda packages (available in conda-forge and `prefix.dev`_). .. _prefix.dev: https://prefix.dev/channels/lenskit/ New Features ------------ - Added environment variables to :class:`~lenskit.training.TrainingOptions`, along with the :meth:`~lenskit.training.TrainingOptions.env_var` method to query them. This allows for open-ended configuration of training processes. - Added support for free-threaded Python, including binary distributions for Python 3.14t on Linux and macOS (:issue:`916`, :pr:`1022`). - Added support for parallel batch inference using thread pools on free-threaded Python (:issue:`921`, :pr:`1025`). - Added LightGCN support to FlexMF (:issue:`1019`, :pr:`1033`). Performance Changes ------------------- - :meth:`lenskit.data.RelationshipSet.co_occurrances` is much faster and uses parallel computation, at the expense of increased memory use in the symmetric (non-ordered) case (:issue:`970`, :pr:`1007`). Minor Changes ------------- - Pipeline type-checking for `ArrayLike` component inputs no longer works, due to a breaking change in NumPy 2.4. No LensKit components used `ArrayLike` as an input or output data type. - Pipeline component inputs with default values can now have missing inputs (:issue:`1000`, :pr:`1001`). - Rust progress updates now use a background thread to simplify logic and keep locks out of the work path (:pr:`1008`).