Transfer matrix is incorrect without imposing canonical form
Posted: 12 Apr 2024, 08:35
Hi all,
I am trying to implement the transfer matrix by myself and try it on the example of the Heisenberg model using infinite DMRG with `L=2`. (The reason why I need my own implementation is because `TransferMatrix.to_matrix()` is not implemented. Here is my simple implementation,
However, I found that if I comment out the line `psi.canonical_form()`, the transfer matrix is wrong and I cannot get the expected correlation length and correlation function. This confuses me because the correlation length should be independent of whether I choose the MPS canonical form or not. Is this a bug or something else? Thank you very much!
Best,
Yuhan
I am trying to implement the transfer matrix by myself and try it on the example of the Heisenberg model using infinite DMRG with `L=2`. (The reason why I need my own implementation is because `TransferMatrix.to_matrix()` is not implemented. Here is my simple implementation,
Code: Select all
def readOut(psi):
psi_arr = []
for i in range(0, psi.L):
psi_i = (psi.get_B(i, form=None)).drop_charge().to_ndarray()
psi_arr.append(psi_i)
return psi_arr
def transferMatrixEpl(psi1, psi2):
# input are two lists of numpy array
d = np.shape(psi1[0])[0]
T = np.zeros((d**2, d**2), dtype = np.complex128)
for i in range(len(psi1)):
T += np.kron(psi1[i], psi2[i].conj())
return T
def debug():
E, psi, M = example_DMRG_heisenberg_xxz_infinite(1.5)
psi.canonical_form() # this is essential!
psi_arr = readOut(psi)
psi_00 = psi_arr[0][:,0,:]
psi_01 = psi_arr[0][:,1,:]
psi_10 = psi_arr[1][:,0,:]
psi_11 = psi_arr[1][:,1,:]
psi_mtr = [psi_00 @ psi_10, psi_00 @ psi_11, psi_01 @ psi_10, psi_01 @ psi_11]
Tpsi = transferMatrixEpl(psi_mtr, psi_mtr)
return Tpsi
Best,
Yuhan