From 45e1e554ebeba141c9b1beccdaf770920dce98cb Mon Sep 17 00:00:00 2001 From: Tom Vander Aa Date: Fri, 6 Feb 2026 09:49:58 +0100 Subject: [PATCH 1/9] conda ci: add ubuntu-24.04-arm --- .github/workflows/conda.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/conda.yml b/.github/workflows/conda.yml index 7dc216a7..c5a074b6 100644 --- a/.github/workflows/conda.yml +++ b/.github/workflows/conda.yml @@ -15,7 +15,7 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - os: [ubuntu-latest, windows-latest, macos-15-intel, macos-15] + os: [ubuntu-24.04, ubuntu-24.04-arm, windows-latest, macos-15-intel, macos-15] python: [ "3.9", "3.10", "3.11", "3.12", "3.13" ] defaults: run: From 28daf0f9caa07ebfaefceec2c8bc5f44c063b2da Mon Sep 17 00:00:00 2001 From: Tom Vander Aa Date: Fri, 6 Feb 2026 11:27:49 +0100 Subject: [PATCH 2/9] conda ci: add python 3.14, remove python 3.9 --- .github/workflows/conda.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/conda.yml b/.github/workflows/conda.yml index c5a074b6..f900aaa1 100644 --- a/.github/workflows/conda.yml +++ b/.github/workflows/conda.yml @@ -16,7 +16,7 @@ jobs: strategy: matrix: os: [ubuntu-24.04, ubuntu-24.04-arm, windows-latest, macos-15-intel, macos-15] - python: [ "3.9", "3.10", "3.11", "3.12", "3.13" ] + python: [ "3.10", "3.11", "3.12", "3.13", "3.14" ] defaults: run: shell: bash -el {0} From b4292b0e7fa16f2e50774e6f00f5c61d1fdb7ffe Mon Sep 17 00:00:00 2001 From: Tom Vander Aa Date: Fri, 6 Feb 2026 11:37:42 +0100 Subject: [PATCH 3/9] wheels ci: add python 3.14, remove python 3.9 --- .github/workflows/wheels.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml index 4fa40f7d..c9cffe16 100644 --- a/.github/workflows/wheels.yml +++ b/.github/workflows/wheels.yml @@ -16,7 +16,7 @@ jobs: strategy: matrix: os: [ubuntu-latest, windows-latest, macos-15-intel, macos-15] - pyver: [cp39, cp310, cp311, cp312, cp313] + pyver: [cp310, cp311, cp312, cp313, cp314] steps: - uses: actions/checkout@v4 From 149cc9aaf11e93f1d2e9c44f9dfb169fb3b7e25c Mon Sep 17 00:00:00 2001 From: Tom Vander Aa Date: Fri, 6 Feb 2026 11:38:26 +0100 Subject: [PATCH 4/9] wheels ci: add ubuntu-24.04-arm --- .github/workflows/wheels.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml index c9cffe16..32562807 100644 --- a/.github/workflows/wheels.yml +++ b/.github/workflows/wheels.yml @@ -15,7 +15,7 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - os: [ubuntu-latest, windows-latest, macos-15-intel, macos-15] + os: [ubuntu-24.04, ubuntu-24.04-arm, windows-latest, macos-15-intel, macos-15] pyver: [cp310, cp311, cp312, cp313, cp314] steps: From a0e5c6a0ec5aa6bfc61a369d2d1db89dfc2509cb Mon Sep 17 00:00:00 2001 From: Tom Vander Aa Date: Thu, 22 Jan 2026 16:01:36 +0100 Subject: [PATCH 5/9] docker: move installation steps of Eigen and HighFive in shared script --- ci/docker/Dockerfile.manylinux | 28 ++------------------------- ci/docker/Dockerfile.musllinux | 14 ++------------ ci/docker/install_dependencies.sh | 32 +++++++++++++++++++++++++++++++ 3 files changed, 36 insertions(+), 38 deletions(-) create mode 100644 ci/docker/install_dependencies.sh diff --git a/ci/docker/Dockerfile.manylinux b/ci/docker/Dockerfile.manylinux index ffce6824..2105a3f9 100644 --- a/ci/docker/Dockerfile.manylinux +++ b/ci/docker/Dockerfile.manylinux @@ -3,29 +3,5 @@ FROM quay.io/pypa/manylinux_2_28_x86_64 RUN yum -y install wget openblas-devel hdf5-devel && \ yum clean all - -#install Eigen -RUN wget -O Eigen.tar.gz https://gitlab.com/libeigen/eigen/-/archive/3.4.1/eigen-3.4.1.tar.gz && \ - tar xzf Eigen.tar.gz && \ - rm Eigen.tar.gz && \ - cd eigen* && \ - mkdir build && \ - cd build && \ - cmake .. && \ - make -j2 && \ - make install && \ - cd ../.. && \ - rm -r eigen* - -#install HighFive -RUN wget -O HighFive.tar.gz https://github.com/BlueBrain/HighFive/archive/v2.10.1.tar.gz && \ - tar xzf HighFive.tar.gz && \ - rm HighFive.tar.gz && \ - cd HighFive* && \ - mkdir build && \ - cd build && \ - cmake .. -DHIGHFIVE_USE_BOOST=OFF && \ - make -j2 && \ - make install && \ - cd ../.. && \ - rm -r HighFive* +COPY install_dependencies.sh /tmp/install_dependencies.sh +RUN chmod +x /tmp/install_dependencies.sh && /tmp/install_dependencies.sh && rm /tmp/install_dependencies.sh diff --git a/ci/docker/Dockerfile.musllinux b/ci/docker/Dockerfile.musllinux index 520597dc..0e6e938c 100644 --- a/ci/docker/Dockerfile.musllinux +++ b/ci/docker/Dockerfile.musllinux @@ -2,15 +2,5 @@ FROM quay.io/pypa/musllinux_1_2_x86_64 RUN apk add wget eigen-dev openblas-dev hdf5-dev -#install HighFive -RUN wget -O HighFive.tar.gz https://github.com/BlueBrain/HighFive/archive/v2.10.1.tar.gz && \ - tar xzf HighFive.tar.gz && \ - rm HighFive.tar.gz && \ - cd HighFive* && \ - mkdir build && \ - cd build && \ - cmake .. -DHIGHFIVE_USE_BOOST=OFF && \ - make -j2 && \ - make install && \ - cd ../.. && \ - rm -r HighFive* +COPY install_dependencies.sh /tmp/install_dependencies.sh +RUN chmod +x /tmp/install_dependencies.sh && /tmp/install_dependencies.sh && rm /tmp/install_dependencies.sh diff --git a/ci/docker/install_dependencies.sh b/ci/docker/install_dependencies.sh new file mode 100644 index 00000000..37a06248 --- /dev/null +++ b/ci/docker/install_dependencies.sh @@ -0,0 +1,32 @@ +#!/bin/bash +set -e + +# Install Eigen +echo "Installing Eigen..." +wget -O Eigen.tar.gz https://gitlab.com/libeigen/eigen/-/archive/3.4.1/eigen-3.4.1.tar.gz +tar xzf Eigen.tar.gz +rm Eigen.tar.gz +cd eigen* +mkdir build +cd build +cmake .. +make -j2 +make install +cd ../.. +rm -r eigen* + +# Install HighFive +echo "Installing HighFive..." +wget -O HighFive.tar.gz https://github.com/BlueBrain/HighFive/archive/v2.10.1.tar.gz +tar xzf HighFive.tar.gz +rm HighFive.tar.gz +cd HighFive* +mkdir build +cd build +cmake .. -DHIGHFIVE_USE_BOOST=OFF +make -j2 +make install +cd ../.. +rm -r HighFive* + +echo "Done!" From 517d94e806c35a89fcfb017bc3e7db1b2379c2e8 Mon Sep 17 00:00:00 2001 From: Tom Vander Aa Date: Thu, 22 Jan 2026 16:01:57 +0100 Subject: [PATCH 6/9] docker: add manylinux aarch64 docker file --- ci/docker/Dockerfile.manylinux.aarch64 | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 ci/docker/Dockerfile.manylinux.aarch64 diff --git a/ci/docker/Dockerfile.manylinux.aarch64 b/ci/docker/Dockerfile.manylinux.aarch64 new file mode 100644 index 00000000..57002500 --- /dev/null +++ b/ci/docker/Dockerfile.manylinux.aarch64 @@ -0,0 +1,7 @@ +FROM quay.io/pypa/manylinux_2_28_aarch64 + +RUN yum -y install wget openblas-devel hdf5-devel && \ + yum clean all + +COPY install_dependencies.sh /tmp/install_dependencies.sh +RUN chmod +x /tmp/install_dependencies.sh && /tmp/install_dependencies.sh && rm /tmp/install_dependencies.sh From b0eb4c14571bddc89855563003e6bf7c214dba6e Mon Sep 17 00:00:00 2001 From: Tom Vander Aa Date: Thu, 22 Jan 2026 16:02:10 +0100 Subject: [PATCH 7/9] docker: convenient Makefile for building docker image --- ci/docker/Makefile | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 ci/docker/Makefile diff --git a/ci/docker/Makefile b/ci/docker/Makefile new file mode 100644 index 00000000..2bbc03fb --- /dev/null +++ b/ci/docker/Makefile @@ -0,0 +1,36 @@ +.PHONY: all alpine manylinux manylinux-aarch64 musllinux ubuntu clean push push-manylinux push-manylinux-aarch64 push-musllinux + +MANYLINUX_X86_64_IMAGE = vanderaa/manylinux_2_28_x86_64_smurff +MANYLINUX_AARCH64_IMAGE = vanderaa/manylinux_2_28_aarch64_smurff +MUSLLINUX_X86_64_IMAGE = vanderaa/musllinux_1_2_x86_64_smurff + +all: alpine manylinux manylinux-aarch64 musllinux ubuntu + +push: push-manylinux push-manylinux-aarch64 push-musllinux + +alpine: + docker build -f Dockerfile.alpine -t smurff:alpine . + +manylinux: + docker build -f Dockerfile.manylinux -t $(MANYLINUX_X86_64_IMAGE) . + +push-manylinux: + docker push $(MANYLINUX_X86_64_IMAGE) + +manylinux-aarch64: + docker build -f Dockerfile.manylinux.aarch64 -t $(MANYLINUX_AARCH64_IMAGE) . + +push-manylinux-aarch64: + docker push $(MANYLINUX_AARCH64_IMAGE) + +musllinux: + docker build -f Dockerfile.musllinux -t $(MUSLLINUX_X86_64_IMAGE) . + +push-musllinux: + docker push $(MUSLLINUX_X86_64_IMAGE) + +ubuntu: + docker build -f Dockerfile.ubuntu -t smurff:ubuntu . + +clean: + docker rmi smurff:alpine $(MANYLINUX_X86_64_IMAGE) $(MANYLINUX_AARCH64_IMAGE) $(MUSLLINUX_X86_64_IMAGE) smurff:ubuntu 2>/dev/null || true From 815cc188370ee2df90f33d44a0d4ecc2143fc6ee Mon Sep 17 00:00:00 2001 From: Tom Vander Aa Date: Thu, 22 Jan 2026 16:04:39 +0100 Subject: [PATCH 8/9] cibw: set aarch64 docker image --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index ad095bb0..7e121553 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -76,6 +76,7 @@ test-command = 'pytest -n auto {project}/python/test' test-requires = 'parameterized pytest pytest-xdist' manylinux-x86_64-image = "vanderaa/manylinux_2_28_x86_64_smurff" +manylinux-aarch64-image = "vanderaa/manylinux_2_28_aarch64_smurff" musllinux-x86_64-image = "vanderaa/musllinux_1_2_x86_64_smurff" # - cibuildwheel on macos - From fcd7ec861cbc8d11f854b2ce463d9521cfc6f332 Mon Sep 17 00:00:00 2001 From: Tom Vander Aa Date: Fri, 6 Feb 2026 16:09:29 +0100 Subject: [PATCH 9/9] tests: relax RMSE in Macau tests even further to 1.5 --- python/test/test_macau.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/python/test/test_macau.py b/python/test/test_macau.py index f4204ebe..1dd1ed81 100644 --- a/python/test/test_macau.py +++ b/python/test/test_macau.py @@ -110,8 +110,8 @@ def test_macau_tensor(self): rmse = smurff.calc_rmse(predictions) self.assertTrue( - rmse < 1.1, - msg="Tensor factorization gave RMSE above 1.1 (%f)." % rmse, + rmse < 1.5, + msg="Tensor factorization gave RMSE above 1.5 (%f)." % rmse, ) def test_macau_tensor_univariate(self): @@ -141,8 +141,8 @@ def test_macau_tensor_univariate(self): rmse = smurff.calc_rmse(predictions) self.assertTrue( - rmse < 1.1, - msg="Tensor factorization gave RMSE above 1.1 (%f)." % rmse, + rmse < 1.5, + msg="Tensor factorization gave RMSE above 1.5 (%f)." % rmse, )