Skip to content

Commit 21fea7d

Browse files
committed
Implement sparse environment application as proper multiplication, env * x
1 parent 8322035 commit 21fea7d

3 files changed

Lines changed: 52 additions & 26 deletions

File tree

src/algorithms/contractions/ctmrg/fullinf_env.jl

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -157,14 +157,24 @@ end
157157
return macroexpand(@__MODULE__, :(return @autoopt @tensor $env_e := $proj_expr))
158158
end
159159

160-
# right linear map action: tensorcontract(env, x)
161-
# TODO: if we want multiplication action env * x, we need additional twists
160+
# right linear map action: env * x
162161
function full_infinite_environment(
163162
env::AbstractTensorMap{T, S, N, N}, x::AbstractTensor{T, S, N}
164163
) where {T, S, N}
165164
return half_infinite_environment(env, x)
166165
end
167166
function full_infinite_environment(
167+
C_1, C_2, C_3, C_4,
168+
E_1, E_2, E_3, E_4, E_5, E_6, E_7, E_8,
169+
x::AbstractTensor{T, S, N},
170+
A_1, A_2, A_3, A_4,
171+
) where {T, S, N}
172+
xt = twistdual(x, 1:N)
173+
return _full_infinite_environment(
174+
C_1, C_2, C_3, C_4, E_1, E_2, E_3, E_4, E_5, E_6, E_7, E_8, xt, A_1, A_2, A_3, A_4
175+
)
176+
end
177+
function _full_infinite_environment(
168178
C_1, C_2, C_3, C_4,
169179
E_1, E_2, E_3, E_4, E_5, E_6, E_7, E_8,
170180
x::AbstractTensor{T, S, 3},
@@ -181,7 +191,7 @@ function full_infinite_environment(
181191
E_7[χ9 D19 D20; χ10] * C_4[χ10; χ11] * E_8[χ11 D21 D22; χ_x] *
182192
x[χ_x D_xabove D_xbelow]
183193
end
184-
function full_infinite_environment(
194+
function _full_infinite_environment(
185195
C_1, C_2, C_3, C_4,
186196
E_1, E_2, E_3, E_4, E_5, E_6, E_7, E_8,
187197
x::AbstractTensor{T, S, 2},
@@ -198,7 +208,7 @@ function full_infinite_environment(
198208
E_7[χ9 D19; χ10] * C_4[χ10; χ11] * E_8[χ11 D21; χ_x] *
199209
x[χ_x D_x]
200210
end
201-
@generated function full_infinite_environment(
211+
@generated function _full_infinite_environment(
202212
C_1, C_2, C_3, C_4,
203213
E_1, E_2, E_3, E_4, E_5, E_6, E_7, E_8,
204214
x::AbstractTensor{T, S, N},
@@ -218,14 +228,24 @@ end
218228
return macroexpand(@__MODULE__, :(return @autoopt @tensor $env_x_e := $proj_expr * $x_e))
219229
end
220230

221-
# left linear map action via adjoint: tensorcontract(env', x) (kind of...)
222-
# TODO: if we want multiplication action env' * x, we need additional twists
231+
# left linear map action via adjoint: env' * x
223232
function full_infinite_environment(
224233
x::AbstractTensor{T, S, N}, env::AbstractTensorMap{T, S, N, N},
225234
) where {T, S, N}
226235
return half_infinite_environment(x, env)
227236
end
228237
function full_infinite_environment(
238+
x::AbstractTensor{T, S, N},
239+
C_1, C_2, C_3, C_4,
240+
E_1, E_2, E_3, E_4, E_5, E_6, E_7, E_8,
241+
A_1, A_2, A_3, A_4,
242+
) where {T, S, N}
243+
xt = twistdual(x, 1:N)
244+
return _full_infinite_environment(
245+
xt, C_1, C_2, C_3, C_4, E_1, E_2, E_3, E_4, E_5, E_6, E_7, E_8, A_1, A_2, A_3, A_4
246+
)
247+
end
248+
function _full_infinite_environment(
229249
x::AbstractTensor{T, S, 3},
230250
C_1, C_2, C_3, C_4,
231251
E_1, E_2, E_3, E_4, E_5, E_6, E_7, E_8,
@@ -242,7 +262,7 @@ function full_infinite_environment(
242262
conj(ket(A_4)[d4; D_inabove D17 D19 D21]) * bra(A_4)[d4; D_inbelow D18 D20 D22] *
243263
conj(E_7[χ9 D19 D20; χ10]) * conj(C_4[χ10; χ11]) * conj(E_8[χ11 D21 D22; χ_in])
244264
end
245-
function full_infinite_environment(
265+
function _full_infinite_environment(
246266
x::AbstractTensor{T, S, 2},
247267
C_1, C_2, C_3, C_4,
248268
E_1, E_2, E_3, E_4, E_5, E_6, E_7, E_8,
@@ -259,7 +279,7 @@ function full_infinite_environment(
259279
conj(A_4[D21 D19; D_in D17]) *
260280
conj(E_7[χ9 D19; χ10]) * conj(C_4[χ10; χ11]) * conj(E_8[χ11 D21; χ_in])
261281
end
262-
@generated function full_infinite_environment(
282+
@generated function _full_infinite_environment(
263283
x::AbstractTensor{T, S, N},
264284
C_1, C_2, C_3, C_4,
265285
E_1, E_2, E_3, E_4, E_5, E_6, E_7, E_8,

src/algorithms/contractions/ctmrg/halfinf_env.jl

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -72,16 +72,19 @@ end
7272
return macroexpand(@__MODULE__, :(return @autoopt @tensor $env_e := $proj_expr))
7373
end
7474

75-
# right linear map action: tensorcontract(env, x)
76-
# TODO: if we want multiplication action env * x, we need additional twists
75+
# right linear map action: env * x
7776
function half_infinite_environment(
7877
env::AbstractTensorMap{T, S, N, N}, x::AbstractTensor{T, S, N}
7978
) where {T, S, N}
80-
envi = (codomainind(env), domainind(env))
81-
xi = (codomainind(x), domainind(x))
82-
return tensorcontract(env, envi, false, x, xi, false, xi)
79+
return env * x
8380
end
8481
function half_infinite_environment(
82+
C_1, C_2, E_1, E_2, E_3, E_4, x::AbstractTensor{T, S, N}, A_1, A_2
83+
) where {T, S, N}
84+
xt = twistdual(x, 1:N)
85+
return _half_infinite_environment(C_1, C_2, E_1, E_2, E_3, E_4, xt, A_1, A_2)
86+
end
87+
function _half_infinite_environment(
8588
C_1, C_2, E_1, E_2, E_3, E_4, x::AbstractTensor{T, S, 3}, A_1::P, A_2::P
8689
) where {T, S, P <: PEPSSandwich}
8790
return @autoopt @tensor env_x[χ_out D_outabove D_outbelow] :=
@@ -91,7 +94,7 @@ function half_infinite_environment(
9194
E_3[χ3 D5 D6; χ4] * C_2[χ4; χ5] * E_4[χ5 D7 D8; χ6] *
9295
x[χ6 D11 D12]
9396
end
94-
function half_infinite_environment(
97+
function _half_infinite_environment(
9598
C_1, C_2, E_1, E_2, E_3, E_4, x::AbstractTensor{T, S, 2}, A_1::P, A_2::P
9699
) where {T, S, P <: PFTensor}
97100
return @autoopt @tensor env_x[χ_out D_out] :=
@@ -101,7 +104,7 @@ function half_infinite_environment(
101104
E_3[χ3 D5; χ4] * C_2[χ4; χ5] * E_4[χ5 D7; χ6] *
102105
x[χ6 D11]
103106
end
104-
@generated function half_infinite_environment(
107+
@generated function _half_infinite_environment(
105108
C_1, C_2,
106109
E_1, E_2, E_3, E_4,
107110
x::AbstractTensor{T, S, N},
@@ -123,16 +126,19 @@ end
123126
)
124127
end
125128

126-
# left linear map action via adjoint: tensorcontract(env', x) (kind of...)
127-
# TODO: if we want multiplication action env' * x, we need additional twists
129+
# left linear map action via adjoint: env' * x
128130
function half_infinite_environment(
129131
x::AbstractTensor{T, S, N}, env::AbstractTensorMap{T, S, N, N},
130132
) where {T, S, N}
131-
envi = (domainind(env), codomainind(env))
132-
xi = (codomainind(x), domainind(x))
133-
return tensorcontract(env, envi, true, x, xi, false, xi)
133+
return env' * x
134134
end
135135
function half_infinite_environment(
136+
x::AbstractTensor{T, S, N}, C_1, C_2, E_1, E_2, E_3, E_4, A_1, A_2
137+
) where {T, S, N}
138+
xt = twistdual(x, 1:N)
139+
return _half_infinite_environment(xt, C_1, C_2, E_1, E_2, E_3, E_4, A_1, A_2)
140+
end
141+
function _half_infinite_environment(
136142
x::AbstractTensor{T, S, 3}, C_1, C_2, E_1, E_2, E_3, E_4, A_1::P, A_2::P
137143
) where {T, S, P <: PEPSSandwich}
138144
return @autoopt @tensor x_env[χ_in D_inabove D_inbelow] :=
@@ -142,7 +148,7 @@ function half_infinite_environment(
142148
conj(ket(A_2)[d2; D7 D9 D_inabove D11]) * bra(A_2)[d2; D8 D10 D_inbelow D12] *
143149
conj(E_3[χ4 D7 D8; χ5]) * conj(C_2[χ5; χ6]) * conj(E_4[χ6 D9 D10; χ_in])
144150
end
145-
function half_infinite_environment(
151+
function _half_infinite_environment(
146152
x::AbstractTensor{T, S, 2}, C_1, C_2, E_1, E_2, E_3, E_4, A_1::P, A_2::P
147153
) where {T, S, P <: PFTensor}
148154
return @autoopt @tensor env_x[χ_in D_in] :=
@@ -152,7 +158,7 @@ function half_infinite_environment(
152158
conj(A_2[D_C D_in; D_N2 D_E2]) *
153159
conj(E_3[χ_N D_N2; χ_NNE]) * conj(C_2[χ_NNE; χ_ENE]) * conj(E_4[χ_ENE D_E2; χ_in])
154160
end
155-
@generated function half_infinite_environment(
161+
@generated function _half_infinite_environment(
156162
x::AbstractTensor{T, S, N},
157163
C_1, C_2,
158164
E_1, E_2, E_3, E_4,

test/ctmrg/contractions.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,8 @@ function test_contractions(n::InfiniteSquareNetwork, env::CTMRGEnv)
136136
# application
137137
xr = random_start_vector(shenv)
138138
xl = randn(storagetype(shenv), codomain(shenv))
139-
@test shenv(xr, Val(false)) half_infinite_environment(dhenv, xr)
140-
@test shenv(xl, Val(true)) half_infinite_environment(xl, dhenv)
139+
@test shenv(xr, Val(false)) dhenv * xr
140+
@test shenv(xl, Val(true)) dhenv' * xl
141141

142142
# projector computation
143143
P_left_sparse, P_right_sparse = contract_projectors(
@@ -163,8 +163,8 @@ function test_contractions(n::InfiniteSquareNetwork, env::CTMRGEnv)
163163
# application
164164
xl = randn(storagetype(sfenv), codomain(sfenv))
165165
xr = random_start_vector(sfenv)
166-
@test sfenv(xr, Val(false)) full_infinite_environment(dfenv, xr)
167-
@test sfenv(xl, Val(true)) full_infinite_environment(xl, dfenv)
166+
@test sfenv(xr, Val(false)) dfenv * xr
167+
@test sfenv(xl, Val(true)) dfenv' * xl
168168

169169
# projector computation
170170
P_left_sparse, P_right_sparse = contract_projectors(

0 commit comments

Comments
 (0)