Supported algorithms for svd

Hi!

I am exploring the different algorithms implemented to do the SVDs in a dmrg calculation. Currently I could find the following in the documentation: “qr_iteration”, “recursive” and “divide_and_conquer”, are there more?
In particular, is there one for solving non-Hermitian hamiltonians?

From already thank you very much, greetings!

Hi Leandro,
Thanks for the question, however whether or not one is working with a non-Hermitian Hamiltonian is a separate question from what algorithm one uses to perform an SVD. As you know, the SVD can be computed for any real or complex matrix or tensor, and the different backends we offer only affect the speed and accuracy of the SVD computation, not which problems it can be applied to.

Is your question whether ITensor offers DMRG methods for working with non-Hermitian Hamiltonians? If so, I believe the answer is currently no, though it might be easy for us to add. I could ask Matt Fishman what he might know about the status of this and how much work he thinks it would take, but he is away this week so it would have to wait until next week.

Yes you’re right, sorry I misformed the question. The correct question was whether the current implementation of dmrg supports non-Hermitian Hamiltonians.

Thanks for the reply, it would be great if Matt knows the current state of this or if I could easily implement it.

Thanks again

Thanks for clarifying. It’s going to be hard for us to take this on totally ourselves right now, since we are pushing on some other parts of ITensor and related packages (specifically putting together a TDVP package right now). But if you’d be willing to help, one major thing would be

  1. making a short code that implements a non-Hermitian Hamiltonian as an MPO, just using the OpSum/AutoMPO system to make it
  2. specifying what result you expect the code to give

For a small enough system we ought to also be able to quickly throw together a simple exact diagonalization code to check the MPO-based code.

I’m cautiously optimistic that most of the pieces are already present in ITensor DMRG, but just need to be tried out on an example and tested. That being said, there could very well be some bugs for the non-Hermitian case that need to be corrected.

Hi Miles,

Exploring the core functions dmrg.jl and observer.jl and with your answer and this other discussion (non-Hermitian DMRG in Julia - ITensor Support Q&A), I could (maybe and only maybe) generalize for the case of non-hermitician hamiltonians. The steps were 1)put the argument ishermitian=false in the call of dmrg function and 2)promote the energy to be a complex in dmrg.jl and observer.jl.

Now I’m testing these changes using the next simple model ([0906.4070] A spin chain model with non-Hermitian interaction: The Ising quantum spin chain in an imaginary field)

H = -\frac{1}{2}\sum_{j=1}^{N} (\sigma_j^{x} + \lambda\sigma_j^{z}\sigma_{j+1}^{z} + i\kappa \sigma_j^z) \ \ \ \ \ \ \lambda ,\kappa \in \mathbb{R}

Doing an exact diagonalization the energy of the ground state is E_0^{exact}=(-1.7055 - 8.101\times 10^{-16} i) and with DMRG E_0^{dmrg}=(-1.705499 - 1.168\times 10^{-15} i)

For the moment I only check the ground state energy, I’m going to check other models and how the observers work with the changes. The codes that I use are in this repository, I don’t know if it is the most correct way to share this, but it is the first time that I am developing code and sharing it.

Cheers!

That sounds good and like the right changes. Also yes sharing the code in a GitHub is a good way to do it.

Your DMRG results look good in comparison to ED. If you can show that this change works for some other cases, like when varying \lambda and \kappa and ideally for one other Hamiltonian, then the next step would be to create a fork of ITensors.jl and then send us a pull request so we can merge your changes to dmrg.jl and observer.jl. Or if the changes are very small, you could just list what they are and we could make them.

Great!
I’m going to continue with my tests, and if everything goes well, generate the pull request.

1 Like