The present algorithm to calculate the canonical form for infinite systems calculates the left and right dominant eigenvectors and takes the square root of each, which comes with a loss in precision.
It turns out that close to criticality and at large bond dimensions singular values eventually will become smaller than 1.e-8 which is about the domain where above mentioned precision loss becomes a problem and limits the effective bond dimension of the state.
Is there a method to circumvent this problem? Do you know an algorithm which is able to compute the canonical form with higher precision? I would be happy to implement it myself.
Canonical form for very small singular values
Re: Canonical form for very small singular values
One alternative is to iteratively do QR decompositions (and RQ decompositions).
You decompose your state as
\( M M M M M = Q R M M M M = Q Q R M M M = ... = Q Q Q Q R\)
and as
\( M M M M M = M M M M R' Q' = M M M R' Q' Q' = ... = R' Q' Q' Q' Q'\)
until your iterations converge.
Then your state is in the form
\( M M M M M M M M M M = Q Q Q Q Q R R' Q' Q' Q' Q' Q' \),
hence you can simply SVD \(RR'\) and should get the singular values. The \(Q, Q'\) should give you the state in left/right canonical form.
However, I should warn you that I'm not sure if this will help you: this method can become slow near criticality.
If you compare it with the diagonalization of the transfer matrix, it would be diagonalizing it with a power method (as opposed to Arnoldi/Lanczos, which is much faster).
Let me know if you actually implement it, even if you just want to try it out
You decompose your state as
\( M M M M M = Q R M M M M = Q Q R M M M = ... = Q Q Q Q R\)
and as
\( M M M M M = M M M M R' Q' = M M M R' Q' Q' = ... = R' Q' Q' Q' Q'\)
until your iterations converge.
Then your state is in the form
\( M M M M M M M M M M = Q Q Q Q Q R R' Q' Q' Q' Q' Q' \),
hence you can simply SVD \(RR'\) and should get the singular values. The \(Q, Q'\) should give you the state in left/right canonical form.
However, I should warn you that I'm not sure if this will help you: this method can become slow near criticality.
If you compare it with the diagonalization of the transfer matrix, it would be diagonalizing it with a power method (as opposed to Arnoldi/Lanczos, which is much faster).
Let me know if you actually implement it, even if you just want to try it out