From 06f8c733a8bed28f1c10f3b1191386c3c88d30bb Mon Sep 17 00:00:00 2001 From: Lukas Devos Date: Thu, 1 Jan 2026 22:00:37 +0100 Subject: [PATCH 1/3] add `transpose` specialization for `DiagonalTensorMap` --- src/tensors/diagonal.jl | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/tensors/diagonal.jl b/src/tensors/diagonal.jl index e35c2ffdd..c191bb6b5 100644 --- a/src/tensors/diagonal.jl +++ b/src/tensors/diagonal.jl @@ -211,7 +211,29 @@ function permute( end return d′ else - throw(ArgumentError("invalid permutation $((p₁, p₂)) for tensor in space $(space(d))")) + throw(ArgumentError(lazy"invalid permutation $((p₁, p₂)) for tensor in space $(space(d))")) + end +end + +function LinearAlgebra.transpose( + d::DiagonalTensorMap, (p₁, p₂)::Index2Tuple{1, 1}; copy::Bool = false + ) + if p₁ === (1,) && p₂ === (2,) + return copy ? Base.copy(d) : d + elseif p₁ === (2,) && p₂ === (1,) # transpose + if has_shared_permute(d, (p₁, p₂)) # tranpose for bosonic sectors + return DiagonalTensorMap(copy ? Base.copy(d.data) : d.data, dual(d.domain)) + end + d′ = typeof(d)(undef, dual(d.domain)) + for (c, b) in blocks(d) + f = only(fusiontrees(codomain(d), c)) + ((f′, _), coeff) = only(transpose(f, f, p₁, p₂)) + c′ = f′.coupled + scale!(block(d′, c′), b, coeff) + end + return d′ + else + throw(ArgumentError(lazy"invalid transposition $((p₁, p₂)) for tensor in space $(space(d))")) end end From fe5fca1c83c306e1a2e9d77eb40d518ac56fb3e8 Mon Sep 17 00:00:00 2001 From: Lukas Devos Date: Thu, 1 Jan 2026 22:03:32 +0100 Subject: [PATCH 2/3] add test --- test/tensors/diagonal.jl | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/test/tensors/diagonal.jl b/test/tensors/diagonal.jl index 9154ed3b4..f6fe8cac0 100644 --- a/test/tensors/diagonal.jl +++ b/test/tensors/diagonal.jl @@ -119,11 +119,15 @@ diagspacelist = ( if BraidingStyle(I) isa SymmetricBraiding @timedtestset "Permutations" begin t = DiagonalTensorMap(randn(ComplexF64, reduceddim(V)), V) + # preserving diagonal t1 = @constinferred permute(t, $(((2,), (1,)))) - if BraidingStyle(sectortype(V)) isa Bosonic - @test t1 ≈ transpose(t) - end + @test t1 isa DiagonalTensorMap @test convert(TensorMap, t1) == permute(convert(TensorMap, t), (((2,), (1,)))) + t1′ = @constinferred transpose(t) + @test t1′ isa DiagonalTensorMap + @test t1 ≈ t1′ + + # not preserving diagonal t2 = @constinferred permute(t, $(((1, 2), ()))) @test convert(TensorMap, t2) == permute(convert(TensorMap, t), (((1, 2), ()))) t3 = @constinferred permute(t, $(((2, 1), ()))) From 0f35fa2f47ef7c7bb7f98268d03c3c32990b6be4 Mon Sep 17 00:00:00 2001 From: Lukas Devos Date: Thu, 1 Jan 2026 22:47:05 +0100 Subject: [PATCH 3/3] slight test fixes --- test/tensors/diagonal.jl | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/test/tensors/diagonal.jl b/test/tensors/diagonal.jl index f6fe8cac0..662ca209e 100644 --- a/test/tensors/diagonal.jl +++ b/test/tensors/diagonal.jl @@ -119,23 +119,26 @@ diagspacelist = ( if BraidingStyle(I) isa SymmetricBraiding @timedtestset "Permutations" begin t = DiagonalTensorMap(randn(ComplexF64, reduceddim(V)), V) + t_tm = convert(TensorMap, t) + # preserving diagonal t1 = @constinferred permute(t, $(((2,), (1,)))) @test t1 isa DiagonalTensorMap - @test convert(TensorMap, t1) == permute(convert(TensorMap, t), (((2,), (1,)))) + @test convert(TensorMap, t1) == permute(t_tm, (((2,), (1,)))) t1′ = @constinferred transpose(t) @test t1′ isa DiagonalTensorMap - @test t1 ≈ t1′ + @test convert(TensorMap, t1′) == transpose(t_tm) + BraidingStyle(I) isa Bosonic && @test t1 ≈ t1′ # not preserving diagonal t2 = @constinferred permute(t, $(((1, 2), ()))) - @test convert(TensorMap, t2) == permute(convert(TensorMap, t), (((1, 2), ()))) + @test convert(TensorMap, t2) == permute(t_tm, (((1, 2), ()))) t3 = @constinferred permute(t, $(((2, 1), ()))) - @test convert(TensorMap, t3) == permute(convert(TensorMap, t), (((2, 1), ()))) + @test convert(TensorMap, t3) == permute(t_tm, (((2, 1), ()))) t4 = @constinferred permute(t, $(((), (1, 2)))) - @test convert(TensorMap, t4) == permute(convert(TensorMap, t), (((), (1, 2)))) + @test convert(TensorMap, t4) == permute(t_tm, (((), (1, 2)))) t5 = @constinferred permute(t, $(((), (2, 1)))) - @test convert(TensorMap, t5) == permute(convert(TensorMap, t), (((), (2, 1)))) + @test convert(TensorMap, t5) == permute(t_tm, (((), (2, 1)))) end end @timedtestset "Trace, Multiplication and inverse" begin