Skip to content

Commit 4c64d60

Browse files
authored
Optimize nonlocal Hamiltonian version of VUMPS (#56)
1 parent 195bbf9 commit 4c64d60

File tree

1 file changed

+31
-31
lines changed

1 file changed

+31
-31
lines changed

src/vumps_nonlocalham.jl

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -24,51 +24,51 @@ function Base.:*(H::Hᶜ{MPO}, v::ITensor)
2424
Hᶜᴿv = v * δˡ(n) * Hᴿ[n]
2525
#We now start building terms where C overlap with the local Hamiltonian
2626
# We start with the tensor AL[n] - v - AR[n+1] ... AR[n + range_∑h - 1]
27-
Hᶜʰv = v * ψ.AL[n] * δˡ(n - 1) * ψ′.AL[n] * ∑h[n][1] #left extremity
27+
Hᶜʰv = v * ψ.AL[n] * δˡ(n - 1) * ∑h[n][1] * ψ′.AL[n] #left extremity
2828
common_sites = findsites(ψ, ∑h[n])
2929
idx = 2 #list the sites Σh, we start at 2 because n is already taken into account
3030
for k in 1:(range_∑h - 2)
3131
if n + k == common_sites[idx]
32-
Hᶜʰv = Hᶜʰv * ψ.AR[n + k] * ψ′.AR[n + k] * ∑h[n][idx]
32+
Hᶜʰv = Hᶜʰv * ψ.AR[n + k] * ∑h[n][idx] * ψ′.AR[n + k]
3333
idx += 1
3434
else
35-
Hᶜʰv = Hᶜʰv * ψ.AR[n + k] * ψ′.AR[n + k] * δˢ(n + k)
35+
Hᶜʰv = Hᶜʰv * ψ.AR[n + k] * δˢ(n + k) * ψ′.AR[n + k]
3636
end
3737
end
3838
Hᶜʰv =
3939
Hᶜʰv *
4040
ψ.AR[n + range_∑h - 1] *
4141
δʳ(n + range_∑h - 1) *
42-
ψ′.AR[n + range_∑h - 1] *
43-
∑h[n][end] #right most extremity
42+
∑h[n][end] *
43+
ψ′.AR[n + range_∑h - 1] #right most extremity
4444
#Now we are building contributions of the form AL[n - j] ... AL[n] - v - AR[n + 1] ... AR[n + range_∑h - 1 - j]
4545
for j in 1:(range_∑h - 2)
46-
temp_Hᶜʰv = ψ.AL[n - j] * δˡ(n - 1 - j) * ψ′.AL[n - j] * ∑h[n - j][1]
46+
temp_Hᶜʰv = ψ.AL[n - j] * δˡ(n - 1 - j) * ∑h[n - j][1] * ψ′.AL[n - j]
4747
common_sites = findsites(ψ, ∑h[n - j])
4848
idx = 2
4949
for k in 1:j
5050
if n - j + k == common_sites[idx]
51-
temp_Hᶜʰv = temp_Hᶜʰv * ψ.AL[n - j + k] * ψ′.AL[n - j + k] * ∑h[n - j][idx]
51+
temp_Hᶜʰv = temp_Hᶜʰv * ψ.AL[n - j + k] * ∑h[n - j][idx] * ψ′.AL[n - j + k]
5252
idx += 1
5353
else
54-
temp_Hᶜʰv = temp_Hᶜʰv * ψ.AL[n - j + k] * ψ′.AL[n - j + k] * δˢ(n - j + k)
54+
temp_Hᶜʰv = temp_Hᶜʰv * ψ.AL[n - j + k] * δˢ(n - j + k) * ψ′.AL[n - j + k]
5555
end
5656
end
5757
# Finished the AL part
5858
temp_Hᶜʰv = temp_Hᶜʰv * v
5959
for k in (j + 1):(range_∑h - 2)
6060
if n - j + k == common_sites[idx]
61-
temp_Hᶜʰv = temp_Hᶜʰv * ψ.AR[n - j + k] * ψ′.AR[n - j + k] * ∑h[n - j][idx]
61+
temp_Hᶜʰv = temp_Hᶜʰv * ψ.AR[n - j + k] * ∑h[n - j][idx] * ψ′.AR[n - j + k]
6262
idx += 1
6363
else
64-
temp_Hᶜʰv = temp_Hᶜʰv * ψ.AR[n - j + k] * ψ′.AR[n - j + k] * δˢ(n - j + k)
64+
temp_Hᶜʰv = temp_Hᶜʰv * ψ.AR[n - j + k] * δˢ(n - j + k) * ψ′.AR[n - j + k]
6565
end
6666
end
6767
temp_Hᶜʰv =
6868
temp_Hᶜʰv *
69-
∑h[n - j][end] *
7069
ψ.AR[n - j + range_∑h - 1] *
7170
δʳ(n - j + range_∑h - 1) *
71+
∑h[n - j][end] *
7272
ψ′.AR[n - j + range_∑h - 1]
7373
Hᶜʰv = Hᶜʰv + temp_Hᶜʰv
7474
end
@@ -107,34 +107,34 @@ function Base.:*(H::Hᴬᶜ{MPO}, v::ITensor)
107107
idx = 2 #list the sites Σh, we start at 2 because n is already taken into account
108108
for k in 1:(range_∑h - 2)
109109
if n + k == common_sites[idx]
110-
Hᴬᶜʰv = Hᴬᶜʰv * ψ.AR[n + k] * ψ′.AR[n + k] * ∑h[n][idx]
110+
Hᴬᶜʰv = Hᴬᶜʰv * ψ.AR[n + k] * ∑h[n][idx] * ψ′.AR[n + k]
111111
idx += 1
112112
else
113-
Hᴬᶜʰv = Hᴬᶜʰv * ψ.AR[n + k] * ψ′.AR[n + k] * δˢ(n + k)
113+
Hᴬᶜʰv = Hᴬᶜʰv * ψ.AR[n + k] * δˢ(n + k) * ψ′.AR[n + k]
114114
end
115115
end
116116
Hᴬᶜʰv =
117117
Hᴬᶜʰv *
118-
∑h[n][end] *
119118
ψ.AR[n + range_∑h - 1] *
120-
ψ′.AR[n + range_∑h - 1] *
121-
δʳ(n + range_∑h - 1) #rightmost extremity
119+
δʳ(n + range_∑h - 1) *
120+
∑h[n][end] *
121+
ψ′.AR[n + range_∑h - 1] #rightmost extremity
122122
#Now we are building contributions of the form AL[n - j] ... AL[n-1] - v - AR[n + 1] ... AR[n + range_∑h - 1 - j]
123123
for j in 1:(range_∑h - 1)
124-
temp_Hᴬᶜʰv = ψ.AL[n - j] * δˡ(n - j - 1) * ψ′.AL[n - j] * ∑h[n - j][1]
124+
temp_Hᴬᶜʰv = ψ.AL[n - j] * δˡ(n - j - 1) * ∑h[n - j][1] * ψ′.AL[n - j]
125125
common_sites = findsites(ψ, ∑h[n - j])
126126
idx = 2
127127
for k in 1:(j - 1)
128128
if n - j + k == common_sites[idx]
129-
temp_Hᴬᶜʰv = temp_Hᴬᶜʰv * ψ.AL[n - j + k] * ψ′.AL[n - j + k] * ∑h[n - j][idx]
129+
temp_Hᴬᶜʰv = temp_Hᴬᶜʰv * ψ.AL[n - j + k] * ∑h[n - j][idx] * ψ′.AL[n - j + k]
130130
idx += 1
131131
else
132-
temp_Hᴬᶜʰv = temp_Hᴬᶜʰv * ψ.AL[n - j + k] * ψ′.AL[n - j + k] * δˢ(n - j + k)
132+
temp_Hᴬᶜʰv = temp_Hᴬᶜʰv * ψ.AL[n - j + k] * δˢ(n - j + k) * ψ′.AL[n - j + k]
133133
end
134134
end
135135
#Finished with AL, treating the center AC = v
136136
if j == range_∑h - 1
137-
temp_Hᴬᶜʰv = temp_Hᴬᶜʰv * v * δʳ(n - j + range_∑h - 1) * ∑h[n - j][end]
137+
temp_Hᴬᶜʰv = temp_Hᴬᶜʰv * v * ∑h[n - j][end] * δʳ(n - j + range_∑h - 1)
138138
else
139139
if n == common_sites[idx] #need to check whether we need to branch v
140140
temp_Hᴬᶜʰv = temp_Hᴬᶜʰv * v * ∑h[n - j][idx]
@@ -144,18 +144,18 @@ function Base.:*(H::Hᴬᶜ{MPO}, v::ITensor)
144144
end
145145
for k in (j + 1):(range_∑h - 2)
146146
if n + k - j == common_sites[idx]
147-
temp_Hᴬᶜʰv = temp_Hᴬᶜʰv * ψ.AR[n + k - j] * ψ′.AR[n + k - j] * ∑h[n - j][idx]
147+
temp_Hᴬᶜʰv = temp_Hᴬᶜʰv * ψ.AR[n + k - j] * ∑h[n - j][idx] * ψ′.AR[n + k - j]
148148
idx += 1
149149
else
150-
temp_Hᴬᶜʰv = temp_Hᴬᶜʰv * ψ.AR[n + k - j] * ψ′.AR[n + k - j] * δˢ(n + k - j)
150+
temp_Hᴬᶜʰv = temp_Hᴬᶜʰv * ψ.AR[n + k - j] * δˢ(n + k - j) * ψ′.AR[n + k - j]
151151
end
152152
end
153153
temp_Hᴬᶜʰv =
154154
temp_Hᴬᶜʰv *
155-
∑h[n - j][end] *
156155
ψ.AR[n + range_∑h - 1 - j] *
157-
ψ′.AR[n + range_∑h - 1 - j] *
158-
δʳ(n - j + range_∑h - 1)
156+
δʳ(n - j + range_∑h - 1) *
157+
∑h[n - j][end] *
158+
ψ′.AR[n + range_∑h - 1 - j]
159159
end
160160
Hᴬᶜʰv = Hᴬᶜʰv + temp_Hᴬᶜʰv
161161
end
@@ -192,12 +192,12 @@ function left_environment(∑h::InfiniteSum{MPO}, ψ::InfiniteCanonicalMPS; tol=
192192
hᴸ[k] =
193193
hᴸ[k] *
194194
ψ.AL[k - range_∑h + j] *
195-
ψ′.AL[k - range_∑h + j] *
196-
∑h[(k - range_∑h + 1, k - range_∑h + 2)][idx]
195+
∑h[(k - range_∑h + 1, k - range_∑h + 2)][idx] *
196+
ψ′.AL[k - range_∑h + j]
197197
idx += 1
198198
else
199199
hᴸ[k] =
200-
hᴸ[k] * ψ.AL[k - range_∑h + j] * ψ′.AL[k - range_∑h + j] * δˢ(k - range_∑h + j)
200+
hᴸ[k] * ψ.AL[k - range_∑h + j] * δˢ(k - range_∑h + j) * ψ′.AL[k - range_∑h + j]
201201
end
202202
end
203203
end
@@ -242,15 +242,15 @@ function right_environment(∑h::InfiniteSum{MPO}, ψ::InfiniteCanonicalMPS; tol
242242

243243
hᴿ = Vector{ITensor}(undef, Nsites)
244244
for k in 1:Nsites
245-
hᴿ[k] = ψ.AR[k + range_∑h] * ∑h[k + 1][end] * ψ′.AR[k + range_∑h] * δʳ(k + range_∑h)
245+
hᴿ[k] = ψ.AR[k + range_∑h] * δʳ(k + range_∑h) * ∑h[k + 1][end] * ψ′.AR[k + range_∑h]
246246
common_sites = findsites(ψ, ∑h[k + 1])
247247
idx = length(common_sites) - 1
248248
for j in (range_∑h - 1):-1:1
249249
if k + j == common_sites[idx]
250-
hᴿ[k] = hᴿ[k] * ψ.AR[k + j] * ψ′.AR[k + j] * ∑h[k + 1][idx]
250+
hᴿ[k] = hᴿ[k] * ψ.AR[k + j] * ∑h[k + 1][idx] * ψ′.AR[k + j]
251251
idx -= 1
252252
else
253-
hᴿ[k] = hᴿ[k] * ψ.AR[k + j] * ψ′.AR[k + j] * δˢ(k + j)
253+
hᴿ[k] = hᴿ[k] * ψ.AR[k + j] * δˢ(k + j) * ψ′.AR[k + j]
254254
end
255255
end
256256
end

0 commit comments

Comments
 (0)