From 6fecc2a1eba82d1541801921ac4c8099c02b6603 Mon Sep 17 00:00:00 2001 From: Katharine Hyatt Date: Wed, 24 Jun 2026 16:23:10 -0400 Subject: [PATCH 1/3] Try running Mooncake linalg tests with CuTensorMaps --- test/cuda/mooncake.jl | 48 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 test/cuda/mooncake.jl diff --git a/test/cuda/mooncake.jl b/test/cuda/mooncake.jl new file mode 100644 index 000000000..6e783653e --- /dev/null +++ b/test/cuda/mooncake.jl @@ -0,0 +1,48 @@ +using Test, TestExtras +using TensorKit +using Mooncake +using Random +using CUDA, cuTENSOR, Adapt + +rng = Random.default_rng() + +spacelist = ad_spacelist(fast_tests) +eltypes = (Float64, ComplexF64) + +@timedtestset "Mooncake - LinearAlgebra: $(TensorKit.type_repr(sectortype(eltype(V)))) ($T)" for V in spacelist, T in eltypes + atol = default_tol(T) + rtol = default_tol(T) + + C = adapt(CuVector{T, CUDA.DeviceMemory}, randn(T, V[1] ⊗ V[2] ← (V[3] ⊗ V[4] ⊗ V[5])')) + A = adapt(CuVector{T, CUDA.DeviceMemory}, randn(T, codomain(C) ← V[5]' ⊗ V[4]')) + B = adapt(CuVector{T, CUDA.DeviceMemory}, randn(T, domain(A) ← domain(C))) + α = randn(T) + β = randn(T) + + Mooncake.TestUtils.test_rule(rng, mul!, C, A, B, α, β; atol, rtol) + Mooncake.TestUtils.test_rule(rng, mul!, C, A, B; atol, rtol, is_primitive = false) + + Mooncake.TestUtils.test_rule(rng, norm, C, 2; atol, rtol) + Mooncake.TestUtils.test_rule(rng, norm, C', 2; atol, rtol) + + D1 = adapt(CuVector{T, CUDA.DeviceMemory}, randn(T, V[1] ← V[1])) + D2 = adapt(CuVector{T, CUDA.DeviceMemory}, randn(T, V[1] ⊗ V[2] ← V[1] ⊗ V[2])) + D3 = adapt(CuVector{T, CUDA.DeviceMemory}, randn(T, V[1] ⊗ V[2] ⊗ V[3] ← V[1] ⊗ V[2] ⊗ V[3])) + + Mooncake.TestUtils.test_rule(rng, tr, D1; atol, rtol) + Mooncake.TestUtils.test_rule(rng, tr, D2; atol, rtol) + Mooncake.TestUtils.test_rule(rng, tr, D3; atol, rtol) + + Mooncake.TestUtils.test_rule(rng, inv, D1; atol, rtol) + Mooncake.TestUtils.test_rule(rng, inv, D2; atol, rtol) + Mooncake.TestUtils.test_rule(rng, inv, D3; atol, rtol) + + C = adapt(CuVector{T, CUDA.DeviceMemory}, randn(T, V[1] ← V[1])) + C′ = similar(C) + Mooncake.TestUtils.test_rule(rng, project_hermitian!, C, C′; atol, rtol, is_primitive = false) + Mooncake.TestUtils.test_rule(rng, project_hermitian!, C, C; atol, rtol, is_primitive = false) + Mooncake.TestUtils.test_rule(rng, project_hermitian, C; atol, rtol, is_primitive = false) + Mooncake.TestUtils.test_rule(rng, project_antihermitian!, C, C′; atol, rtol, is_primitive = false) + Mooncake.TestUtils.test_rule(rng, project_antihermitian!, C, C; atol, rtol, is_primitive = false) + Mooncake.TestUtils.test_rule(rng, project_antihermitian, C; atol, rtol, is_primitive = false) +end From 711e988fadae3f6fbfd7007837666dd970b06dd5 Mon Sep 17 00:00:00 2001 From: Katharine Hyatt Date: Thu, 25 Jun 2026 09:41:08 -0400 Subject: [PATCH 2/3] Run only the interface tests on CI --- test/cuda/mooncake.jl | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/test/cuda/mooncake.jl b/test/cuda/mooncake.jl index 6e783653e..352b7ac8b 100644 --- a/test/cuda/mooncake.jl +++ b/test/cuda/mooncake.jl @@ -8,6 +8,8 @@ rng = Random.default_rng() spacelist = ad_spacelist(fast_tests) eltypes = (Float64, ComplexF64) + +is_ci = get(ENV, "CI", "false") == "true" @timedtestset "Mooncake - LinearAlgebra: $(TensorKit.type_repr(sectortype(eltype(V)))) ($T)" for V in spacelist, T in eltypes atol = default_tol(T) @@ -19,30 +21,30 @@ eltypes = (Float64, ComplexF64) α = randn(T) β = randn(T) - Mooncake.TestUtils.test_rule(rng, mul!, C, A, B, α, β; atol, rtol) - Mooncake.TestUtils.test_rule(rng, mul!, C, A, B; atol, rtol, is_primitive = false) + Mooncake.TestUtils.test_rule(rng, mul!, C, A, B, α, β; atol, rtol, interface_only = is_ci) + Mooncake.TestUtils.test_rule(rng, mul!, C, A, B; atol, rtol, is_primitive = false, interface_only = is_ci) - Mooncake.TestUtils.test_rule(rng, norm, C, 2; atol, rtol) - Mooncake.TestUtils.test_rule(rng, norm, C', 2; atol, rtol) + Mooncake.TestUtils.test_rule(rng, norm, C, 2; atol, rtol, interface_only = is_ci) + Mooncake.TestUtils.test_rule(rng, norm, C', 2; atol, rtol, interface_only = is_ci) D1 = adapt(CuVector{T, CUDA.DeviceMemory}, randn(T, V[1] ← V[1])) D2 = adapt(CuVector{T, CUDA.DeviceMemory}, randn(T, V[1] ⊗ V[2] ← V[1] ⊗ V[2])) D3 = adapt(CuVector{T, CUDA.DeviceMemory}, randn(T, V[1] ⊗ V[2] ⊗ V[3] ← V[1] ⊗ V[2] ⊗ V[3])) - Mooncake.TestUtils.test_rule(rng, tr, D1; atol, rtol) - Mooncake.TestUtils.test_rule(rng, tr, D2; atol, rtol) - Mooncake.TestUtils.test_rule(rng, tr, D3; atol, rtol) + Mooncake.TestUtils.test_rule(rng, tr, D1; atol, rtol, interface_only = is_ci) + Mooncake.TestUtils.test_rule(rng, tr, D2; atol, rtol, interface_only = is_ci) + Mooncake.TestUtils.test_rule(rng, tr, D3; atol, rtol, interface_only = is_ci) - Mooncake.TestUtils.test_rule(rng, inv, D1; atol, rtol) - Mooncake.TestUtils.test_rule(rng, inv, D2; atol, rtol) - Mooncake.TestUtils.test_rule(rng, inv, D3; atol, rtol) + Mooncake.TestUtils.test_rule(rng, inv, D1; atol, rtol, interface_only = is_ci) + Mooncake.TestUtils.test_rule(rng, inv, D2; atol, rtol, interface_only = is_ci) + Mooncake.TestUtils.test_rule(rng, inv, D3; atol, rtol, interface_only = is_ci) C = adapt(CuVector{T, CUDA.DeviceMemory}, randn(T, V[1] ← V[1])) C′ = similar(C) - Mooncake.TestUtils.test_rule(rng, project_hermitian!, C, C′; atol, rtol, is_primitive = false) - Mooncake.TestUtils.test_rule(rng, project_hermitian!, C, C; atol, rtol, is_primitive = false) - Mooncake.TestUtils.test_rule(rng, project_hermitian, C; atol, rtol, is_primitive = false) - Mooncake.TestUtils.test_rule(rng, project_antihermitian!, C, C′; atol, rtol, is_primitive = false) - Mooncake.TestUtils.test_rule(rng, project_antihermitian!, C, C; atol, rtol, is_primitive = false) - Mooncake.TestUtils.test_rule(rng, project_antihermitian, C; atol, rtol, is_primitive = false) + Mooncake.TestUtils.test_rule(rng, project_hermitian!, C, C′; atol, rtol, is_primitive = false, interface_only = is_ci) + Mooncake.TestUtils.test_rule(rng, project_hermitian!, C, C; atol, rtol, is_primitive = false, interface_only = is_ci) + Mooncake.TestUtils.test_rule(rng, project_hermitian, C; atol, rtol, is_primitive = false, interface_only = is_ci) + Mooncake.TestUtils.test_rule(rng, project_antihermitian!, C, C′; atol, rtol, is_primitive = false, interface_only = is_ci) + Mooncake.TestUtils.test_rule(rng, project_antihermitian!, C, C; atol, rtol, is_primitive = false, interface_only = is_ci) + Mooncake.TestUtils.test_rule(rng, project_antihermitian, C; atol, rtol, is_primitive = false, interface_only = is_ci) end From 5f5f2f3b38e12e2de460f337c8e5592c6fad6ec3 Mon Sep 17 00:00:00 2001 From: Katharine Hyatt Date: Thu, 25 Jun 2026 09:48:32 -0400 Subject: [PATCH 3/3] Formatter --- test/cuda/mooncake.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/cuda/mooncake.jl b/test/cuda/mooncake.jl index 352b7ac8b..c0911c695 100644 --- a/test/cuda/mooncake.jl +++ b/test/cuda/mooncake.jl @@ -8,7 +8,7 @@ rng = Random.default_rng() spacelist = ad_spacelist(fast_tests) eltypes = (Float64, ComplexF64) - + is_ci = get(ENV, "CI", "false") == "true" @timedtestset "Mooncake - LinearAlgebra: $(TensorKit.type_repr(sectortype(eltype(V)))) ($T)" for V in spacelist, T in eltypes