Page 1 of 1

Infinite DMRG state prediction

Posted: 04 Dec 2018, 21:09
by jasonpillay
Hi Johannes,

I'm studying your tenpy/algorithms/dmrg.py code and I'd like to ask which part/lines of this code implements the state prediction method shown in chapters 10.2 and 10.3 of Shollwock's paper (Annals of Physics 326 (2011) 96–192)? Specifically, there should be some term at the end of each left and right sweep that substitutes the Schmidt value \lambda with
\lambda^[l+1]_guess = \lambda^[l]_R x [\lambda^[l-1]]^{-1} x \lambda^l_L
(Eq. 338 of the paper) for the subsequent iteration's guess wavefunction. Could you please tell me where this is done in this code? There is something resembling this in the code toycodes/d_dmrg.py at line 109 for a 2 site unit cell.

Also, could you please explain how one could generalize the code toycode/d_dmrg.py for larger/arbitrary unit cell sizes? Many thanks.

Regards,
Jason

Re: Infinite DMRG state prediction

Posted: 05 Dec 2018, 17:33
by Johannes
Hi Jason, Welcome to the forum :)

very good question! In TeNPy, this is a bit hidden.
Actually, the "state prediction" is in the line 103 of the toycode:

Code: Select all

theta0 = np.reshape(self.psi.get_theta2(i), [Heff.shape[0]])  # initial guess
This line gets the "initial guess" for the ground state of the two sites to be optimized.

In the toycode, for simplicity we save the MPS always in completely right-canonical form ('B'-form) on each site.
The diagonalization and subsequent SVD gives \(A_i, S_{i,i+1}, B_{i+1} = svd(\theta)\), and the line 109 (and 110) you referred to translates the left-canonical 'A'-form into rhe right-canonical 'B' (using \(B_i = S_{i-1,i}^{-1}A_i S_{i,i+1}\)). The MPS method get_theta() used in the state prediction then doesn't need to take inverses anymore, it simply contracts \(\theta = S_{i-1,i} B_i B_{i+1}\).

Storing the MPS completely in B form is numerically a little bit dangerous (since one multiplies with inverses of small numbers), but in this case it's actually fine and does not lead to problems.

In the "real" TeNPy code, the MPS can be (and will be during DMRG) in the "mixed" canonical form, where \(\psi = A_1 ... A_i S_{i,i+1} B_{i+1}... B_L\), i.e. the left sites are in 'A' form, and the right ones in 'B' form: MPS.set_B() has an argument saying whether the given tensor on that site is in left or right canonical form (this information is stored in the list MPS.form).
The other MPS methods are aware of this and for use the information accordingly, e.g. MPS.get_theta() will multiply with (inverses) of S on the left and right of the corresponding tensors to get the correct form.


For an infinite system, L is not the length of the total system, but the length of the MPS "unit cell".
If you have a model with a larger unit cell (e.g. because you have alternating strength on some bonds or because you consider a cylinder/ladder system),
you can simply choose the 'L' of the model and MPS accordingly larger.
For example, you can simply choose the 'L' in line 167 of the example_DMRG_infinite larger to artificially increase the size of the MPS unit cell.

Re: Infinite DMRG state prediction

Posted: 10 Dec 2018, 13:40
by mircomarahrens
Remark: A slightly different approach to this is discussed in https://arxiv.org/abs/1606.06790. The arrangement of the tensor network for the iDMRG is slightly different and instead of sweeping through system one chunks it and update "disconnected bonds" at one simulation step. This can be done in parallel easily. I guess it is a matter of taste which procedure one chooses. If you have question to the paper feel free to ask.