@@ -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]' ))
7399end
74100
75101function 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]' ))
156212end
157213
158214function left_environment (∑h:: InfiniteSum{MPO} , ψ:: InfiniteCanonicalMPS ; tol= 1e-15 )
0 commit comments