Skip to content

Commit bdddf67

Browse files
committed
Add gauge transformation for iPEPS and its CTMRGEnv
1 parent aa5875c commit bdddf67

File tree

5 files changed

+119
-1
lines changed

5 files changed

+119
-1
lines changed

src/PEPSKit.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ include("algorithms/ctmrg/projectors.jl")
7171
include("algorithms/ctmrg/simultaneous.jl")
7272
include("algorithms/ctmrg/sequential.jl")
7373
include("algorithms/ctmrg/gaugefix.jl")
74+
include("algorithms/ctmrg/gaugetrans.jl")
7475

7576
include("algorithms/truncation/truncationschemes.jl")
7677
include("algorithms/truncation/fullenv_truncation.jl")
@@ -123,7 +124,7 @@ export InfinitePEPO, InfiniteTransferPEPO
123124

124125
export BPEnv, BeliefPropagation
125126
export BPGauge, SUGauge
126-
export gauge_fix
127+
export gauge_fix, gauge_transform
127128

128129
export initialize_mps, initializePEPS
129130
export ReflectDepth, ReflectWidth, Rotate, RotateReflect

src/algorithms/ctmrg/gaugetrans.jl

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
"""
2+
gauge_transform(env::CTMRGEnv, XXinv)
3+
4+
Transform the CTMRG environment `env` of an InfinitePEPS after it is
5+
transformed by gauge transformations `XXinv` on its virtual bonds.
6+
7+
`XXinv` consists of `(X, X⁻¹)` pairs on each virtual bond of the InfinitePEPS.
8+
```
9+
T[r-1,c]
10+
|
11+
X⁻¹
12+
| [NORTH,r,c]
13+
X
14+
|
15+
T[r,c]----X---X⁻¹----T[r,c+1]
16+
[EAST,r,c]
17+
```
18+
"""
19+
function gauge_transform(env::CTMRGEnv, XXinv)
20+
edges = map(eachcoordinate(env, 1:4)) do (d, r, c)
21+
if d == NORTH
22+
X⁻¹ = XXinv[NORTH, _next(r, end), c][2]
23+
return @tensor edge[χ1 d0 d1; χ2] :=
24+
env.edges[d, r, c][χ1 d0′ d1′; χ2] * X⁻¹[d0; d0′] * conj(X⁻¹[d1; d1′])
25+
elseif d == EAST
26+
X⁻¹ = XXinv[EAST, r, _prev(c, end)][2]
27+
return @tensor edge[χ1 d0 d1; χ2] :=
28+
env.edges[d, r, c][χ1 d0′ d1′; χ2] * X⁻¹[d0; d0′] * conj(X⁻¹[d1; d1′])
29+
elseif d == SOUTH
30+
X = XXinv[NORTH, r, c][1]
31+
return @tensor edge[χ1 d0 d1; χ2] :=
32+
env.edges[d, r, c][χ1 d0′ d1′; χ2] * X[d0′; d0] * conj(X[d1′; d1])
33+
else # d == WEST
34+
X = XXinv[EAST, r, c][1]
35+
return @tensor edge[χ1 d0 d1; χ2] :=
36+
env.edges[d, r, c][χ1 d0′ d1′; χ2] * X[d0′; d0] * conj(X[d1′; d1])
37+
end
38+
end
39+
# corners are unaffected
40+
return CTMRGEnv(env.corners, edges)
41+
end

src/states/infinitepeps.jl

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,3 +270,34 @@ function ChainRulesCore.rrule(
270270
end
271271
return network, InfiniteSquareNetwork_pullback
272272
end
273+
274+
## Gauge transform
275+
276+
"""
277+
gauge_transform(ψ::InfinitePEPS, XXinv)
278+
279+
Transform the InfinitePEPS `ψ` with gauge transformations `XXinv` on its virtual bonds.
280+
281+
`XXinv` consists of `(X, X⁻¹)` pairs on each virtual bond of `ψ`.
282+
```
283+
T[r-1,c]
284+
|
285+
X⁻¹
286+
| [NORTH,r,c]
287+
X
288+
|
289+
T[r,c]----X---X⁻¹----T[r,c+1]
290+
[EAST,r,c]
291+
```
292+
"""
293+
function gauge_transform(ψ::InfinitePEPS, XXinv)
294+
A2 = map(eachcoordinate(ψ)) do (r, c)
295+
Xn = XXinv[NORTH, r, c][1]
296+
Xe = XXinv[EAST, r, c][1]
297+
Xs = XXinv[NORTH, _next(r, end), c][2]
298+
Xw = XXinv[EAST, r, _prev(c, end)][2]
299+
return @tensor t[p; n e s w] := ψ[r, c][p; n′ e′ s′ w′] *
300+
Xn[n′; n] * Xe[e′; e] * Xs[s; s′] * Xw[w; w′]
301+
end
302+
return InfinitePEPS(A2)
303+
end

test/ctmrg/gaugetrans.jl

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
using Test
2+
using Random
3+
using TensorKit
4+
using PEPSKit
5+
using PEPSKit: random_dual!, eachcoordinate, NORTH
6+
7+
ds = Dict(
8+
U1Irrep => U1Space(i => d for (i, d) in zip(-1:1, (1, 1, 2))),
9+
FermionParity => Vect[FermionParity](0 => 2, 1 => 1)
10+
)
11+
Ds = Dict(
12+
U1Irrep => U1Space(i => D for (i, D) in zip(-1:1, (1, 3, 2))),
13+
FermionParity => Vect[FermionParity](0 => 3, 1 => 2)
14+
)
15+
χs = Dict(
16+
U1Irrep => U1Space(i => D for (i, D) in zip(-1:1, (2, 4, 2))),
17+
FermionParity => Vect[FermionParity](0 => 4, 1 => 4)
18+
)
19+
20+
@testset "CTMRGEnv of InfinitePEPS ($S)" for S in keys(ds)
21+
d, D, χ, uc = ds[S], Ds[S], χs[S], (2, 3)
22+
ψds = fill(d, uc)
23+
ψDNs = random_dual!(fill(D, uc))
24+
ψDEs = random_dual!(fill(D, uc))
25+
ψ0 = InfinitePEPS(ψds, ψDNs, ψDEs)
26+
env0 = CTMRGEnv(randn, ComplexF64, ψ0, χ)
27+
# create a random set of gauge transformation on each bond
28+
XXinv = map(eachcoordinate(ψ0, 1:2)) do (d, r, c)
29+
V = (d == NORTH) ? ψDNs[r, c] : ψDEs[r, c]
30+
X = randn(ComplexF64, V V)
31+
return (X, inv(X))
32+
end
33+
# gauge transform ψ and env
34+
ψ1 = gauge_transform(ψ0, XXinv)
35+
env1 = gauge_transform(env0, XXinv)
36+
# reduced density matrices should remain unchanged
37+
for (r, c) in eachcoordinate(ψ0)
38+
ρ0 = reduced_densitymatrix(((r, c),), ψ0, env0)
39+
ρ1 = reduced_densitymatrix(((r, c),), ψ1, env1)
40+
@test ρ0 ρ1
41+
end
42+
end

test/runtests.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ end
2828
@time @safetestset "Gauge Fixing" begin
2929
include("ctmrg/gaugefix.jl")
3030
end
31+
@time @safetestset "Gauge Transform" begin
32+
include("ctmrg/gaugetrans.jl")
33+
end
3134
@time @safetestset "Unit cell" begin
3235
include("ctmrg/unitcell.jl")
3336
end

0 commit comments

Comments
 (0)