Skip to content

Commit 2bbc946

Browse files
committed
expand on unitarity check explicitly + make less specific to A4
1 parent a549943 commit 2bbc946

File tree

1 file changed

+109
-15
lines changed

1 file changed

+109
-15
lines changed

test/test_A4.jl

Lines changed: 109 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,16 @@ using TensorKitSectors, TensorKit
33
using Test, TestExtras
44

55
I = A4Object
6-
s = size(A4Object)
6+
Istr = TensorKitSectors.type_repr(I)
7+
r = size(I)
78

8-
@testset "Basic type properties" verbose = true begin
9-
Istr = TensorKitSectors.type_repr(I)
9+
@testset "$Istr Basic type properties" verbose = true begin
1010
@test eval(Meta.parse(sprint(show, I))) == I
1111
@test eval(Meta.parse(TensorKitSectors.type_repr(I))) == I
1212
end
1313

14-
@testset "Fusion Category $i" for i in 1:s
15-
objects = A4Object.(i, i, MultiTensorKit._get_dual_cache(I)[2][i, i])
14+
@testset "$Istr Fusion Category $i" for i in 1:r
15+
objects = I.(i, i, MultiTensorKit._get_dual_cache(I)[2][i, i])
1616

1717
@testset "Basic properties" begin
1818
s = rand(objects, 3)
@@ -48,40 +48,134 @@ end
4848
end
4949
end
5050

