Eigenvalues of Transfer Operator in iDMRG

Hi Miles,

I am trying to look at dynamical quantum phase transitions (DQPTs) in a particular model by numerically finding Fisher zero lines @@z \in \mathcal{C} @@ such that @@\langle \psi (0) | \psi (z) \rangle = 0@@, where @@ | \psi (z) \rangle := e^{zH} | \psi (0) \rangle@@.

I would like to work directly in the thermodynamic limit using iDMRG code based on this example, and identify Fisher zeros based on crossings in the eigenspectrum of the Transfer Matrix. How would I compute the transfer matrix of two MPS and obtain its eigenvalues, similarly to what is done in TenPy?

Also, are there any subtleties I need to be aware of when performing real and imaginary time evolution of iMPS in ITensor, or can I use the same functionality as for generic MPS?

Thanks so much for your help!

commented by (70.1k points)
Thanks for your patience since we haven't answered your question yet. I'm going to try to work up an example code to show you how to do this, since I think we have all the components needed in ITensor. Hope to get back to you soon! - Miles
commented by (70.1k points)
Sorry for the continued delay answering your question. I'd still like to post a sample code for you to use for this, but I thought in the meantime I can give you a shorter answer about how to get these eigenvectors.

The high-level answer is that we have a function arnoldi in ITensor (C++ version 3) whose interface you can view in the file itensor/iterativesolvers.h on line 946. It takes two arguments: a generic type (which can be any type) which models a matrix (more on this in a second) and an ITensor "v" which is the initial guess for the eigenvector. The matrix object "A" can be anything, and just has to implement the A.size(); and A.product(v); methods. So for your case, A would be an object holding the MPS tensors which form the MPS transfer matrix, A.size() would give the linear dimension of this transfer matrix, and A.product(v) carries out the multiplication of v times the transfer matrix (which you can do with chi^3 scaling, where chi is the MPS bond dimension).

You can control the arnoldi routine by passing the named arguments MaxIter (integer) and ErrGoal (real number).

For performing time evolution of iMPS, there aren't any particular subtleties I'd point out. It really depends on which algorithm you are trying to do. Our MPS class isn't intentionally set up for infinite calculations, but it's perfectly fine for this purpose. I've used it a lot in the past for infinite methods. Over the next year, and primarily in the Julia version, we are planning to add more functions and algorithms more specifically tailored toward infinite MPS.

Best,
Miles
commented by (230 points)
Hi Miles,

Thank you for your updates! Very helpful to know, and would indeed really appreciate a sample code like the one you mention above. In the meantime, I will read up on the 'arnoldi' function and will do my best to make headway on this problem.

Best,
Jacob