Skip to content

Commit 07deb47

Browse files
authored
More VUMPS optimizations (#65)
* Reorder contraction sequence in the rest of the MPOs in HAC and HC, contracting towards AC * Replace delta contractions with replaceinds in VUMPS
1 parent cd7c88c commit 07deb47

File tree

1 file changed

+106
-50
lines changed

1 file changed

+106
-50
lines changed

src/vumps_nonlocalham.jl

Lines changed: 106 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -14,62 +14,88 @@ function Base.:*(H::Hᶜ{MPO}, v::ITensor)
1414
r′ = linkinds(only, ψ′.AR)
1515
s = siteinds(only, ψ)
1616
s′ = siteinds(only, ψ′)
17-
δˢ(n) = δ(dag(s[n]), prime(s[n]))
18-
δʳ(n) = δ(dag(r[n]), prime(r[n]))
19-
δˡ(n) = δ(l[n], l′[n])
17+
18+
# Remove temporarily in favor of `replaceinds`,
19+
# which is more efficient.
20+
# δˢ(n) = δ(dag(s[n]), prime(s[n]))
21+
# δʳ(n) = δ(dag(r[n]), prime(r[n]))
22+
# δˡ(n) = δ(l[n], l′[n])
2023

2124
#Build the contribution of the left environment
22-
Hᶜᴸv = v * Hᴸ[n] * δʳ(n)
25+
# Hᶜᴸv = v * Hᴸ[n] * δʳ(n)
26+
Hᶜᴸv = replaceinds(v * Hᴸ[n], r[n] => r[n]')
2327
#Build the contribution of the right environment
24-
Hᶜᴿv = v * δˡ(n) * Hᴿ[n]
28+
# Hᶜᴿv = v * δˡ(n) * Hᴿ[n]
29+
Hᶜᴿv = replaceinds(v, l[n] => l[n]') * Hᴿ[n]
2530
#We now start building terms where C overlap with the local Hamiltonian
2631
# We start with the tensor AL[n] - v - AR[n+1] ... AR[n + range_∑h - 1]
32+
# Hᶜʰv =
33+
# δʳ(n + range_∑h - 1) * ψ.AR[n + range_∑h - 1] * ∑h[n][end] * ψ′.AR[n + range_∑h - 1]
2734
Hᶜʰv =
28-
δʳ(n + range_∑h - 1) * ψ.AR[n + range_∑h - 1] * ∑h[n][end] * ψ′.AR[n + range_∑h - 1]
35+
replaceinds.AR[n + range_∑h - 1], r[n + range_∑h - 1] => r[n + range_∑h - 1]') *
36+
∑h[n][end] *
37+
ψ′.AR[n + range_∑h - 1]
2938
common_sites = findsites(ψ, ∑h[n])
3039
idx = length(∑h[n]) - 1 #list the sites Σh, we start at 2 because n is already taken into account
3140
for k in reverse(1:(range_∑h - 2))
3241
if n + k == common_sites[idx]
3342
Hᶜʰv = Hᶜʰv * ψ.AR[n + k] * ∑h[n][idx] * ψ′.AR[n + k]
3443
idx -= 1
3544
else
36-
Hᶜʰv = Hᶜʰv * ψ.AR[n + k] * δˢ(n + k) * ψ′.AR[n + k]
45+
# Hᶜʰv = Hᶜʰv * ψ.AR[n + k] * δˢ(n + k) * ψ′.AR[n + k]
46+
Hᶜʰv = replaceinds(Hᶜʰv * ψ.AR[n + k], s[n + k] => s[n + k]') * ψ′.AR[n + k]
3747
end
3848
end
39-
Hᶜʰv = v * ψ.AL[n] * δˡ(n - 1) * ∑h[n][1] * ψ′.AL[n] * Hᶜʰv #left extremity
49+
# Hᶜʰv = v * ψ.AL[n] * δˡ(n - 1) * ∑h[n][1] * ψ′.AL[n] * Hᶜʰv #left extremity
50+
Hᶜʰv = replaceinds(v * ψ.AL[n], l[n - 1] => l[n - 1]') * ∑h[n][1] * ψ′.AL[n] * Hᶜʰv #left extremity
4051
#Now we are building contributions of the form AL[n - j] ... AL[n] - v - AR[n + 1] ... AR[n + range_∑h - 1 - j]
4152
for j in 1:(range_∑h - 2)
42-
temp_Hᶜʰv = ψ.AL[n - j] * δˡ(n - 1 - j) * ∑h[n - j][1] * ψ′.AL[n - j]
53+
# temp_Hᶜʰv = ψ.AL[n - j] * δˡ(n - 1 - j) * ∑h[n - j][1] * ψ′.AL[n - j]
54+
temp_Hᶜʰv =
55+
replaceinds.AL[n - j], l[n - 1 - j] => l[n - 1 - j]') * ∑h[n - j][1] * ψ′.AL[n - j]
4356
common_sites = findsites(ψ, ∑h[n - j])
4457
idx = 2
4558
for k in 1:j
4659
if n - j + k == common_sites[idx]
4760
temp_Hᶜʰv = temp_Hᶜʰv * ψ.AL[n - j + k] * ∑h[n - j][idx] * ψ′.AL[n - j + k]
4861
idx += 1
4962
else
50-
temp_Hᶜʰv = temp_Hᶜʰv * ψ.AL[n - j + k] * δˢ(n - j + k) * ψ′.AL[n - j + k]
63+
# temp_Hᶜʰv = temp_Hᶜʰv * ψ.AL[n - j + k] * δˢ(n - j + k) * ψ′.AL[n - j + k]
64+
temp_Hᶜʰv =
65+
replaceinds(temp_Hᶜʰv * ψ.AL[n - j + k], s[n - j + k] => s[n - j + k]') *
66+
ψ′.AL[n - j + k]
5167
end
5268
end
5369
# Finished the AL part
54-
temp_Hᶜʰv = temp_Hᶜʰv * v
55-
for k in (j + 1):(range_∑h - 2)
70+
# temp_Hᶜʰv_r =
71+
# ψ.AR[n - j + range_∑h - 1] *
72+
# δʳ(n - j + range_∑h - 1) *
73+
# ∑h[n - j][end] *
74+
# ψ′.AR[n - j + range_∑h - 1]
75+
temp_Hᶜʰv_r =
76+
replaceinds(
77+
ψ.AR[n - j + range_∑h - 1], r[n - j + range_∑h - 1] => r[n - j + range_∑h - 1]'
78+
) *
79+
∑h[n - j][end] *
80+
ψ′.AR[n - j + range_∑h - 1]
81+
idx = length(∑h[n]) - 1
82+
for k in reverse((j + 1):(range_∑h - 2))
5683
if n - j + k == common_sites[idx]
57-
temp_Hᶜʰv = temp_Hᶜʰv * ψ.AR[n - j + k] * ∑h[n - j][idx] * ψ′.AR[n - j + k]
58-
idx += 1
84+
temp_Hᶜʰv_r = temp_Hᶜʰv_r * ψ.AR[n - j + k] * ∑h[n - j][idx] * ψ′.AR[n - j + k]
85+
idx -= 1
5986
else
60-
temp_Hᶜʰv = temp_Hᶜʰv * ψ.AR[n - j + k] * δˢ(n - j + k) * ψ′.AR[n - j + k]
87+
# temp_Hᶜʰv_r = temp_Hᶜʰv_r * ψ.AR[n - j + k] * δˢ(n - j + k) * ψ′.AR[n - j + k]
88+
temp_Hᶜʰv_r =
89+
replaceinds(temp_Hᶜʰv_r * ψ.AR[n - j + k], s[n - j + k] => s[n - j + k]') *
90+
ψ′.AR[n - j + k]
6191
end
6292
end
63-
temp_Hᶜʰv =
64-
temp_Hᶜʰv *
65-
ψ.AR[n - j + range_∑h - 1] *
66-
δʳ(n - j + range_∑h - 1) *
67-
∑h[n - j][end] *
68-
ψ′.AR[n - j + range_∑h - 1]
93+
temp_Hᶜʰv = temp_Hᶜʰv * v * temp_Hᶜʰv_r
6994
Hᶜʰv = Hᶜʰv + temp_Hᶜʰv
7095
end
7196
Hᶜv = Hᶜᴸv + Hᶜʰv + Hᶜᴿv
72-
return Hᶜv * dag(δˡ(n)) * dag(δʳ(n))
97+
# return Hᶜv * dag(δˡ(n)) * dag(δʳ(n))
98+
return replaceinds(Hᶜv, (l[n], r[n]) => (l[n]', r[n]'))
7399
end
74100

75101
function Base.:*(H::Hᴬᶜ{MPO}, v::ITensor)
@@ -88,71 +114,101 @@ function Base.:*(H::Hᴬᶜ{MPO}, v::ITensor)
88114
s = siteinds(only, ψ)
89115
s′ = siteinds(only, ψ′)
90116

91-
δˢ(n) = δ(dag(s[n]), prime(s[n]))
92-
δʳ(n) = δ(dag(r[n]), prime(r[n]))
93-
δˡ(n) = δ(l[n], l′[n])
117+
# Remove temporarily in favor of `replaceinds`,
118+
# which is more efficient.
119+
# δˢ(n) = δ(dag(s[n]), prime(s[n]))
120+
# δʳ(n) = δ(dag(r[n]), prime(r[n]))
121+
# δˡ(n) = δ(l[n], l′[n])
94122

95123
#Contribution of the left environment
96-
Hᴬᶜᴸv = v * Hᴸ[n - 1] * δˢ(n) * δʳ(n)
124+
# Hᴬᶜᴸv = v * Hᴸ[n - 1] * δˢ(n) * δʳ(n)
125+
Hᴬᶜᴸv = replaceinds(v * Hᴸ[n - 1], (s[n], r[n]) => (s[n]', r[n]'))
97126
#Contribution of the right environment
98-
Hᴬᶜᴿv = v * δˡ(n - 1) * δˢ(n) * Hᴿ[n]
127+
# Hᴬᶜᴿv = v * δˡ(n - 1) * δˢ(n) * Hᴿ[n]
128+
Hᴬᶜᴿv = replaceinds(v, (l[n - 1], s[n]) => (l[n - 1]', s[n]')) * Hᴿ[n]
99129
#We now start building terms where AC overlap with the local Hamiltonian
100130
# We start with the tensor v - AR[n+1] ... AR[n + range_∑h - 1]
131+
# Hᴬᶜʰv =
132+
# δʳ(n + range_∑h - 1) * ψ.AR[n + range_∑h - 1] * ∑h[n][end] * ψ′.AR[n + range_∑h - 1] #rightmost extremity
101133
Hᴬᶜʰv =
102-
δʳ(n + range_∑h - 1) * ψ.AR[n + range_∑h - 1] * ∑h[n][end] * ψ′.AR[n + range_∑h - 1] #rightmost extremity
134+
replaceinds.AR[n + range_∑h - 1], r[n + range_∑h - 1] => r[n + range_∑h - 1]') *
135+
∑h[n][end] *
136+
ψ′.AR[n + range_∑h - 1] #rightmost extremity
103137
common_sites = findsites(ψ, ∑h[n])
104138
idx = length(∑h[n]) - 1 #list the sites Σh, we start at 2 because n is already taken into account
105139
for k in reverse(1:(range_∑h - 2))
106140
if n + k == common_sites[idx]
107141
Hᴬᶜʰv = Hᴬᶜʰv * ψ.AR[n + k] * ∑h[n][idx] * ψ′.AR[n + k]
108142
idx -= 1
109143
else
110-
Hᴬᶜʰv = Hᴬᶜʰv * ψ.AR[n + k] * δˢ(n + k) * ψ′.AR[n + k]
144+
# Hᴬᶜʰv = Hᴬᶜʰv * ψ.AR[n + k] * δˢ(n + k) * ψ′.AR[n + k]
145+
Hᴬᶜʰv = replaceinds(Hᴬᶜʰv * ψ.AR[n + k], s[n + k] => s[n + k]') * ψ′.AR[n + k]
111146
end
112147
end
113-
Hᴬᶜʰv = v * Hᴬᶜʰv * ∑h[n][1] * δˡ(n - 1)
148+
# Hᴬᶜʰv = v * Hᴬᶜʰv * ∑h[n][1] * δˡ(n - 1)
149+
Hᴬᶜʰv = replaceinds(v * Hᴬᶜʰv * ∑h[n][1], l[n - 1] => l[n - 1]')
114150
#Now we are building contributions of the form AL[n - j] ... AL[n-1] - v - AR[n + 1] ... AR[n + range_∑h - 1 - j]
115151
for j in 1:(range_∑h - 1)
116-
temp_Hᴬᶜʰv = ψ.AL[n - j] * δˡ(n - j - 1) * ∑h[n - j][1] * ψ′.AL[n - j]
152+
# temp_Hᴬᶜʰv = ψ.AL[n - j] * δˡ(n - j - 1) * ∑h[n - j][1] * ψ′.AL[n - j]
153+
temp_Hᴬᶜʰv =
154+
replaceinds.AL[n - j], l[n - j - 1] => l[n - j - 1]') * ∑h[n - j][1] * ψ′.AL[n - j]
117155
common_sites = findsites(ψ, ∑h[n - j])
118156
idx = 2
119157
for k in 1:(j - 1)
120158
if n - j + k == common_sites[idx]
121159
temp_Hᴬᶜʰv = temp_Hᴬᶜʰv * ψ.AL[n - j + k] * ∑h[n - j][idx] * ψ′.AL[n - j + k]
122160
idx += 1
123161
else
124-
temp_Hᴬᶜʰv = temp_Hᴬᶜʰv * ψ.AL[n - j + k] * δˢ(n - j + k) * ψ′.AL[n - j + k]
162+
# temp_Hᴬᶜʰv = temp_Hᴬᶜʰv * ψ.AL[n - j + k] * δˢ(n - j + k) * ψ′.AL[n - j + k]
163+
temp_Hᴬᶜʰv =
164+
replaceinds(temp_Hᴬᶜʰv * ψ.AL[n - j + k], s[n - j + k] => s[n - j + k]') *
165+
ψ′.AL[n - j + k]
125166
end
126167
end
127168
#Finished with AL, treating the center AC = v
128169
if j == range_∑h - 1
129-
temp_Hᴬᶜʰv = temp_Hᴬᶜʰv * v * ∑h[n - j][end] * δʳ(n - j + range_∑h - 1)
170+
# temp_Hᴬᶜʰv = temp_Hᴬᶜʰv * v * ∑h[n - j][end] * δʳ(n - j + range_∑h - 1)
171+
temp_Hᴬᶜʰv = replaceinds(
172+
temp_Hᴬᶜʰv * v * ∑h[n - j][end], r[n - j + range_∑h - 1] => r[n - j + range_∑h - 1]'
173+
)
130174
else
131-
if n == common_sites[idx] #need to check whether we need to branch v
132-
temp_Hᴬᶜʰv = temp_Hᴬᶜʰv * v * ∑h[n - j][idx]
133-
idx += 1
134-
else
135-
temp_Hᴬᶜʰv = temp_Hᴬᶜʰv * v * δˢ(n)
136-
end
137-
for k in (j + 1):(range_∑h - 2)
175+
# temp_Hᴬᶜʰv_r =
176+
# ψ.AR[n + range_∑h - 1 - j] *
177+
# δʳ(n - j + range_∑h - 1) *
178+
# ∑h[n - j][end] *
179+
# ψ′.AR[n + range_∑h - 1 - j]
180+
temp_Hᴬᶜʰv_r =
181+
replaceinds(
182+
ψ.AR[n + range_∑h - 1 - j], r[n - j + range_∑h - 1] => r[n - j + range_∑h - 1]'
183+
) *
184+
∑h[n - j][end] *
185+
ψ′.AR[n + range_∑h - 1 - j]
186+
187+
idx = length(∑h[n]) - 1
188+
for k in reverse((j + 1):(range_∑h - 2))
138189
if n + k - j == common_sites[idx]
139-
temp_Hᴬᶜʰv = temp_Hᴬᶜʰv * ψ.AR[n + k - j] * ∑h[n - j][idx] * ψ′.AR[n + k - j]
140-
idx += 1
190+
temp_Hᴬᶜʰv_r = temp_Hᴬᶜʰv_r * ψ.AR[n + k - j] * ∑h[n - j][idx] * ψ′.AR[n + k - j]
191+
idx -= 1
141192
else
142-
temp_Hᴬᶜʰv = temp_Hᴬᶜʰv * ψ.AR[n + k - j] * δˢ(n + k - j) * ψ′.AR[n + k - j]
193+
# temp_Hᴬᶜʰv_r = temp_Hᴬᶜʰv_r * ψ.AR[n + k - j] * δˢ(n + k - j) * ψ′.AR[n + k - j]
194+
temp_Hᴬᶜʰv_r =
195+
replaceinds(temp_Hᴬᶜʰv_r * ψ.AR[n + k - j], s[n + k - j] => s[n + k - j]') *
196+
ψ′.AR[n + k - j]
143197
end
144198
end
145-
temp_Hᴬᶜʰv =
146-
temp_Hᴬᶜʰv *
147-
ψ.AR[n + range_∑h - 1 - j] *
148-
δʳ(n - j + range_∑h - 1) *
149-
∑h[n - j][end] *
150-
ψ′.AR[n + range_∑h - 1 - j]
199+
200+
if n == common_sites[idx] #need to check whether we need to branch v
201+
temp_Hᴬᶜʰv = temp_Hᴬᶜʰv * v * ∑h[n - j][idx] * temp_Hᴬᶜʰv_r
202+
else
203+
# temp_Hᴬᶜʰv = temp_Hᴬᶜʰv * v * δˢ(n) * temp_Hᴬᶜʰv_r
204+
temp_Hᴬᶜʰv = replaceinds(temp_Hᴬᶜʰv * v * temp_Hᴬᶜʰv_r, s[n] => s[n]')
205+
end
151206
end
152207
Hᴬᶜʰv = Hᴬᶜʰv + temp_Hᴬᶜʰv
153208
end
154209
Hᴬᶜv = Hᴬᶜᴸv + Hᴬᶜʰv + Hᴬᶜᴿv
155-
return Hᴬᶜv * dag(δˡ(n - 1)) * dag(δˢ(n)) * dag(δʳ(n))
210+
# return Hᴬᶜv * dag(δˡ(n - 1)) * dag(δˢ(n)) * dag(δʳ(n))
211+
return replaceinds(Hᴬᶜv, (l[n - 1], s[n], r[n]) => (l[n - 1]', s[n]', r[n]'))
156212
end
157213

158214
function left_environment(∑h::InfiniteSum{MPO}, ψ::InfiniteCanonicalMPS; tol=1e-15)

0 commit comments

Comments
 (0)