@@ -63,7 +63,7 @@ struct IDMRGState{S, O, E, T}
6363 operator:: O
6464 envs:: E
6565 iter:: Int
66- ϵ:: Float64
66+ ϵ:: Float64 # TODO : Could be any <:Real
6767 energy:: T
6868end
6969function IDMRGState {T} (mps:: S , operator:: O , envs:: E , iter:: Int , ϵ:: Float64 , energy) where {S, O, E, T}
@@ -76,7 +76,7 @@ function find_groundstate(mps, operator, alg::alg_type, envs = environments(mps,
7676 mps = copy (mps)
7777 iter = 0
7878 ϵ = calc_galerkin (mps, operator, mps, envs)
79- E = zero (Base . promote_type (scalartype (mps), scalartype (operator)))
79+ E = zero (TensorOperations . promote_contract (scalartype (mps), scalartype (operator)))
8080
8181 LoggingExtras. withlevel (; alg. verbosity) do
8282 @infov 2 begin
@@ -136,16 +136,21 @@ function Base.iterate(
136136 return (mps, envs, ϵ, ΔE), it. state
137137end
138138
139- function MPSKit . localupdate_step! (
140- it:: IterativeSolver{<:Union{ IDMRG, IDMRG2} } , state
139+ function localupdate_step! (
140+ it:: IterativeSolver{<:IDMRG} , state
141141 )
142142 alg_eigsolve = updatetol (it. alg_eigsolve, state. iter, state. ϵ)
143- mps, envs, C_old, E = _localupdate_sweep_idmrg! (state. mps, state. operator, state. envs, alg_eigsolve, it. alg)
143+ return _localupdate_sweep_idmrg! (state. mps, state. operator, state. envs, alg_eigsolve)
144+ end
144145
145- return mps, envs, C_old, E
146+ function localupdate_step! (
147+ it:: IterativeSolver{<:IDMRG2} , state
148+ )
149+ alg_eigsolve = updatetol (it. alg_eigsolve, state. iter, state. ϵ)
150+ return _localupdate_sweep_idmrg2! (state. mps, state. operator, state. envs, alg_eigsolve, it. trscheme, it. alg_svd)
146151end
147152
148- function _localupdate_sweep_idmrg! (ψ, H, envs, alg_eigsolve, :: IDMRG )
153+ function _localupdate_sweep_idmrg! (ψ, H, envs, alg_eigsolve)
149154 local E
150155 C_old = ψ. C[0 ]
151156 # left to right sweep
@@ -175,14 +180,14 @@ function _localupdate_sweep_idmrg!(ψ, H, envs, alg_eigsolve, ::IDMRG)
175180end
176181
177182
178- function _localupdate_sweep_idmrg ! (ψ, H, envs, alg_eigsolve, alg :: IDMRG2 )
183+ function _localupdate_sweep_idmrg2 ! (ψ, H, envs, alg_eigsolve, alg_trscheme, alg_svd )
179184 # sweep from left to right
180185 for pos in 1 : (length (ψ) - 1 )
181186 ac2 = AC2 (ψ, pos; kind = :ACAR )
182187 h_ac2 = AC2_hamiltonian (pos, ψ, H, ψ, envs)
183188 _, ac2′ = fixedpoint (h_ac2, ac2, :SR , alg_eigsolve)
184189
185- al, c, ar = svd_trunc! (ac2′; trunc = alg . trscheme , alg = alg . alg_svd)
190+ al, c, ar = svd_trunc! (ac2′; trunc = alg_trscheme , alg = alg_svd)
186191 normalize! (c)
187192
188193 ψ. AL[pos] = al
@@ -201,7 +206,7 @@ function _localupdate_sweep_idmrg!(ψ, H, envs, alg_eigsolve, alg::IDMRG2)
201206 h_ac2 = AC2_hamiltonian (0 , ψ, H, ψ, envs)
202207 _, ac2′ = fixedpoint (h_ac2, ac2, :SR , alg_eigsolve)
203208
204- al, c, ar = svd_trunc! (ac2′; trunc = alg . trscheme , alg = alg . alg_svd)
209+ al, c, ar = svd_trunc! (ac2′; trunc = alg_trscheme , alg = alg_svd)
205210 normalize! (c)
206211
207212 ψ. AL[end ] = al
@@ -224,7 +229,7 @@ function _localupdate_sweep_idmrg!(ψ, H, envs, alg_eigsolve, alg::IDMRG2)
224229 h_ac2 = AC2_hamiltonian (pos, ψ, H, ψ, envs)
225230 _, ac2′ = fixedpoint (h_ac2, ac2, :SR , alg_eigsolve)
226231
227- al, c, ar = svd_trunc! (ac2′; trunc = alg . trscheme , alg = alg . alg_svd)
232+ al, c, ar = svd_trunc! (ac2′; trunc = alg_trscheme , alg = alg_svd)
228233 normalize! (c)
229234
230235 ψ. AL[pos] = al
@@ -243,7 +248,7 @@ function _localupdate_sweep_idmrg!(ψ, H, envs, alg_eigsolve, alg::IDMRG2)
243248 ac2 = AC2 (ψ, 0 ; kind = :ACAR )
244249 h_ac2 = AC2_hamiltonian (0 , ψ, H, ψ, envs)
245250 E, ac2′ = fixedpoint (h_ac2, ac2, :SR , alg_eigsolve)
246- al, c, ar = svd_trunc! (ac2′; trunc = alg . trscheme , alg = alg . alg_svd)
251+ al, c, ar = svd_trunc! (ac2′; trunc = alg_trscheme , alg = alg_svd)
247252 normalize! (c)
248253
249254 ψ. AL[end ] = al
0 commit comments