lenskit / lkpy

Python recommendation toolkit
https://lkpy.lenskit.org
MIT License
270 stars 61 forks source link

Make pipeline fallback work when nodes fail transitively #464

Closed mdekstrand closed 3 months ago

mdekstrand commented 4 months ago

This adds transitive fallback support: if A depends on B and B is missing or returns None, then the fallback should proceed to the next item instead of failing because A failed. The old behavior was that the fallback would only work if one of its direct dependencies yielded the missing data.

github-actions[bot] commented 4 months ago

The GitHub 🤖 has run the tests on your PR.

Covered 92.31% of diff (coverage changed 0.01% from 92.49% to 92.50%).

origin/main...HEAD, staged and unstaged changes - lenskit/lenskit/pipeline/runner.py (92.3%): Missing lines 69 ## Summary - **Total**: 13 lines - **Missing**: 1 line - **Coverage**: 92%
Source Coverage Report | Name | Stmts | Miss | Cover | |----------------------------------------------- | -------: | -------: | ------: | | lenskit-funksvd/lenskit/funksvd.py | 187 | 8 | 96% | | lenskit-hpf/lenskit/hpf.py | 24 | 0 | 100% | | lenskit-implicit/lenskit/implicit.py | 94 | 9 | 90% | | lenskit/lenskit/algorithms/\_\_init\_\_.py | 67 | 8 | 88% | | lenskit/lenskit/algorithms/als/\_\_init\_\_.py | 3 | 0 | 100% | | lenskit/lenskit/algorithms/als/common.py | 129 | 2 | 98% | | lenskit/lenskit/algorithms/als/explicit.py | 121 | 3 | 98% | | lenskit/lenskit/algorithms/als/implicit.py | 112 | 1 | 99% | | lenskit/lenskit/algorithms/basic.py | 161 | 4 | 98% | | lenskit/lenskit/algorithms/bias.py | 150 | 3 | 98% | | lenskit/lenskit/algorithms/knn/\_\_init\_\_.py | 3 | 0 | 100% | | lenskit/lenskit/algorithms/knn/item.py | 303 | 17 | 94% | | lenskit/lenskit/algorithms/knn/user.py | 178 | 11 | 94% | | lenskit/lenskit/algorithms/mf\_common.py | 61 | 0 | 100% | | lenskit/lenskit/algorithms/ranking.py | 75 | 11 | 85% | | lenskit/lenskit/algorithms/svd.py | 75 | 4 | 95% | | lenskit/lenskit/batch/\_\_init\_\_.py | 2 | 0 | 100% | | lenskit/lenskit/batch/\_predict.py | 30 | 2 | 93% | | lenskit/lenskit/batch/\_recommend.py | 46 | 4 | 91% | | lenskit/lenskit/crossfold.py | 136 | 2 | 99% | | lenskit/lenskit/data/\_\_init\_\_.py | 8 | 0 | 100% | | lenskit/lenskit/data/checks.py | 37 | 0 | 100% | | lenskit/lenskit/data/dataset.py | 364 | 19 | 95% | | lenskit/lenskit/data/fetch.py | 38 | 28 | 26% | | lenskit/lenskit/data/items.py | 176 | 11 | 94% | | lenskit/lenskit/data/matrix.py | 115 | 5 | 96% | | lenskit/lenskit/data/movielens.py | 96 | 18 | 81% | | lenskit/lenskit/data/mtarray.py | 57 | 3 | 95% | | lenskit/lenskit/data/tables.py | 25 | 0 | 100% | | lenskit/lenskit/data/vocab.py | 90 | 7 | 92% | | lenskit/lenskit/diagnostics.py | 4 | 0 | 100% | | lenskit/lenskit/math/\_\_init\_\_.py | 0 | 0 | 100% | | lenskit/lenskit/math/solve.py | 6 | 0 | 100% | | lenskit/lenskit/metrics/\_\_init\_\_.py | 0 | 0 | 100% | | lenskit/lenskit/metrics/predict.py | 32 | 0 | 100% | | lenskit/lenskit/metrics/topn.py | 212 | 1 | 99% | | lenskit/lenskit/parallel/\_\_init\_\_.py | 4 | 0 | 100% | | lenskit/lenskit/parallel/chunking.py | 20 | 1 | 95% | | lenskit/lenskit/parallel/config.py | 65 | 8 | 88% | | lenskit/lenskit/parallel/invoker.py | 31 | 2 | 94% | | lenskit/lenskit/parallel/pool.py | 54 | 9 | 83% | | lenskit/lenskit/parallel/sequential.py | 22 | 0 | 100% | | lenskit/lenskit/parallel/serialize.py | 51 | 1 | 98% | | lenskit/lenskit/parallel/worker.py | 43 | 3 | 93% | | lenskit/lenskit/pipeline/\_\_init\_\_.py | 177 | 9 | 95% | | lenskit/lenskit/pipeline/common.py | 5 | 1 | 80% | | lenskit/lenskit/pipeline/components.py | 25 | 0 | 100% | | lenskit/lenskit/pipeline/nodes.py | 49 | 1 | 98% | | lenskit/lenskit/pipeline/runner.py | 84 | 1 | 99% | | lenskit/lenskit/pipeline/types.py | 56 | 2 | 96% | | lenskit/lenskit/splitting/\_\_init\_\_.py | 4 | 0 | 100% | | lenskit/lenskit/splitting/holdout.py | 56 | 4 | 93% | | lenskit/lenskit/splitting/records.py | 55 | 0 | 100% | | lenskit/lenskit/splitting/split.py | 27 | 6 | 78% | | lenskit/lenskit/splitting/users.py | 60 | 0 | 100% | | lenskit/lenskit/topn.py | 109 | 25 | 77% | | lenskit/lenskit/util/\_\_init\_\_.py | 72 | 19 | 74% | | lenskit/lenskit/util/envcheck.py | 57 | 44 | 23% | | lenskit/lenskit/util/logging.py | 19 | 0 | 100% | | lenskit/lenskit/util/random.py | 26 | 3 | 88% | | lenskit/lenskit/util/test.py | 103 | 19 | 82% | | lenskit/lenskit/util/timing.py | 28 | 0 | 100% | | **TOTAL** | **4519** | **339** | **92%** |