From ff127b776440b237705177e9e66202caf20eac57 Mon Sep 17 00:00:00 2001 From: Katharine Hyatt Date: Wed, 22 Apr 2026 10:35:13 -0400 Subject: [PATCH 1/7] Use a test setup matrix like TensorKit --- .github/workflows/Tests.yml | 77 +++++++++++++++++++++++++++---------- 1 file changed, 57 insertions(+), 20 deletions(-) diff --git a/.github/workflows/Tests.yml b/.github/workflows/Tests.yml index 25a0b6c82..52273f3de 100644 --- a/.github/workflows/Tests.yml +++ b/.github/workflows/Tests.yml @@ -9,33 +9,70 @@ on: paths-ignore: - 'docs/**' pull_request: + types: [opened, synchronize, reopened, ready_for_review, converted_to_draft] workflow_dispatch: concurrency: group: ${{ github.workflow }}-${{ github.ref }} # Cancel intermediate builds: only if it is a pull request build. cancel-in-progress: ${{ startsWith(github.ref, 'refs/pull/') }} - + jobs: - tests: - name: "Tests" + setup-matrix: + runs-on: ubuntu-latest + outputs: + groups: ${{ steps.mk.outputs.groups }} + version: ${{ steps.mk.outputs.version }} + os: ${{ steps.mk.outputs.os }} + steps: + - uses: actions/checkout@v6 + - id: mk + shell: bash + run: | + # Auto-discover test groups from all subdirectory names. + groups=$(find test -mindepth 1 -maxdepth 1 -type d \ + | xargs -I{} basename {} | sort \ + | jq -R -s -c '[split("\n")[] | select(length > 0)]') + + echo "groups=${groups}" >> "$GITHUB_OUTPUT" + + # Draft PR: only run ubuntu-latest + version=1 + if [[ "${{ github.event_name }}" == "pull_request" && "${{ github.event.pull_request.draft }}" == "true" ]]; then + echo 'version=["1"]' >> "$GITHUB_OUTPUT" + echo 'os=["ubuntu-latest"]' >> "$GITHUB_OUTPUT" + else + echo 'version=["lts","1"]' >> "$GITHUB_OUTPUT" + echo 'os=["ubuntu-latest","macOS-latest","windows-latest"]' >> "$GITHUB_OUTPUT" + fi + + test: + name: "Tests (${{ matrix.group }}, ${{ matrix.os }}, Julia ${{ matrix.version }})" + needs: setup-matrix strategy: fail-fast: false matrix: - version: - - 'lts' # minimal supported version - - '1' # latest released Julia version - # group: - os: - - ubuntu-latest - - macOS-latest - - windows-latest - uses: "QuantumKitHub/QuantumKitHubActions/.github/workflows/Tests.yml@main" - with: - group: "${{ matrix.group }}" - nthreads: 4 - julia-version: "${{ matrix.version }}" - os: "${{ matrix.os }}" - timeout-minutes: 120 - secrets: - CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + version: ${{ fromJSON(needs.setup-matrix.outputs.version) }} + os: ${{ fromJSON(needs.setup-matrix.outputs.os) }} + group: ${{ fromJSON(needs.setup-matrix.outputs.groups) }} + runs-on: ${{ matrix.os }} + timeout-minutes: 120 + steps: + - uses: actions/checkout@v6 + - uses: julia-actions/setup-julia@v2 + with: + version: ${{ matrix.version }} + - uses: julia-actions/cache@v3 + - uses: julia-actions/julia-buildpkg@v1 + - uses: julia-actions/julia-runtest@v1 + with: + test_args: '${{ matrix.group }}${{ github.event.pull_request.draft == true && '' --fast'' || '''' }}' + env: + JULIA_NUM_THREADS: "4" + - uses: julia-actions/julia-processcoverage@v1 + with: + directories: 'src,ext' + - uses: codecov/codecov-action@v6 + with: + files: lcov.info + token: ${{ secrets.CODECOV_TOKEN }} + fail_ci_if_error: false From c6ec8f923c415088315b01df37626aa11db61592 Mon Sep 17 00:00:00 2001 From: Katharine Hyatt Date: Wed, 22 Apr 2026 15:20:19 -0400 Subject: [PATCH 2/7] Try to exclude Enzyme on macOS --- .github/workflows/Tests.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/Tests.yml b/.github/workflows/Tests.yml index 52273f3de..cf55dbeee 100644 --- a/.github/workflows/Tests.yml +++ b/.github/workflows/Tests.yml @@ -54,6 +54,13 @@ jobs: version: ${{ fromJSON(needs.setup-matrix.outputs.version) }} os: ${{ fromJSON(needs.setup-matrix.outputs.os) }} group: ${{ fromJSON(needs.setup-matrix.outputs.groups) }} + exclude: + - os: macos-latest + version: 1 + group: enzyme + - os: macos-latest + version: "lts" + group: enzyme runs-on: ${{ matrix.os }} timeout-minutes: 120 steps: From 31501100b1392753036905df7f9773d0befc7b29 Mon Sep 17 00:00:00 2001 From: Katharine Hyatt Date: Thu, 23 Apr 2026 07:07:33 +0200 Subject: [PATCH 3/7] Apply suggestions from code review Co-authored-by: Lukas Devos --- .github/workflows/Tests.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/Tests.yml b/.github/workflows/Tests.yml index cf55dbeee..6471a8cf2 100644 --- a/.github/workflows/Tests.yml +++ b/.github/workflows/Tests.yml @@ -16,7 +16,6 @@ concurrency: group: ${{ github.workflow }}-${{ github.ref }} # Cancel intermediate builds: only if it is a pull request build. cancel-in-progress: ${{ startsWith(github.ref, 'refs/pull/') }} - jobs: setup-matrix: runs-on: ubuntu-latest @@ -65,7 +64,7 @@ jobs: timeout-minutes: 120 steps: - uses: actions/checkout@v6 - - uses: julia-actions/setup-julia@v2 + - uses: julia-actions/setup-julia@v3 with: version: ${{ matrix.version }} - uses: julia-actions/cache@v3 From dbb160a06a14ce9a006eeffcadc7c1e8e213ba44 Mon Sep 17 00:00:00 2001 From: Katharine Hyatt Date: Fri, 24 Apr 2026 07:39:29 +0200 Subject: [PATCH 4/7] Try filtering --- .github/workflows/Tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Tests.yml b/.github/workflows/Tests.yml index 6471a8cf2..258e5ad87 100644 --- a/.github/workflows/Tests.yml +++ b/.github/workflows/Tests.yml @@ -31,7 +31,7 @@ jobs: # Auto-discover test groups from all subdirectory names. groups=$(find test -mindepth 1 -maxdepth 1 -type d \ | xargs -I{} basename {} | sort \ - | jq -R -s -c '[split("\n")[] | select(length > 0)]') + | jq -R -s -c '[split("\n")[] | select(length > 0) | select(.!= "testsuite")]') echo "groups=${groups}" >> "$GITHUB_OUTPUT" From b2bcf904c59f02b6e6dc5ed0c71724356a7221cf Mon Sep 17 00:00:00 2001 From: Katharine Hyatt Date: Fri, 24 Apr 2026 08:24:07 -0400 Subject: [PATCH 5/7] Move stuff into subdirectories --- test/{ => chainrules}/chainrules.jl | 0 test/{ => common}/algorithms.jl | 0 test/{ => common}/projections.jl | 0 test/{ => common}/truncate.jl | 0 test/{ => common}/utilities.jl | 0 test/{ => decompositions}/eig.jl | 0 test/{ => decompositions}/eigh.jl | 0 test/{ => decompositions}/gen_eig.jl | 0 test/{ => decompositions}/lq.jl | 0 test/{ => decompositions}/orthnull.jl | 0 test/{ => decompositions}/polar.jl | 0 test/{ => decompositions}/qr.jl | 0 test/{ => decompositions}/schur.jl | 0 test/{ => decompositions}/svd.jl | 0 test/{ => misc}/codequality.jl | 0 15 files changed, 0 insertions(+), 0 deletions(-) rename test/{ => chainrules}/chainrules.jl (100%) rename test/{ => common}/algorithms.jl (100%) rename test/{ => common}/projections.jl (100%) rename test/{ => common}/truncate.jl (100%) rename test/{ => common}/utilities.jl (100%) rename test/{ => decompositions}/eig.jl (100%) rename test/{ => decompositions}/eigh.jl (100%) rename test/{ => decompositions}/gen_eig.jl (100%) rename test/{ => decompositions}/lq.jl (100%) rename test/{ => decompositions}/orthnull.jl (100%) rename test/{ => decompositions}/polar.jl (100%) rename test/{ => decompositions}/qr.jl (100%) rename test/{ => decompositions}/schur.jl (100%) rename test/{ => decompositions}/svd.jl (100%) rename test/{ => misc}/codequality.jl (100%) diff --git a/test/chainrules.jl b/test/chainrules/chainrules.jl similarity index 100% rename from test/chainrules.jl rename to test/chainrules/chainrules.jl diff --git a/test/algorithms.jl b/test/common/algorithms.jl similarity index 100% rename from test/algorithms.jl rename to test/common/algorithms.jl diff --git a/test/projections.jl b/test/common/projections.jl similarity index 100% rename from test/projections.jl rename to test/common/projections.jl diff --git a/test/truncate.jl b/test/common/truncate.jl similarity index 100% rename from test/truncate.jl rename to test/common/truncate.jl diff --git a/test/utilities.jl b/test/common/utilities.jl similarity index 100% rename from test/utilities.jl rename to test/common/utilities.jl diff --git a/test/eig.jl b/test/decompositions/eig.jl similarity index 100% rename from test/eig.jl rename to test/decompositions/eig.jl diff --git a/test/eigh.jl b/test/decompositions/eigh.jl similarity index 100% rename from test/eigh.jl rename to test/decompositions/eigh.jl diff --git a/test/gen_eig.jl b/test/decompositions/gen_eig.jl similarity index 100% rename from test/gen_eig.jl rename to test/decompositions/gen_eig.jl diff --git a/test/lq.jl b/test/decompositions/lq.jl similarity index 100% rename from test/lq.jl rename to test/decompositions/lq.jl diff --git a/test/orthnull.jl b/test/decompositions/orthnull.jl similarity index 100% rename from test/orthnull.jl rename to test/decompositions/orthnull.jl diff --git a/test/polar.jl b/test/decompositions/polar.jl similarity index 100% rename from test/polar.jl rename to test/decompositions/polar.jl diff --git a/test/qr.jl b/test/decompositions/qr.jl similarity index 100% rename from test/qr.jl rename to test/decompositions/qr.jl diff --git a/test/schur.jl b/test/decompositions/schur.jl similarity index 100% rename from test/schur.jl rename to test/decompositions/schur.jl diff --git a/test/svd.jl b/test/decompositions/svd.jl similarity index 100% rename from test/svd.jl rename to test/decompositions/svd.jl diff --git a/test/codequality.jl b/test/misc/codequality.jl similarity index 100% rename from test/codequality.jl rename to test/misc/codequality.jl From 97da1c3e3b7ebdd89add95cb39bc79636f04b42e Mon Sep 17 00:00:00 2001 From: Katharine Hyatt Date: Fri, 24 Apr 2026 08:54:47 -0400 Subject: [PATCH 6/7] Fix paths --- test/chainrules/chainrules.jl | 2 +- test/common/projections.jl | 2 +- test/decompositions/eig.jl | 2 +- test/decompositions/eigh.jl | 2 +- test/decompositions/lq.jl | 2 +- test/decompositions/orthnull.jl | 2 +- test/decompositions/polar.jl | 2 +- test/decompositions/qr.jl | 2 +- test/decompositions/schur.jl | 2 +- test/decompositions/svd.jl | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/test/chainrules/chainrules.jl b/test/chainrules/chainrules.jl index c0ab618ae..f3b123688 100644 --- a/test/chainrules/chainrules.jl +++ b/test/chainrules/chainrules.jl @@ -4,7 +4,7 @@ using Test #BLASFloats = (Float32, Float64, ComplexF32, ComplexF64) BLASFloats = (Float32, ComplexF64) # full suite is too expensive on CI -@isdefined(TestSuite) || include("testsuite/TestSuite.jl") +@isdefined(TestSuite) || include("../testsuite/TestSuite.jl") using .TestSuite is_buildkite = get(ENV, "BUILDKITE", "false") == "true" diff --git a/test/common/projections.jl b/test/common/projections.jl index 16044f639..74f4a6429 100644 --- a/test/common/projections.jl +++ b/test/common/projections.jl @@ -8,7 +8,7 @@ using CUDA, AMDGPU BLASFloats = (Float32, Float64, ComplexF32, ComplexF64) GenericFloats = (BigFloat, Complex{BigFloat}) -@isdefined(TestSuite) || include("testsuite/TestSuite.jl") +@isdefined(TestSuite) || include("../testsuite/TestSuite.jl") using .TestSuite is_buildkite = get(ENV, "BUILDKITE", "false") == "true" diff --git a/test/decompositions/eig.jl b/test/decompositions/eig.jl index 12aecfbc4..6c6636e6b 100644 --- a/test/decompositions/eig.jl +++ b/test/decompositions/eig.jl @@ -9,7 +9,7 @@ using CUDA, AMDGPU BLASFloats = (Float32, Float64, ComplexF32, ComplexF64) GenericFloats = (BigFloat, Complex{BigFloat}) -@isdefined(TestSuite) || include("testsuite/TestSuite.jl") +@isdefined(TestSuite) || include("../testsuite/TestSuite.jl") using .TestSuite is_buildkite = get(ENV, "BUILDKITE", "false") == "true" diff --git a/test/decompositions/eigh.jl b/test/decompositions/eigh.jl index d9016eca9..0181e481f 100644 --- a/test/decompositions/eigh.jl +++ b/test/decompositions/eigh.jl @@ -8,7 +8,7 @@ using CUDA, AMDGPU BLASFloats = (Float32, Float64, ComplexF32, ComplexF64) GenericFloats = (BigFloat, Complex{BigFloat}) -@isdefined(TestSuite) || include("testsuite/TestSuite.jl") +@isdefined(TestSuite) || include("../testsuite/TestSuite.jl") using .TestSuite is_buildkite = get(ENV, "BUILDKITE", "false") == "true" diff --git a/test/decompositions/lq.jl b/test/decompositions/lq.jl index c4abe15f7..ce38f42f9 100644 --- a/test/decompositions/lq.jl +++ b/test/decompositions/lq.jl @@ -9,7 +9,7 @@ using CUDA, AMDGPU, GenericLinearAlgebra BLASFloats = (Float32, Float64, ComplexF32, ComplexF64) GenericFloats = (Float16, BigFloat, Complex{BigFloat}) -@isdefined(TestSuite) || include("testsuite/TestSuite.jl") +@isdefined(TestSuite) || include("../testsuite/TestSuite.jl") using .TestSuite is_buildkite = get(ENV, "BUILDKITE", "false") == "true" diff --git a/test/decompositions/orthnull.jl b/test/decompositions/orthnull.jl index a8aedcb9a..6d37dba15 100644 --- a/test/decompositions/orthnull.jl +++ b/test/decompositions/orthnull.jl @@ -8,7 +8,7 @@ using CUDA, AMDGPU BLASFloats = (Float32, Float64, ComplexF32, ComplexF64) GenericFloats = (BigFloat, Complex{BigFloat}) -@isdefined(TestSuite) || include("testsuite/TestSuite.jl") +@isdefined(TestSuite) || include("../testsuite/TestSuite.jl") using .TestSuite is_buildkite = get(ENV, "BUILDKITE", "false") == "true" diff --git a/test/decompositions/polar.jl b/test/decompositions/polar.jl index 6fa0e8d97..a259386e3 100644 --- a/test/decompositions/polar.jl +++ b/test/decompositions/polar.jl @@ -7,7 +7,7 @@ using CUDA, AMDGPU BLASFloats = (Float32, Float64, ComplexF32, ComplexF64) GenericFloats = (BigFloat, Complex{BigFloat}) -@isdefined(TestSuite) || include("testsuite/TestSuite.jl") +@isdefined(TestSuite) || include("../testsuite/TestSuite.jl") using .TestSuite is_buildkite = get(ENV, "BUILDKITE", "false") == "true" diff --git a/test/decompositions/qr.jl b/test/decompositions/qr.jl index b25b4aa74..3a7c2f861 100644 --- a/test/decompositions/qr.jl +++ b/test/decompositions/qr.jl @@ -8,7 +8,7 @@ using CUDA, AMDGPU, GenericLinearAlgebra BLASFloats = (Float32, Float64, ComplexF32, ComplexF64) GenericFloats = (Float16, BigFloat, Complex{BigFloat}) -@isdefined(TestSuite) || include("testsuite/TestSuite.jl") +@isdefined(TestSuite) || include("../testsuite/TestSuite.jl") using .TestSuite is_buildkite = get(ENV, "BUILDKITE", "false") == "true" diff --git a/test/decompositions/schur.jl b/test/decompositions/schur.jl index cbc02d343..ec879314b 100644 --- a/test/decompositions/schur.jl +++ b/test/decompositions/schur.jl @@ -7,7 +7,7 @@ using LinearAlgebra: I, Diagonal BLASFloats = (Float32, Float64, ComplexF32, ComplexF64) GenericFloats = (BigFloat, Complex{BigFloat}) -@isdefined(TestSuite) || include("testsuite/TestSuite.jl") +@isdefined(TestSuite) || include("../testsuite/TestSuite.jl") using .TestSuite is_buildkite = get(ENV, "BUILDKITE", "false") == "true" diff --git a/test/decompositions/svd.jl b/test/decompositions/svd.jl index 662346a78..8cf34d834 100644 --- a/test/decompositions/svd.jl +++ b/test/decompositions/svd.jl @@ -5,7 +5,7 @@ using CUDA, AMDGPU BLASFloats = (Float32, Float64, ComplexF32, ComplexF64) GenericFloats = (BigFloat, Complex{BigFloat}) -@isdefined(TestSuite) || include("testsuite/TestSuite.jl") +@isdefined(TestSuite) || include("../testsuite/TestSuite.jl") using .TestSuite is_buildkite = get(ENV, "BUILDKITE", "false") == "true" From 1f7604339c95cc7ee27a1aa14439a6d5779ff84b Mon Sep 17 00:00:00 2001 From: Katharine Hyatt Date: Fri, 24 Apr 2026 10:02:30 -0400 Subject: [PATCH 7/7] Suggestions --- .github/workflows/Tests.yml | 4 ++-- test/{misc => common}/codequality.jl | 0 test/{common => }/utilities.jl | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename test/{misc => common}/codequality.jl (100%) rename test/{common => }/utilities.jl (100%) diff --git a/.github/workflows/Tests.yml b/.github/workflows/Tests.yml index 258e5ad87..1b143b01f 100644 --- a/.github/workflows/Tests.yml +++ b/.github/workflows/Tests.yml @@ -40,7 +40,7 @@ jobs: echo 'version=["1"]' >> "$GITHUB_OUTPUT" echo 'os=["ubuntu-latest"]' >> "$GITHUB_OUTPUT" else - echo 'version=["lts","1"]' >> "$GITHUB_OUTPUT" + echo 'version=["min","1"]' >> "$GITHUB_OUTPUT" echo 'os=["ubuntu-latest","macOS-latest","windows-latest"]' >> "$GITHUB_OUTPUT" fi @@ -58,7 +58,7 @@ jobs: version: 1 group: enzyme - os: macos-latest - version: "lts" + version: "min" group: enzyme runs-on: ${{ matrix.os }} timeout-minutes: 120 diff --git a/test/misc/codequality.jl b/test/common/codequality.jl similarity index 100% rename from test/misc/codequality.jl rename to test/common/codequality.jl diff --git a/test/common/utilities.jl b/test/utilities.jl similarity index 100% rename from test/common/utilities.jl rename to test/utilities.jl