Infinite MPS TEBD in Julia

Hi! Previously I asked about apply function in Julia. I have succesfully implemented a finite MPS TEBD time evolution. Now I am moving to the infinite case. I just found that there is a package currently under developed called ITensorInfiniteMPS.jl by ITensor developers. I am trying to understand how it works, and how to perform Trotter-like gate evolution using it. May I ask what c means in the MPS index?

InfiniteMPS

Also, I understand that to perform time evolution with infinite MPS, one essentially evolves the unit cell. We are using an OBC MPS which contains one unit cell to do such a task. One needs to deal with the sites at the boundary, i.e. site=n, and site=n+1 which goes back to site=1, assuming the unit cell contains n sites. To write such a function 'apply', we just include an additional term h[n,1] into the gates, is that correct?

Thank you!

Best regards,
Tianqi

selected

Hello Tianqi,

Good questions, the ITensorInfiniteMPS.jl package is more of a pre-release as we round out the features and finalize the interface, so it is not well documented right now but should be usable (the VUMPS code is already being used in a few research projects).

The tags "c=0", "c=1", etc. indicate which unit cell the MPS Index or tensor is in. If you have have a 3-site unit cell, the first tensor in the first unit is psi[1] and the first tensor of the second unit cell is psi[4], with the relationship that psi[4] = translatecell(psi[1], 1) (i.e. psi[1] shifted by one unit cell, which shifts the tags from "c=1" to "c=2"). It only ever actually stores the tensors of the first unit cell. If you set a new tensor outside of the first unit cell like psi[4] = T, it maps it to the first unit cell and overwrites the tensor of the first unit cell.

It wouldn't be too hard to implement iTEBD with the current code. As you say, you should only need to evolve with gates in the first unit cell, and when you update the tensors of the InfiniteMPS in the first unit cell it implicitly updates tensors in the rest of the unit cells. Of course, you will have to follow the details of Fig. 3 in https://arxiv.org/pdf/cond-mat/0605597.pdf to properly update the tensors of the state.

Alternatively, we already have a TDVP implementation in ITensorInfiniteMPS.jl which is an alternative time evolution method that in general has been found to work better for more complicated models. You just use the tdvp function instead of vumps, and specify a time step with the keyword argument time_step. You can see it tested here: https://github.com/ITensor/ITensorInfiniteMPS.jl/blob/main/test/test_vumps.jl

Please try the TDVP code and let us know if it works for your use case. If you write the iTEBD code, please consider contributing it to the ITensorInfiniteMPS.jl package, since it would also be nice to have.

Cheers,
Matt

commented by (290 points)
Hi Matt,

Thanks so much for the detailed explanation! Now I get a better understanding of infiniteMPS. Let me first try the TDVP method you mentioned, and figure out how to implement iTEBD within the framework of ITensors. I will contribute to it if I successfully implement and benchmark iTEBD.

Best regards,
Tianqi