36
36
37
37
# # PEPO
38
38
39
- # some plumbing for generic expressions...
40
-
41
- # side=:W for argument, side=:E for output, PEPO height H
42
- function _pepo_leftenv_expr (envname, side:: Symbol , H:: Int )
43
- return tensorexpr (
44
- envname,
45
- (
46
- envlabel (:S , side),
47
- virtuallabel (side, :top ),
48
- ntuple (i -> virtuallabel (side, :mid , i), H)... ,
49
- virtuallabel (side, :bot ),
50
- ),
51
- (envlabel (:N , side),),
52
- )
53
- end
54
-
55
- # side=:E for argument, side=:W for output, PEPO height H
56
- function _pepo_rightenv_expr (envname, side:: Symbol , H:: Int )
57
- return tensorexpr (
58
- envname,
59
- (
60
- envlabel (:N , side),
61
- virtuallabel (side, :top ),
62
- ntuple (i -> virtuallabel (side, :mid , i), H)... ,
63
- virtuallabel (side, :bot ),
64
- ),
65
- (envlabel (:S , side),),
66
- )
67
- end
68
-
69
- # side=:N for ket MPS, side=:S for bra MPS, PEPO height H
70
- function _pepo_mpstensor_expr (tensorname, side:: Symbol , H:: Int )
71
- return tensorexpr (
72
- tensorname,
73
- (
74
- envlabel (side, :W ),
75
- virtuallabel (side, :top ),
76
- ntuple (i -> virtuallabel (side, :mid , i), H)... ,
77
- virtuallabel (side, :bot ),
78
- ),
79
- (envlabel (side, :E ),),
80
- )
81
- end
82
-
83
- # layer=:top for ket PEPS, layer=:bot for bra PEPS, connects to PEPO slice H
84
- function _pepo_pepstensor_expr (tensorname, layer:: Symbol , h:: Int )
85
- return tensorexpr (
86
- tensorname,
87
- (physicallabel (h),),
88
- (
89
- virtuallabel (:N , layer),
90
- virtuallabel (:E , layer),
91
- virtuallabel (:S , layer),
92
- virtuallabel (:W , layer),
93
- ),
94
- )
95
- end
96
-
97
- # PEPO slice h
98
- function _pepo_pepotensor_expr (tensorname, h:: Int )
99
- return tensorexpr (
100
- tensorname,
101
- (physicallabel (h + 1 ), physicallabel (h)),
102
- (
103
- virtuallabel (:N , :mid , h),
104
- virtuallabel (:E , :mid , h),
105
- virtuallabel (:S , :mid , h),
106
- virtuallabel (:W , :mid , h),
107
- ),
108
- )
109
- end
110
-
111
- # specialize simple case
112
- function MPSKit. transfer_left (
113
- GL:: GenericMPSTensor{S,4} ,
114
- O:: PEPOSandwich{1} ,
115
- A:: GenericMPSTensor{S,4} ,
116
- Ā:: GenericMPSTensor{S,4} ,
117
- ) where {S}
118
- return @autoopt @tensor GL′[χ_SE D_E_above D_E_mid D_E_below; χ_NE] :=
119
- GL[χ_SW D_W_above D_W_mid D_W_below; χ_NW] *
120
- conj (Ā[χ_SW D_S_above D_S_mid D_S_below; χ_SE]) *
121
- ket (O)[d_in; D_N_above D_E_above D_S_above D_W_above] *
122
- only (pepo (O))[d_out d_in; D_N_mid D_E_mid D_S_mid D_W_mid] *
123
- conj (bra (O)[d_out; D_N_below D_E_below D_S_below D_W_below]) *
124
- A[χ_NW D_N_above D_N_mid D_N_below; χ_NE]
125
- end
126
-
127
- # general case
128
39
@generated function MPSKit. transfer_left (
129
40
GL:: GenericMPSTensor{S,N} ,
130
41
O:: PEPOSandwich{H} ,
134
45
# sanity check
135
46
@assert H == N - 3
136
47
137
- GL´_e = _pepo_leftenv_expr (:GL´ , :E , H)
138
- GL_e = _pepo_leftenv_expr (:GL , :W , H)
139
- A_e = _pepo_mpstensor_expr (:A , :N , H)
140
- Ā_e = _pepo_mpstensor_expr (:Ā , :S , H)
141
- ket_e = _pepo_pepstensor_expr (:(ket (O)), :top , 1 )
142
- bra_e = _pepo_pepstensor_expr (:(bra (O)), :bot , H + 1 )
143
- pepo_es = map (1 : H) do h
144
- return _pepo_pepotensor_expr (:(pepo (O)[$ h]), h)
145
- end
48
+ GL´_e = _pepo_edge_expr (:GL´ , :SE , :NE , :E , H)
49
+ GL_e = _pepo_edge_expr (:GL , :SW , :NW , :W , H)
50
+ A_e = _pepo_edge_expr (:A , :NW , :NE , :N , H)
51
+ Ā_e = _pepo_edge_expr (:Ā , :SW , :SE , :S , H)
52
+ ket_e, bra_e, pepo_es = _pepo_sandwich_expr (:O , H)
146
53
147
54
rhs = Expr (
148
55
:call ,
158
65
return macroexpand (@__MODULE__ , :(return @autoopt @tensor $ GL´_e := $ rhs))
159
66
end
160
67
161
- # specialize simple case
162
- function MPSKit. transfer_right (
163
- GR:: GenericMPSTensor{S,4} ,
164
- O:: PEPOSandwich{1} ,
165
- A:: GenericMPSTensor{S,4} ,
166
- Ā:: GenericMPSTensor{S,4} ,
167
- ) where {S}
168
- return @tensor GR′[χ_NW D_W_above D_W_mid D_W_below; χ_SW] :=
169
- GR[χ_NE D_E_above D_E_mid D_E_below; χ_SE] *
170
- conj (Ā[χ_SW D_S_above D_S_mid D_S_below; χ_SE]) *
171
- ket (O)[d_in; D_N_above D_E_above D_S_above D_W_above] *
172
- only (pepo (O))[d_out d_in; D_N_mid D_E_mid D_S_mid D_W_mid] *
173
- conj (bra (O)[d_out; D_N_below D_E_below D_S_below D_W_below]) *
174
- A[χ_NW D_N_above D_N_mid D_N_below; χ_NE]
175
- end
176
-
177
- # general case
178
68
@generated function MPSKit. transfer_right (
179
69
GR:: GenericMPSTensor{S,N} ,
180
70
O:: PEPOSandwich{H} ,
184
74
# sanity check
185
75
@assert H == N - 3
186
76
187
- GR´_e = _pepo_rightenv_expr (:GR´ , :W , H)
188
- GR_e = _pepo_rightenv_expr (:GR , :E , H)
189
- A_e = _pepo_mpstensor_expr (:A , :N , H)
190
- Ā_e = _pepo_mpstensor_expr (:Ā , :S , H)
191
- ket_e = _pepo_pepstensor_expr (:(ket (O)), :top , 1 )
192
- bra_e = _pepo_pepstensor_expr (:(bra (O)), :bot , H + 1 )
193
- pepo_es = map (1 : H) do h
194
- return _pepo_pepotensor_expr (:(pepo (O)[$ h]), h)
195
- end
77
+ GR´_e = _pepo_edge_expr (:GR´ , :NW , :SW , :W , H)
78
+ GR_e = _pepo_edge_expr (:GR , :NE , :SE , :E , H)
79
+ A_e = _pepo_edge_expr (:A , :NW , :NE , :N , H)
80
+ Ā_e = _pepo_edge_expr (:Ā , :SW , :SE , :S , H)
81
+ ket_e, bra_e, pepo_es = _pepo_sandwich_expr (:O , H)
196
82
197
83
rhs = Expr (
198
84
:call ,
276
162
277
163
# # PEPO
278
164
279
- # specialize simple case
280
- function MPSKit. ∂AC (
281
- AC:: GenericMPSTensor{S,4} ,
282
- O:: PEPOSandwich{1} ,
283
- GL:: GenericMPSTensor{S,4} ,
284
- GR:: GenericMPSTensor{S,4} ,
285
- ) where {S}
286
- return @tensor AC′[χ_SW D_S_above D_S_mid D_S_below; χ_SE] :=
287
- GL[χ_SW D_W_above D_W_mid D_W_below; χ_NW] *
288
- AC[χ_NW D_N_above D_N_mid D_N_below; χ_NE] *
289
- GR[χ_NE D_E_above D_E_mid D_E_below; χ_SE] *
290
- ket (O)[d_in; D_N_above D_E_above D_S_above D_W_above] *
291
- only (pepo (O))[d_out d_in; D_N_mid D_E_mid D_S_mid D_W_mid] *
292
- conj (bra (O)[d_out; D_N_below D_E_below D_S_below D_W_below])
293
- end
294
-
295
165
@generated function MPSKit. ∂AC (
296
166
AC:: GenericMPSTensor{S,N} ,
297
167
O:: PEPOSandwich{H} ,
@@ -301,15 +171,11 @@ end
301
171
# sanity check
302
172
@assert H == N - 3
303
173
304
- AC´_e = _pepo_mpstensor_expr (:AC´ , :S , H)
305
- AC_e = _pepo_mpstensor_expr (:AC , :N , H)
306
- GL_e = _pepo_leftenv_expr (:GL , :W , H)
307
- GR_e = _pepo_rightenv_expr (:GR , :E , H)
308
- ket_e = _pepo_pepstensor_expr (:(ket (O)), :top , 1 )
309
- bra_e = _pepo_pepstensor_expr (:(bra (O)), :bot , H + 1 )
310
- pepo_es = map (1 : H) do h
311
- return _pepo_pepotensor_expr (:(pepo (O)[$ h]), h)
312
- end
174
+ AC´_e = _pepo_edge_expr (:AC´ , :SW , :SE , :S , H)
175
+ AC_e = _pepo_edge_expr (:AC , :NW , :NE , :N , H)
176
+ GL_e = _pepo_edge_expr (:GL , :SW , :NW , :W , H)
177
+ GR_e = _pepo_edge_expr (:GR , :NE , :SE , :E , H)
178
+ ket_e, bra_e, pepo_es = _pepo_sandwich_expr (:O , H)
313
179
314
180
rhs = Expr (:call , :* , AC_e, GL_e, GR_e, ket_e, Expr (:call , :conj , bra_e), pepo_es... )
315
181
@@ -324,23 +190,6 @@ ket(p::∂PEPOSandwich) = p[1]
324
190
pepo (p: :∂PEPOSandwich ) = p[2 : end ]
325
191
pepo (p: :∂PEPOSandwich , i:: Int ) = p[1 + i]
326
192
327
- # specialize simple case
328
- function ∂peps (
329
- AC:: GenericMPSTensor{S,4} ,
330
- ĀC:: GenericMPSTensor{S,4} ,
331
- O: :∂PEPOSandwich {1 },
332
- GL:: GenericMPSTensor{S,4} ,
333
- GR:: GenericMPSTensor{S,4} ,
334
- ) where {S}
335
- return @tensor ∂p[d_out; D_N_below D_E_below D_S_below D_W_below] :=
336
- GL[χ_SW D_W_above D_W_mid D_W_below; χ_NW] *
337
- AC[χ_NW D_N_above D_N_mid D_N_below; χ_NE] *
338
- ket (O)[d_in; D_N_above D_E_above D_S_above D_W_above] *
339
- only (pepo (O))[d_out d_in; D_N_mid D_E_mid D_S_mid D_W_mid] *
340
- GR[χ_NE D_E_above D_E_mid D_E_below; χ_SE] *
341
- conj (ĀC[χ_SW D_S_above D_S_mid D_S_below; χ_SE])
342
- end
343
-
344
193
@generated function ∂peps (
345
194
AC:: GenericMPSTensor{S,N} ,
346
195
ĀC:: GenericMPSTensor{S,N} ,
@@ -352,14 +201,11 @@ end
352
201
@assert H == N - 3
353
202
354
203
∂p_e = _pepo_pepstensor_expr (:∂p , :bot , H + 1 )
355
- AC_e = _pepo_mpstensor_expr (:AC , :N , H)
356
- ĀC_e = _pepo_mpstensor_expr (:ĀC , :S , H)
357
- GL_e = _pepo_leftenv_expr (:GL , :W , H)
358
- GR_e = _pepo_rightenv_expr (:GR , :E , H)
359
- ket_e = _pepo_pepstensor_expr (:(ket (O)), :top , 1 )
360
- pepo_es = map (1 : H) do h
361
- return _pepo_pepotensor_expr (:(pepo (O, $ h)), h)
362
- end
204
+ AC_e = _pepo_edge_expr (:AC , :NW , :NE , :N , H)
205
+ ĀC_e = _pepo_edge_expr (:ĀC , :SW , :SE , :S , H)
206
+ GL_e = _pepo_edge_expr (:GL , :SW , :NW , :W , H)
207
+ GR_e = _pepo_edge_expr (:GR , :NE , :SE , :E , H)
208
+ ket_e, bra_e, pepo_es = _pepo_sandwich_expr (:O , H)
363
209
364
210
rhs = Expr (:call , :* , AC_e, Expr (:call , :conj , ĀC_e), GL_e, GR_e, ket_e, pepo_es... )
365
211
0 commit comments