Skip to content

Commit 5bd5c12

Browse files
committed
add pure module F-move unitarity check + clean up tests
1 parent 94eb6d1 commit 5bd5c12

File tree

1 file changed

+39
-14
lines changed

1 file changed

+39
-14
lines changed

test/test_A4.jl

Lines changed: 39 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -48,15 +48,14 @@ end
4848
end
4949
end
5050

51-
for i in 1:r, j in 1:r # M x D (or Mop x C)
51+
for i in 1:r, j in 1:r
5252
i != j || continue # skip if fusion category
5353
@testset "$Istr right module category $i, $j" begin
5454
mod_objects = I.(i, j, MultiTensorKit._get_dual_cache(I)[2][i, j])
5555
fusion_objects = I.(j, j, MultiTensorKit._get_dual_cache(I)[2][j, j])
5656

57-
@testset "Unitarity of module F-move $i, $j" begin
57+
@testset "Unitarity of module F-move $i, $j" begin # written as MxD, but with i<->j checks MopxC
5858
for A in mod_objects, α in fusion_objects, β in fusion_objects
59-
(A.j == α.i && α.j == β.i) || continue # skip if not compatible
6059
for B in (A, α, β)
6160
Cs = collect(intersect((A, α), map(dual, (β, dual(B)))))
6261
γs = collect(intersect((α, β), map(dual, (dual(B), A))))
@@ -78,15 +77,14 @@ for i in 1:r, j in 1:r # M x D (or Mop x C)
7877
end
7978
end
8079

81-
for i in 1:7, j in 1:7 # C x M (or D x Mop)
80+
for i in 1:7, j in 1:7 # C x M (or D x Mop with i<->j)
8281
i != j || continue # skip if fusion category
8382
@testset "$Istr left module category $i, $j unitarity check" begin
8483
mod_objects = I.(i, j, MultiTensorKit._get_dual_cache(I)[2][i, j])
8584
fusion_objects = I.(i, i, MultiTensorKit._get_dual_cache(I)[2][i, i])
8685

8786
@testset "Unitarity of left module F-move" begin
8887
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
9088
for B in (a, b, A)
9189
cs = collect(intersect((a, b), map(dual, (A, dual(B))))) # equivalent of es
9290
Cs = collect(intersect((b, A), map(dual, (dual(B), a)))) # equivalent of fs
@@ -101,24 +99,22 @@ for i in 1:7, j in 1:7 # C x M (or D x Mop)
10199
end
102100
end
103101
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
102+
@test isapprox(F' * F, one(F); atol=1e-12, rtol=1e-12)
106103
end
107104
end
108105
end
109106
end
110107
end
111108

112-
for i in 1:7, j in 1:7 # bimodule check unitarity
109+
for i in 1:7, j in 1:7 # bimodule check unitarity (C x M x D or D x Mop x C)
113110
i != j || continue # skip if fusion category
114111
@testset "$Istr bimodule category $i, $j" begin
115112
C_objects = I.(i, i, MultiTensorKit._get_dual_cache(I)[2][i, i])
116113
mod_objects = I.(i, j, MultiTensorKit._get_dual_cache(I)[2][i, j])
117114
D_objects = I.(j, j, MultiTensorKit._get_dual_cache(I)[2][j, j])
118115

119-
@testset "Unitarity of bimodule F-move" begin
116+
@testset "Unitarity of bimodule F-move" begin # written as CMD
120117
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
122118
for B in (a, A, α)
123119
Cs = collect(intersect((a, A), map(dual, (α, dual(B))))) # equivalent of es
124120
Ds = collect(intersect((A, α), map(dual, (dual(B), a)))) # equivalent of fs
@@ -132,16 +128,45 @@ for i in 1:7, j in 1:7 # bimodule check unitarity
132128
size(Fs, 3) * size(Fs, 4))))
133129
end
134130
end
135-
count += 1
136131
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
132+
@test isapprox(F' * F, one(F); atol=1e-12, rtol=1e-12)
139133
end
140134
end
141135
end
142136
end
143137
end
144138

139+
for i in 1:7, j in 1:7 # M x Mop x M -> M (or Mop x M x Mop -> Mop)
140+
i != j || continue # skip if not fusion category
141+
@testset "$Istr Module category $i,$j and opposite $j,$i" begin
142+
M_objects = I.(i, j, MultiTensorKit._get_dual_cache(I)[2][i, j])
143+
Mop_objects = I.(j, i, MultiTensorKit._get_dual_cache(I)[2][j, i])
144+
C_objects = I.(i, i, MultiTensorKit._get_dual_cache(I)[2][i,i])
145+
D_objects = I.(j, j, MultiTensorKit._get_dual_cache(I)[2][j, j])
146+
147+
@testset "Unitarity of pure module F-move" begin
148+
for A in M_objects, Aop in Mop_objects, B in M_objects # written for M x Mop x M -> M
149+
for C in (A, Aop, B)
150+
cs = collect(intersect((A, Aop), map(dual, (B, dual(C))))) # equivalent of es
151+
γs = collect(intersect((Aop, B), map(dual, (dual(C), A)))) # equivalent of fs
152+
Fblocks = Vector{Any}()
153+
for c in cs
154+
for γ in γs
155+
Fs = Fsymbol(A, Aop, B, C, c, γ)
156+
push!(Fblocks,
157+
reshape(Fs,
158+
(size(Fs, 1) * size(Fs, 2),
159+
size(Fs, 3) * size(Fs, 4))))
160+
end
161+
end
162+
F = hvcat(length(γs), Fblocks...)
163+
@test isapprox(F' * F, one(F); atol=1e-12, rtol=1e-12)
164+
end
165+
end
166+
end
167+
end
168+
end
169+
145170
@testset "$Istr Pentagon equation" begin
146171
objects = collect(values(I))
147172
for a in objects
@@ -150,7 +175,7 @@ end
150175
for c in objects
151176
b.j == c.i || continue # skip if not compatible
152177
for d in objects
153-
c.j == d.i || continue # skip if not compatible #TODO: check if this is right
178+
c.j == d.i || continue # skip if not compatible
154179
@test pentagon_equation(a, b, c, d; atol=1e-12, rtol=1e-12)
155180
end
156181
end

0 commit comments

Comments
 (0)