Releases: lenskit/lkpy
Small fix - NumPy compat and LightGCN eval mode
This is a small bugfix / cleanup / compat fix for LensKit 2025.6.
What's Changed
- Remove tests that break with NumPy 2.4 ArrayLike changes by @mdekstrand in #977
- Put LightGCN in eval mode after training (2025) by @mdekstrand in #975
- Drop failing x86 wheel builds (2025) by @mdekstrand in #979
Full Changelog: v2025.6.2...v2025.6.3
NDCG bugfix with missing data
Fixes a bug where NDCG would divide by zero when there are no test items for the user.
What's Changed
- Resolves #956: Fix NDCG ZeroDivisionError by @samiravaez in #957
- Add E-R diagram to illustrate the data model by @mdekstrand in #962
Full Changelog: v2025.6.1...v2025.6.2
Bug + missing feature update for 2025.6
This is a quick bug-fix and missing-feature release for 2025.6.
6th 2025 Improvement
Another feature release for 2025, with some bug fixes as well.
See the release notes for user-friendly details.
What's Changed
- Update PyArrow to 22.x by @mdekstrand in #914
- Build Conda packages on MacOS Intel by @mdekstrand in #913
- Update locked dependencies and support Python 3.14 by @mdekstrand in #915
- CI build and test coverage updates by @mdekstrand in #919
- FA*IR: bug fixes and test updates by @samiravaez in #918
- ItemKNN: return neighbor counts + disable scoring parallelism by @mdekstrand in #922
- Add
rank_biased_precisionfunction that takes explicit weights by @sushobhan2024 in #923 - Add unified object representation function and more str/repr implementations by @mdekstrand in #924
- De-flake the stochastic tests by @mdekstrand in #925
- Add Bash-based CLI tests by @mdekstrand in #926
- Add concat and merge operations to ItemList by @mdekstrand in #927
- Reduce test burden for PyTorch-optimized components by @mdekstrand in #928
- Add initial support for session-based recommendation by @mdekstrand in #929
- Add
cat_matrixtoAttributeSetby @sushobhan2024 in #912 - FAIR: select protected items when they are ranked before unprotected items by @samiravaez in #939
- Add additional support and tests for generating session recommendations by @mdekstrand in #945
- Add co_occurrence method to relationships by @mdekstrand in #950
Full Changelog: v2025.5.0...v2025.6.0
Fifth improvement release
Some small renames and updates, along with entropy functions. Finalized a couple weeks ago but not released.
What's Changed
- Rename rank metric
karguments tonby @mdekstrand in #902 - Rename MetricAccumulator to MeasurementCollector by @mdekstrand in #906
- Add entropy and rank biased entropy by @sushobhan2024 in #890
- Add Rust test coverage support and clean up test CI by @mdekstrand in #909
Full Changelog: v2025.4.0...v2025.5.0
Fourth 2025 Improvement Release
These improvements are relatively minor, but are new features, so I'm bumping to 2025.4.
What's Changed
- Add additional Arrow CSR manipulation, including matrix transpose by @mdekstrand in #893
- Use pipelines to test scorers by @mdekstrand in #895
- Add PipelineProfiler to support collecting performance profiles on pipeline runs by @mdekstrand in #897
- Add Torch random_generator option and use in FlexMF by @mdekstrand in #898
- Update user guide to UsesTrainer + provide default finalize implementation by @mdekstrand in #899
- Improvements to stochastic tests by @mdekstrand in #900
Full Changelog: v2025.3.2...v2025.4.0
2025.3 Bugfix
This has a few small bugfixes, along with some experimental feature updates, for the 2025.3 series.
What's Changed
- Fix Jupyter progress bar rate limit by @mdekstrand in #876
- Simplify and refactor component tests by @mdekstrand in #879
- Update conda build + increase flaky retries by @mdekstrand in #882
- Update Dataset and ItemList repr functions by @mdekstrand in #877
- Fall back to normal model when Dynamo compilation fails by @mdekstrand in #883
- Exclude missing values from sparse matrix attribute representations by @mdekstrand in #884
- FAIR reranker: minor fixes and refinement by @samiravaez in #885
- Fix exponential embedding sizes and tuning settings by @mdekstrand in #886
- Add reranking behavior metrics: rbo and lip by @sushobhan2024 in #856
Full Changelog: v2025.3.1...v2025.3.2
Corrected 2025 Second Update
Corrected version of 2025.3.0 to fix publishing and versioning errors.
2025 Second Update
Second major feature update + bugfix release for the 2025 series! Many changes, see the milestone and release notes for more.
Merged PRs
- Simplify test workfow by @mdekstrand in #666
- Add StochasticTopNSampler to be correct version of "softmax" sampler by @mdekstrand in #667
- Add flexible Torch matrix factorizer by @mdekstrand in #668
- Export configuration classes from lenskit.basic by @mdekstrand in #672
- Improve logging in Ray cluster setups by @mdekstrand in #673
- Limit test users to only have users who had item in the train data. by @sushobhan2024 in #676
- Add train and recommend commands to the CLI by @mdekstrand in #677
- Improve NumPy -> Torch conversions for read-only data by @mdekstrand in #680
- Reduce excess matrix manipulations in item-KNN by @mdekstrand in #678
- Improve progress bar update API by @mdekstrand in #681
- Update FlexMF parameters to better defaults by @mdekstrand in #682
- Run Doctor under coverage by @mdekstrand in #683
- Use uv for development environments instead of pixi by @mdekstrand in #700
- Add lenskit.state module and move the ParameterContainer interface by @mdekstrand in #702
- Create and use separate ModelTrainer objects by @mdekstrand in #701
- Support training checkpointing in ALS by @mdekstrand in #704
- Add CPU & GPU groups by @mdekstrand in #706
- Improve logging and reduce sorting in dataset relationships by @mdekstrand in #707
- Improve debug logging and add xopen to CLI by @mdekstrand in #708
- Introduce WARP loss to FlexMF by @mdekstrand in #709
- Build with setuptools instead of hatch by @mdekstrand in #710
- Add better compression support to CLI by @mdekstrand in #712
- Update pre-commit hook versions by @mdekstrand in #713
- Add Rust extension infrastructure and accelerate ItemKNN by @mdekstrand in #715
- Replace just with invoke for development tasks by @mdekstrand in #716
- Add versions to dataset schemas by @mdekstrand in #721
- Add SparseRow extension type for CSRs in Arrow by @mdekstrand in #722
- Use Rust to accelerate negative sampling by @mdekstrand in #723
- Re-add progress bars and signal checking to Item KNN builder by @mdekstrand in #724
- Add ndarray dep and use it for sampling by @mdekstrand in #725
- Use Maturin to simplify build setup by @mdekstrand in #726
- Reduce base structure memory consumption by @mdekstrand in #728
- Add Rust acceleration to User KNN by @mdekstrand in #730
- Rewrite ALS solvers in Rust by @mdekstrand in #731
- Rewrite FunkSVD in Rust by @mdekstrand in #732
- Build with ABI3 and maturin-action by @mdekstrand in #733
- Add SPEC-1 (Lazy Loading) and incorporate version numbers into docs by @mdekstrand in #736
- Implement is_sorted for matrix tables in Rust by @mdekstrand in #737
- Correctly detect no-genre movies in MovieLens by @mdekstrand in #738
- Adding Mean Average Precision by @albus-droid in #739
- Add tests to avoid overflow in softmax stochastic sampling by @mdekstrand in #742
- Add configurable weighting models by @mdekstrand in #744
- Parallelize item-item scoring by @mdekstrand in #745
- Support comma-separated lists for uniform nested parallelism configuration by @mdekstrand in #746
- Test and fix crash on Linux ARM by @mdekstrand in #748
- Update ALS solve to zero rows for no-info users/items by @mdekstrand in #749
- Add importers for UCSD Amazon data by @mdekstrand in #751
- refactor FlexMF with less string compares by @mdekstrand in #752
- Add sklearn NMF as a scorer by @FroggoLight in #741
- Speed up ItemList isin checks and evaluation metrics by @mdekstrand in #753
- Speed up ItemList indexing by @mdekstrand in #754
- Add Gini coefficient metrics by @mdekstrand in #755
- Speed up weight computations by @mdekstrand in #756
- Speed up weighted metrics by @mdekstrand in #757
- Add ItemList.top_n and speed up ItemList operations by @mdekstrand in #758
- Add subprocess progress reporting by @mdekstrand in #759
- Add a rate limiter and use ray.wait to manage Ray concurrency by @mdekstrand in #763
- Switch back to Just + docopt by @mdekstrand in #764
- Add lenskit data subset command, improve ItemListCollection conversion, and support random seeds in the CLI by @mdekstrand in #773
- Force Python UTF-8 mode for license hader update in pre-commit by @mdekstrand in #774
- Refactored batch accuracy tests into standard suite by @FroggoLight in #776
- Use pytest-retry to retry the flaky stochastic ranker test by @mdekstrand in #783
- Add component input hooks to the pipeline by @mdekstrand in #782
- Add additional tests to verify training item filtering by @mdekstrand in #788
- Use 64-bit row pointers in matrix relationship sets by @mdekstrand in #789
- Improve dataset documentation by @mdekstrand in #790
- Increaes minimum PyArrow vesion by @mdekstrand in #791
- Add LensKit settings and power querying by @mdekstrand in #794
- Revise documentation to be main site by @mdekstrand in #798
- Add devcontainer and update development dependencies by @mdekstrand in #799
- Automatically search up for lenskit.toml in CLI by @mdekstrand in #802
- Fix syntax in testsetup for item-list docs by @mdekstrand in #805
- added binarize_ratings function in DatasetBuilder by @vibhor-5 in #803
- Fix locate_configuration_root and Conda tests by @mdekstrand in #808
- Drop PyTorch max and update locked dependencies by @mdekstrand in #807
- Work around Ray extension type serialization errors by @mdekstrand in #809
- Use Rust-based hash table instead of Pandas index to implement Vocabulary by @mdekstrand in #811
- Refactor indirect hashtables to support reuse by @mdekstrand in #813
- Use uvx --isolated for compat tests by @mdekstrand in #816
- Use mise tasks instead of just by @mdekstrand in #814
- Implement a CoordinateTable structure for fast duplicate checking by @mdekstrand in #815
- Improve recommend CLI for batch inference, output, profiling by @mdekstrand in #817
- Fix coordinate table breakage when adding interactions after filtering or removing by @mdekstrand in #820
- Simplify PyPI CUDA setup by @mdekstrand in #824
- Implement usable pipeline configuration files and CLI support by @mdekstrand in #831
- Implement faster negative sampling and use CoordinateTable by @mdekstrand in #832
- More FlexMF performance improvements by @mdekstrand in #840
- Add parallel config to lenskit doctor by @mdekstrand in #842
- Add support for repeated interactions by @FroggoLight in #812
- Make list metric DF have a standard Index when there is one key field by @mdekstrand in #845
- Add torch-geometric and LightGCN by @mdekstrand in #822
- Unify list and decomposed metric interfac...
Release fix for 2025.3.0a3
Small fix to the release process for 2025.3.0a3.