Example #1
0
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
Example #2
0
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
Example #3
0
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
Example #4
0
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
Example #5
0
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
Example #6
0
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
Example #8
0
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
Example #9
0
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]]
Example #10
0
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()
Example #11
0
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()