51-
@testset "Pentagon equation" begin
52-
objects = collect(values(A4Object))
51+
for i in 1:r, j in 1:r # M x D (or Mop x C)
52+
i != j || continue # skip if fusion category
53+
@testset "$Istr right module category $i, $j" begin
54+
mod_objects = I.(i, j, MultiTensorKit._get_dual_cache(I)[2][i, j])
55+
fusion_objects = I.(j, j, MultiTensorKit._get_dual_cache(I)[2][j, j])
56+
57+
@testset "Unitarity of module F-move $i, $j" begin
58+
for A in mod_objects, α in fusion_objects, β in fusion_objects
59+
(A.j == α.i && α.j == β.i) || continue # skip if not compatible
60+
for B in (A, α, β)
61+
Cs = collect(intersect((A, α), map(dual, (β, dual(B)))))
62+
γs = collect(intersect((α, β), map(dual, (dual(B), A))))
63+
Fblocks = Vector{Any}()
64+
for C in Cs
65+
for γ in γs
66+
Fs = Fsymbol(A, α, β, B, C, γ)
67+
push!(Fblocks,
68+
reshape(Fs,
69+
(size(Fs, 1) * size(Fs, 2),
70+
size(Fs, 3) * size(Fs, 4))))
71+
end
72+
end
73+
F = hvcat(length(γs), Fblocks...)
74+
@test isapprox(F' * F, one(F); atol=1e-12, rtol=1e-12)
75+
end
76+
end
77+
end
78+
end
79+
end
80+
81+
for i in 1:7, j in 1:7 # C x M (or D x Mop)
82+
i != j || continue # skip if fusion category
83+
@testset "$Istr left module category $i, $j unitarity check" begin
84+
mod_objects = I.(i, j, MultiTensorKit._get_dual_cache(I)[2][i, j])
85+
fusion_objects = I.(i, i, MultiTensorKit._get_dual_cache(I)[2][i, i])
86+
87+
@testset "Unitarity of left module F-move" begin
88+
for a in fusion_objects, b in fusion_objects, A in mod_objects # written for M as left C-module category
89+
(a.j == b.i && b.j == A.i) || continue # skip if not compatible
90+
for B in (a, b, A)
91+
cs = collect(intersect((a, b), map(dual, (A, dual(B))))) # equivalent of es
92+
Cs = collect(intersect((b, A), map(dual, (dual(B), a)))) # equivalent of fs
93+
Fblocks = Vector{Any}()
94+
for c in cs
95+
for C in Cs
96+
Fs = Fsymbol(a, b, A, B, c, C)
97+
push!(Fblocks,
98+
reshape(Fs,
99+
(size(Fs, 1) * size(Fs, 2),
100+
size(Fs, 3) * size(Fs, 4))))
101+
end
102+
end
103+
F = hvcat(length(Cs), Fblocks...)
104+
isapprox(F' * F, one(F); atol=1e-12, rtol=1e-12) ||
105+
@show A, a, b, B, C, c, F
106+
end
107+
end
108+
end
109+
end
110+
end
111+
112+
for i in 1:7, j in 1:7 # bimodule check unitarity
113+
i != j || continue # skip if fusion category
114+
@testset "$Istr bimodule category $i, $j" begin
115+
C_objects = I.(i, i, MultiTensorKit._get_dual_cache(I)[2][i, i])
116+
mod_objects = I.(i, j, MultiTensorKit._get_dual_cache(I)[2][i, j])
117+
D_objects = I.(j, j, MultiTensorKit._get_dual_cache(I)[2][j, j])
118+
119+
@testset "Unitarity of bimodule F-move" begin
120+
for a in C_objects, A in mod_objects, α in D_objects
121+
(a.j == A.i && A.j == α.i) || continue # skip if not compatible
122+
for B in (a, A, α)
123+
Cs = collect(intersect((a, A), map(dual, (α, dual(B))))) # equivalent of es
124+
Ds = collect(intersect((A, α), map(dual, (dual(B), a)))) # equivalent of fs
125+
Fblocks = Vector{Any}()
126+
for C in Cs
127+
for D in Ds
128+
Fs = Fsymbol(a, A, α, B, C, D)
129+
push!(Fblocks,
130+
reshape(Fs,
131+
(size(Fs, 1) * size(Fs, 2),
132+
size(Fs, 3) * size(Fs, 4))))
133+
end
134+
end
135+
count += 1
136+
F = hvcat(length(Ds), Fblocks...)
137+
isapprox(F' * F, one(F); atol=1e-12, rtol=1e-12) ||
138+
@show A, a, α, B, C, D, F
139+
end
140+
end
141+
end
142+
end
143+
end
144+
145+
@testset "$Istr Pentagon equation" begin
146+
objects = collect(values(I))
53147
for a in objects
54148
for b in objects
55149
a.j == b.i || continue # skip if not compatible
56150
for c in objects
57151
b.j == c.i || continue # skip if not compatible
58152
for d in objects
59-
c.j == d.i || continue # skip if not compatible
153+
c.j == d.i || continue # skip if not compatible #TODO: check if this is right
60154
@test pentagon_equation(a, b, c, d; atol=1e-12, rtol=1e-12)
61155
end
62156
end
63157
end
64158
end
65159
end
66160

67-
@testset "A4 Category ($i, $j) units and duals" for i in 1:s, j in 1:s
68-
Cij_obs = A4Object.(i, j, MultiTensorKit._get_dual_cache(I)[2][i, j])
161+
@testset "$Istr ($i, $j) units and duals" for i in 1:r, j in 1:r
162+
Cij_obs = I.(i, j, MultiTensorKit._get_dual_cache(I)[2][i, j])
69163

70-
s = rand(Cij_obs, 1)[1]
164+
s = rand(Cij_obs)
71165
@test eval(Meta.parse(sprint(show, s))) == s
72166
@test @constinferred(hash(s)) == hash(deepcopy(s))
73167
@test i == j ? isone(@constinferred(one(s))) :
74168
(isone(@constinferred(leftone(s))) && isone(@constinferred(rightone(s))))
75169
@constinferred dual(s)
76-
@test dual(s) == A4Object(j, i, MultiTensorKit._get_dual_cache(I)[2][i, j][s.label])
170+
@test dual(s) == I.(j, i, MultiTensorKit._get_dual_cache(I)[2][i, j][s.label])
77171
@test dual(dual(s)) == s
78172
end
79173

80-
@testset "A4 Category ($i, $j) left and right units" for i in 1:s, j in 1:s
81-
Cij_obs = A4Object.(i, j, MultiTensorKit._get_dual_cache(I)[2][i, j])
174+
@testset "$Istr ($i, $j) left and right units" for i in 1:r, j in 1:r
175+
Cij_obs = I.(i, j, MultiTensorKit._get_dual_cache(I)[2][i, j])
82176

83177
s = rand(Cij_obs, 1)[1]
84-
sp = Vect[A4Object](s => 1)
178+
sp = Vect[I](s => 1)
85179
W = sp sp
86180
for T in (Float32, ComplexF64)
87181
t = @constinferred rand(T, W)

0 commit comments

Comments
 (0)