From f80f6b8e595dca813bdd3693c53515b3974eafab Mon Sep 17 00:00:00 2001 From: Boris De Vos Date: Tue, 17 Feb 2026 16:04:06 +0100 Subject: [PATCH 1/3] make testsuite compatible with sparse arrays --- src/sectors.jl | 35 ++++++++++++++++++++++++++++------- test/sectors.jl | 2 +- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/src/sectors.jl b/src/sectors.jl index ebb55178..99a8f755 100644 --- a/src/sectors.jl +++ b/src/sectors.jl @@ -414,7 +414,11 @@ function Fsymbol_from_fusiontensor(a::I, b::I, c::I, d::I, e::I, f::I) where {I C = fusiontensor(b, c, f) D = @view fusiontensor(a, f, d)[:, :, 1, :] - @tensor F[-1, -2, -3, -4] := conj(D[1, 5, -4]) * conj(C[2, 4, 5, -3]) * A[1, 2, 3, -1] * B[3, 4, -2] + if !isa(A, Array) # might be a sparse array + @tensor F[-1, -2, -3, -4] := conj(Array(D)[1, 5, -4]) * conj(Array(C)[2, 4, 5, -3]) * Array(A)[1, 2, 3, -1] * Array(B)[3, 4, -2] + else + @tensor F[-1, -2, -3, -4] := conj(D[1, 5, -4]) * conj(C[2, 4, 5, -3]) * A[1, 2, 3, -1] * B[3, 4, -2] + end return FusionStyle(I) isa MultiplicityFreeFusion ? only(F) : F end end @@ -516,10 +520,16 @@ function Asymbol_from_fusiontensor(a::I, b::I, c::I) where {I <: Sector} if Nabc == 0 return FusionStyle(I) isa MultiplicityFreeFusion ? zero(T) : zeros(T, 0, 0) else - C1 = view(fusiontensor(a, b, c), :, 1, :, :) + _C1 = fusiontensor(a, b, c) + C1 = view(_C1, :, 1, :, :) C2 = view(fusiontensor(dual(a), c, b), :, :, 1, :) Za = sqrtdim(a) * view(fusiontensor(a, dual(a), leftunit(a)), :, :, 1, 1) - @tensor A[-1, -2] := sqrtdim(b) / sqrtdim(c) * conj(Za[1, 2]) * C1[1, 3, -1] * C2[2, 3, -2] + + if !isa(_C1, Array) # might be a sparse array + @tensor A[-1, -2] := sqrtdim(b) / sqrtdim(c) * conj(Array(Za)[1, 2]) * Array(C1)[1, 3, -1] * Array(C2)[2, 3, -2] + else + @tensor A[-1, -2] := sqrtdim(b) / sqrtdim(c) * conj(Za[1, 2]) * C1[1, 3, -1] * C2[2, 3, -2] + end return FusionStyle(I) isa MultiplicityFreeFusion ? only(A) : A end end @@ -556,10 +566,16 @@ function Bsymbol_from_fusiontensor(a::I, b::I, c::I) where {I <: Sector} if Nabc == 0 return FusionStyle(I) isa MultiplicityFreeFusion ? zero(T) : zeros(T, 0, 0) else - C1 = view(fusiontensor(a, b, c), 1, :, :, :) + _C1 = fusiontensor(a, b, c) + C1 = view(_C1, 1, :, :, :) C2 = view(fusiontensor(c, dual(b), a), :, :, 1, :) Zb = sqrtdim(b) * view(fusiontensor(b, dual(b), leftunit(b)), :, :, 1, 1) - @tensor B[-1, -2] := sqrtdim(a) / sqrtdim(c) * conj(Zb[1, 2]) * C1[1, 3, -1] * C2[3, 2, -2] + + if !isa(_C1, Array) # might be a sparse array + @tensor B[-1, -2] := sqrtdim(a) / sqrtdim(c) * conj(Array(Zb)[1, 2]) * Array(C1)[1, 3, -1] * Array(C2)[3, 2, -2] + else + @tensor B[-1, -2] := sqrtdim(a) / sqrtdim(c) * conj(Zb[1, 2]) * C1[1, 3, -1] * C2[3, 2, -2] + end return FusionStyle(I) isa MultiplicityFreeFusion ? only(B) : B end end @@ -629,9 +645,14 @@ function Rsymbol_from_fusiontensor(a::I, b::I, c::I) where {I <: Sector} if Nabc == 0 return FusionStyle(I) isa MultiplicityFreeFusion ? zero(T) : zeros(T, 0, 0) else - A = view(fusiontensor(a, b, c), :, :, 1, :) + _A = fusiontensor(a, b, c) + A = view(_A, :, :, 1, :) B = view(fusiontensor(b, a, c), :, :, 1, :) - @tensor R[-1 -2] := conj(B[1 2 -2]) * A[2 1 -1] + if !isa(_A, Array) # might be a sparse array + @tensor R[-1, -2] := conj(Array(B)[1 2 -2]) * Array(A)[2 1 -1] + else + @tensor R[-1 -2] := conj(B[1 2 -2]) * A[2 1 -1] + end return FusionStyle(I) isa MultiplicityFreeFusion ? only(R) : R end end diff --git a/test/sectors.jl b/test/sectors.jl index b3c3947b..20437c1b 100644 --- a/test/sectors.jl +++ b/test/sectors.jl @@ -153,7 +153,7 @@ end hasfusiontensor(I) || return nothing for a in smallset(I), b in smallset(I) cs = vec(collect(a ⊗ b)) - cgcs = map(c -> fusiontensor(a, b, c), cs) + cgcs = map(c -> Array(fusiontensor(a, b, c)), cs) # make dense for sparse arrays to work for (c, cgc) in zip(cs, cgcs), (c′, cgc′) in zip(cs, cgcs) for μ in 1:Nsymbol(a, b, c), ν in 1:Nsymbol(a, b, c′) @tensor overlap[mc mc'] := conj(view(cgc, :, :, :, μ)[ma mb mc]) * From 4b020204e9759bd28318d7b07430e005c6197392 Mon Sep 17 00:00:00 2001 From: Boris De Vos Date: Wed, 18 Feb 2026 08:35:51 +0100 Subject: [PATCH 2/3] Revert "make testsuite compatible with sparse arrays" This reverts commit f80f6b8e595dca813bdd3693c53515b3974eafab. --- src/sectors.jl | 35 +++++++---------------------------- test/sectors.jl | 2 +- 2 files changed, 8 insertions(+), 29 deletions(-) diff --git a/src/sectors.jl b/src/sectors.jl index 99a8f755..ebb55178 100644 --- a/src/sectors.jl +++ b/src/sectors.jl @@ -414,11 +414,7 @@ function Fsymbol_from_fusiontensor(a::I, b::I, c::I, d::I, e::I, f::I) where {I C = fusiontensor(b, c, f) D = @view fusiontensor(a, f, d)[:, :, 1, :] - if !isa(A, Array) # might be a sparse array - @tensor F[-1, -2, -3, -4] := conj(Array(D)[1, 5, -4]) * conj(Array(C)[2, 4, 5, -3]) * Array(A)[1, 2, 3, -1] * Array(B)[3, 4, -2] - else - @tensor F[-1, -2, -3, -4] := conj(D[1, 5, -4]) * conj(C[2, 4, 5, -3]) * A[1, 2, 3, -1] * B[3, 4, -2] - end + @tensor F[-1, -2, -3, -4] := conj(D[1, 5, -4]) * conj(C[2, 4, 5, -3]) * A[1, 2, 3, -1] * B[3, 4, -2] return FusionStyle(I) isa MultiplicityFreeFusion ? only(F) : F end end @@ -520,16 +516,10 @@ function Asymbol_from_fusiontensor(a::I, b::I, c::I) where {I <: Sector} if Nabc == 0 return FusionStyle(I) isa MultiplicityFreeFusion ? zero(T) : zeros(T, 0, 0) else - _C1 = fusiontensor(a, b, c) - C1 = view(_C1, :, 1, :, :) + C1 = view(fusiontensor(a, b, c), :, 1, :, :) C2 = view(fusiontensor(dual(a), c, b), :, :, 1, :) Za = sqrtdim(a) * view(fusiontensor(a, dual(a), leftunit(a)), :, :, 1, 1) - - if !isa(_C1, Array) # might be a sparse array - @tensor A[-1, -2] := sqrtdim(b) / sqrtdim(c) * conj(Array(Za)[1, 2]) * Array(C1)[1, 3, -1] * Array(C2)[2, 3, -2] - else - @tensor A[-1, -2] := sqrtdim(b) / sqrtdim(c) * conj(Za[1, 2]) * C1[1, 3, -1] * C2[2, 3, -2] - end + @tensor A[-1, -2] := sqrtdim(b) / sqrtdim(c) * conj(Za[1, 2]) * C1[1, 3, -1] * C2[2, 3, -2] return FusionStyle(I) isa MultiplicityFreeFusion ? only(A) : A end end @@ -566,16 +556,10 @@ function Bsymbol_from_fusiontensor(a::I, b::I, c::I) where {I <: Sector} if Nabc == 0 return FusionStyle(I) isa MultiplicityFreeFusion ? zero(T) : zeros(T, 0, 0) else - _C1 = fusiontensor(a, b, c) - C1 = view(_C1, 1, :, :, :) + C1 = view(fusiontensor(a, b, c), 1, :, :, :) C2 = view(fusiontensor(c, dual(b), a), :, :, 1, :) Zb = sqrtdim(b) * view(fusiontensor(b, dual(b), leftunit(b)), :, :, 1, 1) - - if !isa(_C1, Array) # might be a sparse array - @tensor B[-1, -2] := sqrtdim(a) / sqrtdim(c) * conj(Array(Zb)[1, 2]) * Array(C1)[1, 3, -1] * Array(C2)[3, 2, -2] - else - @tensor B[-1, -2] := sqrtdim(a) / sqrtdim(c) * conj(Zb[1, 2]) * C1[1, 3, -1] * C2[3, 2, -2] - end + @tensor B[-1, -2] := sqrtdim(a) / sqrtdim(c) * conj(Zb[1, 2]) * C1[1, 3, -1] * C2[3, 2, -2] return FusionStyle(I) isa MultiplicityFreeFusion ? only(B) : B end end @@ -645,14 +629,9 @@ function Rsymbol_from_fusiontensor(a::I, b::I, c::I) where {I <: Sector} if Nabc == 0 return FusionStyle(I) isa MultiplicityFreeFusion ? zero(T) : zeros(T, 0, 0) else - _A = fusiontensor(a, b, c) - A = view(_A, :, :, 1, :) + A = view(fusiontensor(a, b, c), :, :, 1, :) B = view(fusiontensor(b, a, c), :, :, 1, :) - if !isa(_A, Array) # might be a sparse array - @tensor R[-1, -2] := conj(Array(B)[1 2 -2]) * Array(A)[2 1 -1] - else - @tensor R[-1 -2] := conj(B[1 2 -2]) * A[2 1 -1] - end + @tensor R[-1 -2] := conj(B[1 2 -2]) * A[2 1 -1] return FusionStyle(I) isa MultiplicityFreeFusion ? only(R) : R end end diff --git a/test/sectors.jl b/test/sectors.jl index 20437c1b..b3c3947b 100644 --- a/test/sectors.jl +++ b/test/sectors.jl @@ -153,7 +153,7 @@ end hasfusiontensor(I) || return nothing for a in smallset(I), b in smallset(I) cs = vec(collect(a ⊗ b)) - cgcs = map(c -> Array(fusiontensor(a, b, c)), cs) # make dense for sparse arrays to work + cgcs = map(c -> fusiontensor(a, b, c), cs) for (c, cgc) in zip(cs, cgcs), (c′, cgc′) in zip(cs, cgcs) for μ in 1:Nsymbol(a, b, c), ν in 1:Nsymbol(a, b, c′) @tensor overlap[mc mc'] := conj(view(cgc, :, :, :, μ)[ma mb mc]) * From 9362f837c0bb73a4d74428f47d963c86e38582ec Mon Sep 17 00:00:00 2001 From: Boris De Vos Date: Wed, 18 Feb 2026 08:43:13 +0100 Subject: [PATCH 3/3] remove views in orthogonality test --- test/sectors.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/sectors.jl b/test/sectors.jl index b3c3947b..8e8cce3c 100644 --- a/test/sectors.jl +++ b/test/sectors.jl @@ -156,8 +156,8 @@ end cgcs = map(c -> fusiontensor(a, b, c), cs) for (c, cgc) in zip(cs, cgcs), (c′, cgc′) in zip(cs, cgcs) for μ in 1:Nsymbol(a, b, c), ν in 1:Nsymbol(a, b, c′) - @tensor overlap[mc mc'] := conj(view(cgc, :, :, :, μ)[ma mb mc]) * - view(cgc′, :, :, :, ν)[ma mb mc'] + @tensor overlap[mc mc'] := conj(cgc[:, :, :, μ][ma mb mc]) * + cgc′[:, :, :, ν][ma mb mc'] if μ == ν && c == c′ @test isapprox(overlap, LinearAlgebra.I; atol = 1.0e-12) else