@@ -21,7 +21,7 @@ $(TYPEDFIELDS)
2121 verbosity:: Int = VERBOSE_WARN
2222
2323 " algorithm used for orthogonalization of the tensors"
24- alg_orth = QRpos ( )
24+ alg_orth = LAPACK_HouseholderQR (; positive = true )
2525 " algorithm used for the eigensolver"
2626 alg_eigsolve = _GAUGE_ALG_EIGSOLVE
2727 " minimal amount of iterations before using the eigensolver steps"
@@ -46,7 +46,7 @@ $(TYPEDFIELDS)
4646 verbosity:: Int = VERBOSE_WARN
4747
4848 " algorithm used for orthogonalization of the tensors"
49- alg_orth = LQpos ( )
49+ alg_orth = LAPACK_HouseholderLQ (; positive = true )
5050 " algorithm used for the eigensolver"
5151 alg_eigsolve = _GAUGE_ALG_EIGSOLVE
5252 " minimal amount of iterations before using the eigensolver steps"
7373
7474function MixedCanonical (;
7575 tol:: Real = Defaults. tolgauge, maxiter:: Int = Defaults. maxiter,
76- verbosity:: Int = VERBOSE_WARN, alg_orth = QRpos ( ),
76+ verbosity:: Int = VERBOSE_WARN, alg_orth = LAPACK_HouseholderQR (; positive = true ),
7777 alg_eigsolve = _GAUGE_ALG_EIGSOLVE,
7878 eig_miniter:: Int = 10 , order:: Symbol = :LR
7979 )
80- if alg_orth isa QR || alg_orth isa QRpos
80+ if alg_orth isa LAPACK_HouseholderQR
8181 alg_leftorth = alg_orth
82- alg_rightorth = alg_orth'
83- elseif alg_orth isa LQ || alg_orth isa LQpos
84- alg_leftorth = alg_orth'
82+ alg_rightorth = LAPACK_HouseholderLQ (; alg_orth. kwargs ... )
83+ elseif alg_orth isa LAPACK_HouseholderLQ
84+ alg_leftorth = LAPACK_HouseholderQR (; alg_orth. kwargs ... )
8585 alg_rightorth = alg_orth
8686 else
87- throw ( ArgumentError ( " Invalid orthogonalization algorithm: $( typeof ( alg_orth)) " ))
87+ alg_leftorth = alg_rightorth = alg_orth
8888 end
8989
9090 left = LeftCanonical (;
@@ -145,45 +145,54 @@ function gaugefix!(ψ::InfiniteMPS, A, C₀, alg::RightCanonical)
145145end
146146
147147@doc """
148- regauge!(AC::GenericMPSTensor, C::MPSBondTensor; alg=QRpos() ) -> AL
149- regauge!(CL::MPSBondTensor, AC::GenericMPSTensor; alg=LQpos() ) -> AR
148+ regauge!(AC::GenericMPSTensor, C::MPSBondTensor; alg) -> AL
149+ regauge!(CL::MPSBondTensor, AC::GenericMPSTensor; alg) -> AR
150150
151151Bring updated `AC` and `C` tensors back into a consistent set of left or right canonical
152- tensors. This minimizes `∥AC_i - AL_i * C_i∥` or `∥AC_i - C_{i-1} * AR_i∥`. The optimal algorithm uses
153- `Polar()` decompositions, but `QR`-based algorithms are typically more performant.
152+ tensors. This minimizes `∥AC_i - AL_i * C_i∥` or `∥AC_i - C_{i-1} * AR_i∥`.
153+
154+ The `alg` is passed on to [`left_orth!`](@extref MatrixAlgebraKit) and
155+ [`right_orth!`](@extref MatrixAlgebraKit), and can be used to control the kind of
156+ factorization used. By default, this is set to a (positive) QR/LQ, even though the
157+ optimal algorithm would use a polar decompositions instead, sacrificing a bit of
158+ performance for accuracy.
154159
155160!!! note
156161 Computing `AL` is slightly faster than `AR`, as it avoids an intermediate transposition.
157162"""
158163regauge!
159164
160- function regauge! (AC:: GenericMPSTensor , C:: MPSBondTensor ; alg = QRpos ())
161- Q_AC, _ = leftorth! (AC; alg)
162- Q_C, _ = leftorth! (C; alg)
165+ function regauge! (
166+ AC:: GenericMPSTensor , C:: MPSBondTensor ; alg = Defaults. alg_qr ()
167+ )
168+ Q_AC, _ = _left_orth! (AC; alg)
169+ Q_C, _ = _left_orth! (C; alg)
163170 return mul! (AC, Q_AC, Q_C' )
164171end
165- function regauge! (AC:: Vector{<:GenericMPSTensor} , C:: Vector{<:MPSBondTensor} ; alg = QRpos () )
172+ function regauge! (AC:: Vector{<:GenericMPSTensor} , C:: Vector{<:MPSBondTensor} ; kwargs ... )
166173 for i in 1 : length (AC)
167- regauge! (AC[i], C[i]; alg )
174+ regauge! (AC[i], C[i]; kwargs ... )
168175 end
169176 return AC
170177end
171- function regauge! (CL:: MPSBondTensor , AC:: GenericMPSTensor ; alg = LQpos ())
178+ function regauge! (
179+ CL:: MPSBondTensor , AC:: GenericMPSTensor ; alg = Defaults. alg_lq ()
180+ )
172181 AC_tail = _transpose_tail (AC)
173- _, Q_AC = rightorth ! (AC_tail; alg)
174- _, Q_C = rightorth ! (CL; alg)
182+ _, Q_AC = _right_orth ! (AC_tail; alg)
183+ _, Q_C = _right_orth ! (CL; alg)
175184 AR_tail = mul! (AC_tail, Q_C' , Q_AC)
176185 return repartition! (AC, AR_tail)
177186end
178- function regauge! (CL:: Vector{<:MPSBondTensor} , AC:: Vector{<:GenericMPSTensor} ; alg = LQpos () )
187+ function regauge! (CL:: Vector{<:MPSBondTensor} , AC:: Vector{<:GenericMPSTensor} ; kwargs ... )
179188 for i in length (CL): - 1 : 1
180- regauge! (CL[i], AC[i]; alg )
189+ regauge! (CL[i], AC[i]; kwargs ... )
181190 end
182191 return CL
183192end
184193# fix ambiguity + error
185- regauge! (:: MPSBondTensor , :: MPSBondTensor ; alg = QRpos () ) = error (" method ambiguity" )
186- function regauge! (:: Vector{<:MPSBondTensor} , :: Vector{<:MPSBondTensor} ; alg = QRpos () )
194+ regauge! (:: MPSBondTensor , :: MPSBondTensor ; kwargs ... ) = error (" method ambiguity" )
195+ function regauge! (:: Vector{<:MPSBondTensor} , :: Vector{<:MPSBondTensor} ; kwargs ... )
187196 return error (" method ambiguity" )
188197end
189198
@@ -232,17 +241,18 @@ function gauge_eigsolve_step!(it::IterativeSolver{LeftCanonical}, state)
232241 if iter ≥ it. eig_miniter
233242 alg_eigsolve = updatetol (it. alg_eigsolve, 1 , ϵ^ 2 )
234243 _, vec = fixedpoint (flip (TransferMatrix (A, AL)), C[end ], :LM , alg_eigsolve)
235- _, C[end ] = leftorth ! (vec; alg = it. alg_orth)
244+ _, C[end ] = _left_orth ! (vec; alg = it. alg_orth)
236245 end
237246 return C[end ]
238247end
239248
240249function gauge_orth_step! (it:: IterativeSolver{LeftCanonical} , state)
241250 (; AL, C, A_tail, CA_tail) = state
242251 for i in 1 : length (AL)
252+ # repartition!(A_tail[i], AL[i])
243253 mul! (CA_tail[i], C[i - 1 ], A_tail[i])
244254 repartition! (AL[i], CA_tail[i])
245- AL[i], C[i] = leftorth ! (AL[i]; alg = it. alg_orth)
255+ AL[i], C[i] = _left_orth ! (AL[i]; alg = it. alg_orth)
246256 end
247257 normalize! (C[end ])
248258 return C[end ]
@@ -289,7 +299,7 @@ function gauge_eigsolve_step!(it::IterativeSolver{RightCanonical}, state)
289299 if iter ≥ it. eig_miniter
290300 alg_eigsolve = updatetol (it. alg_eigsolve, 1 , ϵ^ 2 )
291301 _, vec = fixedpoint (TransferMatrix (A, AR), C[end ], :LM , alg_eigsolve)
292- C[end ], _ = rightorth ! (vec; alg = it. alg_orth)
302+ C[end ], _ = _right_orth ! (vec; alg = it. alg_orth)
293303 end
294304 return C[end ]
295305end
@@ -299,7 +309,7 @@ function gauge_orth_step!(it::IterativeSolver{RightCanonical}, state)
299309 for i in length (AR): - 1 : 1
300310 AC = mul! (AR[i], A[i], C[i]) # use AR as temporary storage for A * C
301311 tmp = repartition! (AC_tail[i], AC)
302- C[i - 1 ], tmp = rightorth ! (tmp; alg = it. alg_orth)
312+ C[i - 1 ], tmp = _right_orth ! (tmp; alg = it. alg_orth)
303313 repartition! (AR[i], tmp) # TODO : avoid doing this every iteration
304314 end
305315 normalize! (C[end ])
0 commit comments