New to tensor networks and Julia. Is there any difference in the ITensor implementation of orthogonalize!() functions between the MPS and MPO, and if so what is it. A drawing or some code would be appreciated, thank you.
It is the same, the MPO version just treats the MPO like an MPS with two site indices per tensor.
Thank you for the response. However, is this treatment of an MPO as an MPS when orthogonalizing always a valid assumption?
It depends on what you mean by “valid”. It is a well defined operation mathematically, but depending on the MPO being gauged it may not be the most useful gauge for the subsequent operations you want to perform, and in the limit of increasing the size of the MPO may lead to numerical overflow/underflow, say if the MPO is built from a sum of local operators.
More nuanced gauges have been proposed for MPOs representing density matrices ([1707.01506] Quantum dynamics of thermalizing systems) and sums of local operators ([1909.06341] Local Matrix Product Operators: Canonical Form, Compression, & Control Theory). The latter gauge is experimentally supported in GitHub - JanReimers/ITensorMPOCompression.jl: Block respecting compression of MPOs and iMPOs and implicitly used in a modified form in our OpSum to MPO conversion code. We have plans to support it more systematically in ITensorNetworks.jl.
The main case I know of where this kind of orthogonalization can go poorly for MPOs is the one Matt highlighted, that of a sum of local operators. It is still formally correct if one does no truncation or truncates only singular values exactly equal to zero in that case. But in practice it can lose accuracy / become unstable on larger systems (N\sim100) for MPOs of that type.
There are other MPOs, though, where this type of orthogonalization can be very reliable, the main example being density matrices like finite-temperature states \rho \propto e^{-\beta H}.