def pauli4body(): ''' Tensors for 4-body Pauli strings. ''' bond_dim = 2 iden = matIden() sx = matSx() sy = matSy() sz = matSz() bdi = uni10.Bond(uni10.BD_IN, bond_dim) bdo = uni10.Bond(uni10.BD_OUT, bond_dim) pauli1b = [iden, sx, sy, sz] pauli4b = [] pauli2b = [] l2b = 16 for i in xrange(4): for j in xrange(4): mat = uni10.otimes(pauli1b[i], pauli1b[j]) pauli2b.append(mat) for i in xrange(l2b): for j in xrange(l2b): mat = uni10.otimes(pauli2b[i], pauli2b[j]) P = uni10.UniTensor([bdi, bdi, bdi, bdi, bdo, bdo, bdo, bdo]) P.putBlock(mat) pauli4b.append(P) return pauli4b
def pauli6body(): ''' Tensors for 6-body Pauli strings. ''' bond_dim = 2 iden = matIden() sx = matSx() sy = matSy() sz = matSz() bdi = uni10.Bond(uni10.BD_IN, bond_dim) bdo = uni10.Bond(uni10.BD_OUT, bond_dim) pauli1b = [iden, sx, sy, sz] pauli6b = [] bonds = [bdi] * 6 + [bdo] * 6 pauli3b = [] for i in xrange(4): for j in xrange(4): for k in xrange(4): mat = uni10.otimes(uni10.otimes(pauli1b[i], pauli1b[j]), pauli1b[k]) pauli3b.append(mat) l3b = 64 for i in xrange(l3b): for j in xrange(l3b): mat = uni10.otimes(pauli3b[i], pauli3b[j]) P = uni10.UniTensor(bonds) P.putBlock(mat) pauli6b.append(P) return pauli6b
def transverseIsing(h): spin = 0.5 sx = 0.5 * (matSp() + matSm()) sz = matSz() iden = uni10.Matrix(2, 2, [1, 0, 0, 1]) ham =uni10.otimes(2*sz,2*sz)*(-1) \ +0.25*float(h)*(uni10.otimes(iden,2*sx)+uni10.otimes(2*sx,iden)) dim = int(spin * 2 + 1) bdi = uni10.Bond(uni10.BD_IN, dim) bdo = uni10.Bond(uni10.BD_OUT, dim) H = uni10.UniTensor([bdi, bdi, bdo, bdo], "TFIM") H.putBlock(ham) return H
def Ham(h): spin = 0.5 sx = (matSp() + matSm()) sz = matSz() iden = uni10.Matrix(2, 2, [1, 0, 0, 1]) ham = uni10.otimes(sz, sz) * (-2.00) + (-0.500) * float(h) * ( uni10.otimes(iden, sx) + uni10.otimes(sx, iden)) dim = int(spin * 2 + 1) bdi = uni10.Bond(uni10.BD_IN, dim) bdo = uni10.Bond(uni10.BD_OUT, dim) H = uni10.UniTensor([bdi, bdi, bdo, bdo], "TFIM") H.putBlock(ham) return H
def transverseIsing(h): spin = 0.5 sx = matSx() sy = matSy() sz = matSz() iden = uni10.Matrix(2, 2, [1, 0, 0, 1]) ham = uni10.otimes(sz, sz) * (-1) + (-0.2500) * float(h) * ( uni10.otimes(iden, sx) + uni10.otimes(sx, iden)) dim = int(spin * 2 + 1) bdi = uni10.Bond(uni10.BD_IN, dim) bdo = uni10.Bond(uni10.BD_OUT, dim) H = uni10.UniTensor([bdi, bdi, bdo, bdo], "TFIM") H.putBlock(ham) return H
def Heisenberg(h): spin = 0.5 sx = matSx() sy = matSy() sz = matSz() iden = uni10.Matrix(2, 2, [1, 0, 0, 1]) ham = (float(h) * uni10.otimes(sz, sz) * (1.00 / 4.00) + (1.00 / 4.00) * uni10.otimes(sx, sx) + (-1.00 / 4.00) * uni10.otimes(sy, sy)) dim = int(spin * 2 + 1) bdi = uni10.Bond(uni10.BD_IN, dim) bdo = uni10.Bond(uni10.BD_OUT, dim) H = uni10.UniTensor([bdi, bdi, bdo, bdo], "Heisenberg") H.putBlock(ham) return H
def Heisenberg(D, Delta, h, J): iden = matId() sm = matSm() sp = matSp() sz = matSz() sz2 = matSz2() ham = float(J)*(0.5*(uni10.otimes(sm,sp)+uni10.otimes(sp,sm))+float(Delta)*uni10.otimes(sz,sz)) ham += 0.5*float(h)*(uni10.otimes(iden,sz)+uni10.otimes(sz,iden)) ham += 0.5*float(D)*(uni10.otimes(iden,sz2)+uni10.otimes(sz2,iden)) spin = 1.0 dim = int(spin * 2 + 1) bdi = uni10.Bond(uni10.BD_IN, dim); bdo = uni10.Bond(uni10.BD_OUT, dim); H = uni10.UniTensor([bdi, bdi, bdo, bdo], "Heisenberg") H.putBlock(ham) return H
def get_Hbond_tensor(model,bond_idx,L,J=1.0,Fieldz=1.0,hzlist=[],bond_dim=2,\ avebond=True): #TODO put Z terms only into the even bonds ''' _________________________________________________________________ Ising Model: | Heisenberg Model -J XX - h Z (h=Fieldz) | J(XX + ZZ - YY) + h Z (h=hzlist) ____________________________|____________________________________ Result in a tensor: _____ 0 __| |__ 2 1 __| H |__ 3 |_____| _________________________________________________________________ ''' # make matrix sx = utils.matSx() sy = utils.matSy() sz = utils.matSz() s0 = utils.matIden() if (model == 'Ising'): Hbond_mat = (-1.*J)*uni10.otimes(sx,sx) if avebond: if (bond_idx == 0): Hbond_mat += (-1.0*Fieldz)*uni10.otimes(sz,s0) Hbond_mat += (-0.5*Fieldz)*uni10.otimes(s0,sz) elif (bond_idx == L-2): Hbond_mat += (-0.5*Fieldz)*uni10.otimes(sz,s0) Hbond_mat += (-1.0*Fieldz)*uni10.otimes(s0,sz) else: Hbond_mat += (-0.5*Fieldz)*uni10.otimes(sz,s0) Hbond_mat += (-0.5*Fieldz)*uni10.otimes(s0,sz) else: if (bond_idx%2 == 0): Hbond_mat += (-1.0*Fieldz)*uni10.otimes(sz,s0) Hbond_mat += (-1.0*Fieldz)*uni10.otimes(s0,sz) elif (model == 'Heisenberg'): #TODO try evenly distributed bond Hbond_mat = (1.*J)*uni10.otimes(sx,sx) Hbond_mat += (-1.*J)*uni10.otimes(sy,sy) Hbond_mat += (1.*J)*uni10.otimes(sz,sz) if avebond: if (bond_idx == 0): Hbond_mat += (1. *hzlist[0])*uni10.otimes(sz,s0) Hbond_mat += (0.5*hzlist[1])*uni10.otimes(s0,sz) elif (bond_idx == L-2): Hbond_mat += (0.5*hzlist[L-2])*uni10.otimes(sz,s0) Hbond_mat += (1. *hzlist[L-1])*uni10.otimes(s0,sz) else: Hbond_mat += (0.5*hzlist[bond_idx])*uni10.otimes(sz,s0) Hbond_mat += (0.5*hzlist[bond_idx+1])*uni10.otimes(s0,sz) else: if (bond_idx%2 == 0): Hbond_mat += (1.*hzlist[bond_idx])*uni10.otimes(sz,s0) Hbond_mat += (1.*hzlist[bond_idx+1])*uni10.otimes(s0,sz) else: raise Exception("The model can only be Ising or Heisenberg!") # construct tensor bdi = uni10.Bond(uni10.BD_IN, bond_dim) bdo = uni10.Bond(uni10.BD_OUT, bond_dim) Hbond = uni10.UniTensor([bdi,bdi,bdo,bdo],'Hbond') Hbond.putBlock(Hbond_mat) Hbond.setLabel([0,1,2,3]) return Hbond
hl = -1.* np.kron(sx,sx)-0.5*np.kron(si,sz)-np.kron(sz,si) hr = -1.* np.kron(sx,sx)-np.kron(si,sz)-0.5*np.kron(sz,si) bdi = uni10.Bond(uni10.BD_IN,2) bdo = uni10.Bond(uni10.BD_OUT,2) u11 = np.einsum('ij,kl->ikjl',sx,sz) u12 = np.einsum('ij,kl->ikjl',si,sx) u13 = np.einsum('ij,kl->ikjl',sz,sz) u21 = np.einsum('ij,kl->ikjl',sz,sx) u22 = np.einsum('ij,kl->ikjl',sz,si) u23 = np.einsum('ij,kl->ikjl',sx,sx) U11 = uni10.UniTensor([bdi,bdi,bdo,bdo]) U11.putBlock(uni10.otimes(Sx,Sz)) U12 = uni10.UniTensor([bdi,bdi,bdo,bdo]) U12.putBlock(uni10.otimes(Si,Sx)) U13 = uni10.UniTensor([bdi,bdi,bdo,bdo]) U13.putBlock(uni10.otimes(Sz,Sz)) U21 = uni10.UniTensor([bdi,bdi,bdo,bdo]) U21.putBlock(uni10.otimes(Sz,Sx)) U22 = uni10.UniTensor([bdi,bdi,bdo,bdo]) U22.putBlock(uni10.otimes(Sz,Si)) U23 = uni10.UniTensor([bdi,bdi,bdo,bdo]) U23.putBlock(uni10.otimes(Sx,Sx)) Ulist = [[U11,U21],[U12,U22],[U13,U23]]
def test_Umpo(ind, dag=False): u11 = np.einsum('ij,kl->ikjl', sx, sz) u12 = np.einsum('ij,kl->ikjl', si, sx) u13 = np.einsum('ij,kl->ikjl', sz, sz) u21 = np.einsum('ij,kl->ikjl', sz, sx) u22 = np.einsum('ij,kl->ikjl', sz, si) u23 = np.einsum('ij,kl->ikjl', sx, sx) U11 = uni10.UniTensor([bdi, bdi, bdo, bdo]) U11.putBlock(uni10.otimes(Sx, Sz)) U12 = uni10.UniTensor([bdi, bdi, bdo, bdo]) U12.putBlock(uni10.otimes(Si, Sx)) U13 = uni10.UniTensor([bdi, bdi, bdo, bdo]) U13.putBlock(uni10.otimes(Sz, Sz)) U21 = uni10.UniTensor([bdi, bdi, bdo, bdo]) U21.putBlock(uni10.otimes(Sz, Sx)) U22 = uni10.UniTensor([bdi, bdi, bdo, bdo]) U22.putBlock(uni10.otimes(Sz, Si)) U23 = uni10.UniTensor([bdi, bdi, bdo, bdo]) U23.putBlock(uni10.otimes(Sx, Sx)) Ulist = [[U11, U21], [U12, U22], [U13, U23]] if ind == 0: print "Bond ID: Left Bond" U = get_unitary4bond_up(Ulist, L, 0) u = np.einsum('ijkl,lmnp->ijmknp', u11, u21).reshape(8, 8) if dag is False: print "Numpy result: " print u print "My result: " print U.getBlock() else: U.permute([5, 6, 7, 2, 3, 4], 3) U.setLabel([8, 9, 10, 0, 1, 4]) print u.T print U.getBlock() if ind == 1: print "Bond ID: Right Bond" U = get_unitary4bond_up(Ulist, L, L - 2) u = np.einsum('ijkl,mknp->mijnpl', u13, u22).reshape(8, 8) #print u13.reshape(4,4) #print u22.reshape(4,4) if dag is False: print "Numpy result: " print u print "My result: " print U.getBlock() print U else: U.permute([5, 6, 7, 4, 2, 3], 3) U.setLabel([8, 9, 10, 4, 0, 1]) print u.T print U.getBlock() if ind == 2: print "Bond ID: Odd Bond" U = get_unitary4bond_up(Ulist, L, 1) u = np.einsum('ijkl,lmnp,qrms -> ijqrknps', u11, u21, u12).reshape(16, 16) #print u11.reshape(4,4) #print u12.reshape(4,4) #print u21.reshape(4,4) if dag is False: print u print U.getBlock() else: U.permute([5, 6, 7, 8, 4, 2, 3, -4], 4) U.setLabel([9, 10, 11, 12, 4, 0, 1, -4]) print u.T print U.getBlock() if ind == 3: print "Bond ID: Even Bond" U = get_unitary4bond_up(Ulist, L, 2) u = np.einsum('ijkl,nkmp,lqrs -> nijqmprs', u12, u21, u22).reshape(16, 16) #print u12.reshape(4,4) #print u21.reshape(4,4) #print u22.reshape(4,4) if dag is False: print u print U.getBlock() else: U.permute([5, 6, 7, 8, 4, 2, 3, -4], 4) U.setLabel([9, 10, 11, 12, 4, 0, 1, -4]) print u.T print U.getBlock()
def test_UHU(ind): u11 = np.einsum('ij,kl->ikjl', sx, sz) u12 = np.einsum('ij,kl->ikjl', si, sx) u13 = np.einsum('ij,kl->ikjl', sz, sz) u21 = np.einsum('ij,kl->ikjl', sz, sx) u22 = np.einsum('ij,kl->ikjl', sz, si) u23 = np.einsum('ij,kl->ikjl', sx, sx) U11 = uni10.UniTensor([bdi, bdi, bdo, bdo]) U11.putBlock(uni10.otimes(Sx, Sz)) U12 = uni10.UniTensor([bdi, bdi, bdo, bdo]) U12.putBlock(uni10.otimes(Si, Sx)) U13 = uni10.UniTensor([bdi, bdi, bdo, bdo]) U13.putBlock(uni10.otimes(Sz, Sz)) U21 = uni10.UniTensor([bdi, bdi, bdo, bdo]) U21.putBlock(uni10.otimes(Sz, Sx)) U22 = uni10.UniTensor([bdi, bdi, bdo, bdo]) U22.putBlock(uni10.otimes(Sz, Si)) U23 = uni10.UniTensor([bdi, bdi, bdo, bdo]) U23.putBlock(uni10.otimes(Sx, Sx)) Ulist = [[U11, U21], [U12, U22], [U13, U23]] #Hm = get_Hbond_tensor(edge=False) #Hl = get_Hbond_tensor(edge=True, edgeside='L') #Hr = get_Hbond_tensor(edge=True, edgeside='R') hm = -1. * np.kron(sx, sx) - 0.5 * (np.kron(sz, si) + np.kron(si, sz)) hl = -1. * np.kron(sx, sx) - 0.5 * np.kron(si, sz) - np.kron(sz, si) hr = -1. * np.kron(sx, sx) - np.kron(si, sz) - 0.5 * np.kron(sz, si) UHU = contract_UHU(6, Ulist) #print UHU[0] if ind == 0: # LEFT EDGE u11_ = u11.reshape(4, 4) uhu1 = np.dot(u11_.T, np.dot(hl, u11_)) uhu1 = uhu1.reshape(2, 2, 2, 2) u21T = (u21.reshape(4, 4).T).reshape(2, 2, 2, 2) uhu = np.einsum('ijkl,mknp,plrs->mijnrs', u21T, uhu1, u21).reshape(8, 8) print uhu print UHU[0].getBlock() elif ind == 1: # Interior Odd Bonds hm_ = hm.reshape(2, 2, 2, 2) u11T = (u11.reshape(4, 4).T).reshape(2, 2, 2, 2) u12T = (u12.reshape(4, 4).T).reshape(2, 2, 2, 2) u21T = (u21.reshape(4, 4).T).reshape(2, 2, 2, 2) uhu1 = np.einsum('ijkl,mnpq,lprs,kruv,sqwx->ijmnuvwx', u11T, u12T, hm_, u11, u12) uhu = np.einsum('ijkl,mklnpqrs,qruv->mijnpuvs', u21T, uhu1, u21).reshape(16, 16) print uhu print UHU[1].getBlock() elif ind == 2: u12_ = u12.reshape(4, 4) uhu1 = np.dot(u12_.T, np.dot(hm, u12_)).reshape(2, 2, 2, 2) u21T = (u21.reshape(4, 4).T).reshape(2, 2, 2, 2) u22T = (u22.reshape(4, 4).T).reshape(2, 2, 2, 2) uhu = np.einsum('ijkl,mnpq,lpxy,kxrs,yquv->ijmnrsuv', u21T, u22T, uhu1, u21, u22).reshape(16, 16) print uhu print UHU[2].getBlock() else: u13_ = u13.reshape(4, 4) uhu1 = np.dot(u13_.T, np.dot(hr, u13_)).reshape(2, 2, 2, 2) u22T = (u22.reshape(4, 4).T).reshape(2, 2, 2, 2) uhu = np.einsum('ijkl,lmqn,kqrs->ijmrsn', u22T, uhu1, u22).reshape(8, 8) print uhu print UHU[-1].getBlock()