Move Trainable interface and add TrainingOptions #994
Workflow file for this run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# GENERATED FILE, do not edit | |
# This file was generated with Typeline | |
# generated from: workflows/test.ts | |
name: Automatic Tests | |
'on': | |
push: | |
branches: | |
- main | |
paths: | |
- lenskit*/**.py | |
- '**pyproject.toml' | |
- pixi.* | |
- requirements*.txt | |
- data/** | |
- .github/workflows/test.yml | |
pull_request: | |
paths: | |
- lenskit*/**.py | |
- '**pyproject.toml' | |
- pixi.* | |
- requirements*.txt | |
- data/** | |
- .github/workflows/test.yml | |
concurrency: | |
group: 'test-${{github.ref}}' | |
cancel-in-progress: true | |
jobs: | |
conda: | |
name: 'Conda Python ${{matrix.python}} on ${{matrix.platform}}' | |
runs-on: '${{matrix.platform}}' | |
timeout-minutes: 30 | |
strategy: | |
fail-fast: false | |
matrix: | |
python: | |
- py311 | |
- py312 | |
- py313 | |
platform: | |
- ubuntu-latest | |
- macos-latest | |
- windows-latest | |
exclude: | |
- python: py313 | |
platform: windows-latest | |
steps: | |
- name: "π Checkout" | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- uses: prefix-dev/setup-pixi@v0.8.1 | |
with: | |
pixi-version: latest | |
activate-environment: true | |
environments: 'test-${{matrix.python}}-core' | |
cache-write: false | |
log-level: vv | |
locked: false | |
frozen: true | |
- name: "π Inspect environment" | |
run: | | |
python -m lenskit.util.envcheck | |
- name: "ππ»ββ‘οΈ Test LKPY" | |
run: | | |
python -m pytest --verbose --log-file=test.log --durations=25 --cov=lenskit/lenskit lenskit/tests | |
- name: "π Coverage results" | |
if: '${{ !cancelled() }}' | |
run: | | |
coverage xml | |
coverage report | |
cp .coverage coverage.db | |
- name: "π€ Upload test results" | |
uses: actions/upload-artifact@v4 | |
if: '${{ !cancelled() }}' | |
with: | |
name: 'test-conda-${{matrix.platform}}-py${{matrix.python}}' | |
path: | | |
test*.log | |
coverage.db | |
coverage.xml | |
vanilla: | |
name: 'Vanilla Python ${{matrix.python}} on ${{matrix.platform}}' | |
runs-on: '${{matrix.platform}}' | |
timeout-minutes: 30 | |
strategy: | |
fail-fast: false | |
matrix: | |
python: | |
- '3.11' | |
- '3.12' | |
- '3.13' | |
platform: | |
- ubuntu-latest | |
- macos-latest | |
exclude: | |
- python: '3.13' | |
platform: macos-latest | |
steps: | |
- name: "π Checkout" | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- name: "π Set up Python" | |
id: install-python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: '${{matrix.python}}' | |
- name: "πΆοΈ Set up uv" | |
run: | | |
pip install -U 'uv>=0.1.15' | |
- name: "π¦ Set up Python dependencies" | |
id: install-deps | |
run: | | |
uv pip install --python $PYTHON "./lenskit[test]" | |
shell: bash | |
env: | |
PYTHON: '${{steps.install-python.outputs.python-path}}' | |
- name: "π Inspect environment" | |
run: | | |
python -m lenskit.util.envcheck | |
- name: "ππ»ββ‘οΈ Test LKPY" | |
run: | | |
python -m pytest --verbose --log-file=test.log --durations=25 --cov=lenskit/lenskit lenskit/tests | |
- name: "π Coverage results" | |
if: '${{ !cancelled() }}' | |
run: | | |
coverage xml | |
coverage report | |
cp .coverage coverage.db | |
- name: "π€ Upload test results" | |
uses: actions/upload-artifact@v4 | |
if: '${{ !cancelled() }}' | |
with: | |
name: 'test-vanilla-${{matrix.platform}}-py${{matrix.python}}' | |
path: | | |
test*.log | |
coverage.db | |
coverage.xml | |
nojit: | |
name: Non-JIT test coverage | |
runs-on: ubuntu-latest | |
timeout-minutes: 30 | |
steps: | |
- name: "π Checkout" | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- uses: prefix-dev/setup-pixi@v0.8.1 | |
with: | |
pixi-version: latest | |
activate-environment: true | |
environments: test-py311-funksvd | |
cache-write: false | |
log-level: vv | |
locked: false | |
frozen: true | |
- name: "π Inspect environment" | |
run: | | |
python -m lenskit.util.envcheck | |
- name: "ππ»ββ‘οΈ Test LKPY" | |
run: | | |
python -m pytest --verbose --log-file=test.log --durations=25 -m 'not slow' --cov=lenskit/lenskit --cov=lenskit-funksvd/lenskit lenskit/tests lenskit-funksvd/tests | |
env: | |
NUMBA_DISABLE_JIT: 1 | |
PYTORCH_JIT: 0 | |
- name: "π Coverage results" | |
if: '${{ !cancelled() }}' | |
run: | | |
coverage xml | |
coverage report | |
cp .coverage coverage.db | |
- name: "π€ Upload test results" | |
uses: actions/upload-artifact@v4 | |
if: '${{ !cancelled() }}' | |
with: | |
name: test-nojit | |
path: | | |
test*.log | |
coverage.db | |
coverage.xml | |
mindep: | |
name: Minimal dependency tests | |
runs-on: ubuntu-latest | |
timeout-minutes: 30 | |
steps: | |
- name: "π Checkout" | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- name: "π Set up Python" | |
id: install-python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: '3.11' | |
- name: "πΆοΈ Set up uv" | |
run: | | |
pip install -U 'uv>=0.1.15' | |
- name: "π¦ Set up Python dependencies" | |
id: install-deps | |
run: | | |
uv pip install --python $PYTHON "./lenskit[test]" --resolution=lowest-direct | |
shell: bash | |
env: | |
PYTHON: '${{steps.install-python.outputs.python-path}}' | |
- name: "π Inspect environment" | |
run: | | |
python -m lenskit.util.envcheck | |
- name: "ππ»ββ‘οΈ Test LKPY" | |
run: | | |
python -m pytest --verbose --log-file=test.log --durations=25 --cov=lenskit/lenskit lenskit/tests | |
- name: "π Coverage results" | |
if: '${{ !cancelled() }}' | |
run: | | |
coverage xml | |
coverage report | |
cp .coverage coverage.db | |
- name: "π€ Upload test results" | |
uses: actions/upload-artifact@v4 | |
if: '${{ !cancelled() }}' | |
with: | |
name: test-mindep | |
path: | | |
test*.log | |
coverage.db | |
coverage.xml | |
sklearn: | |
name: 'Scikit-Learn tests on Python ${{matrix.python}}' | |
runs-on: ubuntu-latest | |
timeout-minutes: 30 | |
strategy: | |
fail-fast: false | |
matrix: | |
python: | |
- py311 | |
- py312 | |
- py313 | |
steps: | |
- name: "π Checkout" | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- uses: prefix-dev/setup-pixi@v0.8.1 | |
with: | |
pixi-version: latest | |
activate-environment: true | |
environments: 'test-${{matrix.python}}-sklearn' | |
cache-write: false | |
log-level: vv | |
locked: false | |
frozen: true | |
- name: "π Inspect environment" | |
run: | | |
python -m lenskit.util.envcheck | |
- name: "ππ»ββ‘οΈ Test LKPY" | |
run: | | |
python -m pytest --verbose --log-file=test.log --durations=25 --cov=lenskit-sklearn/lenskit lenskit-sklearn/tests | |
- name: "π Coverage results" | |
if: '${{ !cancelled() }}' | |
run: | | |
coverage xml | |
coverage report | |
cp .coverage coverage.db | |
- name: "π€ Upload test results" | |
uses: actions/upload-artifact@v4 | |
if: '${{ !cancelled() }}' | |
with: | |
name: 'test-sklearn-py${{matrix.python}}' | |
path: | | |
test*.log | |
coverage.db | |
coverage.xml | |
sklearn-mindep: | |
name: Minimal dependency tests for Scikit-Learn | |
runs-on: ubuntu-latest | |
timeout-minutes: 30 | |
steps: | |
- name: "π Checkout" | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- name: "π Set up Python" | |
id: install-python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: '3.11' | |
- name: "πΆοΈ Set up uv" | |
run: | | |
pip install -U 'uv>=0.1.15' | |
- name: "π¦ Set up Python dependencies" | |
id: install-deps | |
run: | | |
uv pip install --python $PYTHON "./lenskit[test]" "./lenskit-sklearn" --resolution=lowest-direct | |
shell: bash | |
env: | |
PYTHON: '${{steps.install-python.outputs.python-path}}' | |
- name: "π Inspect environment" | |
run: | | |
python -m lenskit.util.envcheck | |
- name: "ππ»ββ‘οΈ Test LKPY" | |
run: | | |
python -m pytest --verbose --log-file=test.log --durations=25 --cov=lenskit-sklearn/lenskit lenskit-sklearn/tests | |
- name: "π Coverage results" | |
if: '${{ !cancelled() }}' | |
run: | | |
coverage xml | |
coverage report | |
cp .coverage coverage.db | |
- name: "π€ Upload test results" | |
uses: actions/upload-artifact@v4 | |
if: '${{ !cancelled() }}' | |
with: | |
name: test-mindep-sklearn | |
path: | | |
test*.log | |
coverage.db | |
coverage.xml | |
funksvd: | |
name: 'FunkSVD tests on Python ${{matrix.python}}' | |
runs-on: ubuntu-latest | |
timeout-minutes: 30 | |
strategy: | |
fail-fast: false | |
matrix: | |
python: | |
- py311 | |
- py312 | |
steps: | |
- name: "π Checkout" | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- uses: prefix-dev/setup-pixi@v0.8.1 | |
with: | |
pixi-version: latest | |
activate-environment: true | |
environments: 'test-${{matrix.python}}-funksvd' | |
cache-write: false | |
log-level: vv | |
locked: false | |
frozen: true | |
- name: "π Inspect environment" | |
run: | | |
python -m lenskit.util.envcheck | |
- name: "ππ»ββ‘οΈ Test LKPY" | |
run: | | |
python -m pytest --verbose --log-file=test.log --durations=25 --cov=lenskit-funksvd/lenskit lenskit-funksvd/tests | |
- name: "π Coverage results" | |
if: '${{ !cancelled() }}' | |
run: | | |
coverage xml | |
coverage report | |
cp .coverage coverage.db | |
- name: "π€ Upload test results" | |
uses: actions/upload-artifact@v4 | |
if: '${{ !cancelled() }}' | |
with: | |
name: 'test-funksvd-py${{matrix.python}}' | |
path: | | |
test*.log | |
coverage.db | |
coverage.xml | |
funksvd-mindep: | |
name: Minimal dependency tests for FunkSVD | |
runs-on: ubuntu-latest | |
timeout-minutes: 30 | |
steps: | |
- name: "π Checkout" | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- name: "π Set up Python" | |
id: install-python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: '3.11' | |
- name: "πΆοΈ Set up uv" | |
run: | | |
pip install -U 'uv>=0.1.15' | |
- name: "π¦ Set up Python dependencies" | |
id: install-deps | |
run: | | |
uv pip install --python $PYTHON "./lenskit[test]" "./lenskit-funksvd" --resolution=lowest-direct | |
shell: bash | |
env: | |
PYTHON: '${{steps.install-python.outputs.python-path}}' | |
- name: "π Inspect environment" | |
run: | | |
python -m lenskit.util.envcheck | |
- name: "ππ»ββ‘οΈ Test LKPY" | |
run: | | |
python -m pytest --verbose --log-file=test.log --durations=25 --cov=lenskit-funksvd/lenskit lenskit-funksvd/tests | |
- name: "π Coverage results" | |
if: '${{ !cancelled() }}' | |
run: | | |
coverage xml | |
coverage report | |
cp .coverage coverage.db | |
- name: "π€ Upload test results" | |
uses: actions/upload-artifact@v4 | |
if: '${{ !cancelled() }}' | |
with: | |
name: test-mindep-funksvd | |
path: | | |
test*.log | |
coverage.db | |
coverage.xml | |
implicit: | |
name: 'Implicit bridge tests on Python ${{matrix.python}}' | |
runs-on: ubuntu-latest | |
timeout-minutes: 30 | |
strategy: | |
fail-fast: false | |
matrix: | |
python: | |
- py311 | |
- py312 | |
steps: | |
- name: "π Checkout" | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- uses: prefix-dev/setup-pixi@v0.8.1 | |
with: | |
pixi-version: latest | |
activate-environment: true | |
environments: 'test-${{matrix.python}}-implicit' | |
cache-write: false | |
log-level: vv | |
locked: false | |
frozen: true | |
- name: "π Inspect environment" | |
run: | | |
python -m lenskit.util.envcheck | |
- name: "ππ»ββ‘οΈ Test LKPY" | |
run: | | |
python -m pytest --verbose --log-file=test.log --durations=25 --cov=lenskit-implicit/lenskit lenskit-implicit/tests | |
- name: "π Coverage results" | |
if: '${{ !cancelled() }}' | |
run: | | |
coverage xml | |
coverage report | |
cp .coverage coverage.db | |
- name: "π€ Upload test results" | |
uses: actions/upload-artifact@v4 | |
if: '${{ !cancelled() }}' | |
with: | |
name: 'test-implicit-py${{matrix.python}}' | |
path: | | |
test*.log | |
coverage.db | |
coverage.xml | |
implicit-mindep: | |
name: Minimal dependency tests for Implicit | |
runs-on: ubuntu-latest | |
timeout-minutes: 30 | |
steps: | |
- name: "π Checkout" | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- name: "π Set up Python" | |
id: install-python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: '3.11' | |
- name: "πΆοΈ Set up uv" | |
run: | | |
pip install -U 'uv>=0.1.15' | |
- name: "π¦ Set up Python dependencies" | |
id: install-deps | |
run: | | |
uv pip install --python $PYTHON "./lenskit[test]" "./lenskit-implicit" --resolution=lowest-direct | |
shell: bash | |
env: | |
PYTHON: '${{steps.install-python.outputs.python-path}}' | |
- name: "π Inspect environment" | |
run: | | |
python -m lenskit.util.envcheck | |
- name: "ππ»ββ‘οΈ Test LKPY" | |
run: | | |
python -m pytest --verbose --log-file=test.log --durations=25 --cov=lenskit-implicit/lenskit lenskit-implicit/tests | |
- name: "π Coverage results" | |
if: '${{ !cancelled() }}' | |
run: | | |
coverage xml | |
coverage report | |
cp .coverage coverage.db | |
- name: "π€ Upload test results" | |
uses: actions/upload-artifact@v4 | |
if: '${{ !cancelled() }}' | |
with: | |
name: test-mindep-implicit | |
path: | | |
test*.log | |
coverage.db | |
coverage.xml | |
hpf: | |
name: 'HPF bridge tests on Python ${{matrix.python}}' | |
runs-on: ubuntu-latest | |
timeout-minutes: 30 | |
strategy: | |
fail-fast: false | |
matrix: | |
python: | |
- py311 | |
- py312 | |
steps: | |
- name: "π Checkout" | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- uses: prefix-dev/setup-pixi@v0.8.1 | |
with: | |
pixi-version: latest | |
activate-environment: true | |
environments: 'test-${{matrix.python}}-hpf' | |
cache-write: false | |
log-level: vv | |
locked: false | |
frozen: true | |
- name: "π Inspect environment" | |
run: | | |
python -m lenskit.util.envcheck | |
- name: "ππ»ββ‘οΈ Test LKPY" | |
run: | | |
python -m pytest --verbose --log-file=test.log --durations=25 --cov=lenskit-hpf/lenskit lenskit-hpf/tests | |
- name: "π Coverage results" | |
if: '${{ !cancelled() }}' | |
run: | | |
coverage xml | |
coverage report | |
cp .coverage coverage.db | |
- name: "π€ Upload test results" | |
uses: actions/upload-artifact@v4 | |
if: '${{ !cancelled() }}' | |
with: | |
name: 'test-hpf-py${{matrix.python}}' | |
path: | | |
test*.log | |
coverage.db | |
coverage.xml | |
eval-tests: | |
name: Evaluation-based tests | |
runs-on: ubuntu-latest | |
steps: | |
- name: "π Checkout" | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- uses: prefix-dev/setup-pixi@v0.8.1 | |
with: | |
pixi-version: latest | |
activate-environment: true | |
environments: test-py311-full | |
cache-write: false | |
log-level: vv | |
locked: false | |
frozen: true | |
- name: Cache ML data | |
uses: actions/cache@v4 | |
with: | |
path: | | |
data | |
!data/*.zip | |
key: test-mldata-001-ml-100k-ml-20m | |
- name: Download ML data | |
run: | | |
python -m lenskit.data.fetch ml-100k ml-20m | |
- name: Run Eval Tests | |
run: | | |
pytest --cov=lenskit/lenskit --cov=lenskit-funksvd/lenskit --cov=lenskit-implicit/lenskit --cov=lenskit-hpf/lenskit -m 'eval or realdata' --log-file test-eval.log */tests | |
- name: "π Coverage results" | |
if: '${{ !cancelled() }}' | |
run: | | |
coverage xml | |
coverage report | |
cp .coverage coverage.db | |
- name: "π€ Upload test results" | |
uses: actions/upload-artifact@v4 | |
if: '${{ !cancelled() }}' | |
with: | |
name: test-eval-tests | |
path: | | |
test*.log | |
coverage.db | |
coverage.xml | |
doc-tests: | |
name: 'Demos, examples, and docs' | |
runs-on: ubuntu-latest | |
steps: | |
- name: "π Checkout" | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- uses: prefix-dev/setup-pixi@v0.8.1 | |
with: | |
pixi-version: latest | |
activate-environment: true | |
environments: test-examples | |
cache-write: false | |
log-level: vv | |
locked: false | |
frozen: true | |
- name: Cache ML data | |
uses: actions/cache@v4 | |
with: | |
path: | | |
data | |
!data/*.zip | |
key: test-mldata-001-ml-100k-ml-1m-ml-10m-ml-20m | |
- name: Download ML data | |
run: | | |
python -m lenskit.data.fetch ml-100k ml-1m ml-10m ml-20m | |
- name: "π Validate code examples" | |
run: | | |
sphinx-build -b doctest docs build/doc | |
- name: "π Validate example notebooks" | |
run: | | |
pytest --cov=lenskit/lenskit --cov=lenskit-funksvd/lenskit --cov=lenskit-implicit/lenskit --cov=lenskit-hpf/lenskit --nbval-lax --log-file test-notebooks.log docs | |
- name: "π Coverage results" | |
if: '${{ !cancelled() }}' | |
run: | | |
coverage xml | |
coverage report | |
cp .coverage coverage.db | |
- name: "π€ Upload test results" | |
uses: actions/upload-artifact@v4 | |
if: '${{ !cancelled() }}' | |
with: | |
name: test-examples | |
path: | | |
test*.log | |
coverage.db | |
coverage.xml | |
results: | |
name: Test suite results | |
runs-on: ubuntu-latest | |
needs: | |
- conda | |
- vanilla | |
- nojit | |
- mindep | |
- sklearn | |
- sklearn-mindep | |
- funksvd | |
- funksvd-mindep | |
- implicit | |
- implicit-mindep | |
- hpf | |
- eval-tests | |
- doc-tests | |
if: '${{ !cancelled() }}' | |
steps: | |
- name: "π Checkout" | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- name: Add upstream remote & author config | |
run: | | |
git remote add upstream https://github.com/lenskit/lkpy.git | |
git fetch upstream | |
git config user.name "LensKit Bot" | |
git config user.email lkbot@lenskit.org | |
- uses: prefix-dev/setup-pixi@v0.8.1 | |
with: | |
pixi-version: latest | |
activate-environment: true | |
environments: report | |
cache-write: false | |
log-level: vv | |
locked: false | |
frozen: true | |
- name: "π₯ Download test artifacts" | |
uses: actions/download-artifact@v4 | |
with: | |
pattern: test-* | |
path: test-logs | |
- name: "π List log files" | |
run: ls -laR test-logs | |
- name: "π§ Fix coverage databases" | |
run: | | |
for dbf in test-logs/*/coverage.db; do | |
echo "fixing $dbf" | |
sqlite3 -echo "$dbf" "UPDATE file SET path = replace(path, '\', '/');" | |
done | |
- name: β Merge and report | |
run: | | |
coverage combine --keep test-logs/*/coverage.db | |
coverage xml | |
coverage html -d lenskit-coverage | |
coverage report --format=markdown >coverage.md | |
- name: Analyze diff coverage | |
if: github.event_name == 'pull_request' | |
run: | | |
diff-cover --json-report diff-cover.json --markdown-report diff-cover.md \ | |
coverage.xml |tee diff-cover.txt | |
- name: "π€ Upload coverage to CodeCov" | |
uses: codecov/codecov-action@v4.2.0 | |
env: | |
CODECOV_TOKEN: ab58c9cf-25b8-4283-a485-0b6382dc9a61 | |
- name: "π« Fail if coverage is too low" | |
run: coverage report --fail-under=90 |