Exemplo n.º 1
0
def genPmpo(n, a, tau):
    # ai_a^+*aj_a + ai_b^+*aj_b # [ai]*[bj]*[ck]*[dl]=[abcd,ijkl]
    tijAA = reduce(numpy.kron, (cret, sgn, ann, idn))
    tijBB = reduce(numpy.kron, (idn, cret, sgn, ann))
    # -d^2/dx^2 [off-diagonal]
    tij = tijAA + tijBB
    tij = -0.5 * (tij + tij.T)
    e, v = scipy.linalg.eigh(tij)
    eij = numpy.einsum('ik,k,jk->ij', v, numpy.exp(-tau / a**2 * e), v)
    # (abcdijkl)->(abij,cdkl)
    eij = eij.reshape((2, 2, 2, 2, 2, 2, 2, 2))
    eij = eij.transpose(0, 1, 4, 5, 2, 3, 6, 7)
    eij = eij.reshape((16, 16))
    # not symmetric in bipartition
    u, s, vt = scipy.linalg.svd(eij)
    vl = u.reshape((4, 4, 16))
    vl = vl.transpose((2, 0, 1))
    vl = vl.reshape((1, 16, 4, 4))
    vr = numpy.einsum('k,kj->kj', s, vt)
    vr = vr.reshape((16, 1, 4, 4))
    # generate MPO
    prj_empo = genEvenOdd(n, 0, vl, vr)
    prj_ompo = genEvenOdd(n, 1, vl, vr)
    # apply t[diag]=exp(-tau/a^2*ni)
    tmp = numpy.identity(2)
    tmp[1, 1] = numpy.exp(-tau / a**2)
    tmp = tmp.reshape((1, 1, 2, 2))
    wfacs = [tmp] * (2 * n)
    prj_dmpo = mpo_class.class_mpo(2 * n, sites=wfacs)
    prj_dmpo = prj_dmpo.merge([[2 * i, 2 * i + 1] for i in range(n)])
    return prj_empo, prj_ompo, prj_dmpo
Exemplo n.º 2
0
def genEVmpo(n, a, ng=40):
    # Quadrature
    sfac = 1.0 / (1.0 + 0.5 * kappa**2 * a**2)
    xts, wts = numpy.polynomial.hermite.hermgauss(ng)
    wij = numpy.exp(sfac * numpy.einsum('i,j->ij', xts, xts))
    wij = numpy.einsum('i,ij,j->ij', numpy.sqrt(wts), wij, numpy.sqrt(wts))
    # Wij = V[i,k]e[k]V[j,k] = A[i,k]A[j,k] => BAD for large ng !!!
    eig, v = scipy.linalg.eigh(wij)
    print 'ng=', ng
    print eig
    eig[numpy.argwhere(eig < 0.0)] = 0.0
    wka = numpy.einsum('ik,k->ik', v, numpy.sqrt(eig))
    # OBC
    tij = numpy.diag([1.0] * n)
    for i in range(n - 1):
        tij[i, i + 1] = tij[i + 1, i] = -0.5 * sfac
    cfac = 2.0 * kappa
    nfac = numpy.power(cfac*numpy.sqrt(numpy.linalg.det(tij)),1.0/n)/ \
           numpy.sqrt(numpy.pi)
    # A,B,D
    A0 = nfac * numpy.einsum('k,ka->a', numpy.sqrt(wts), wka)
    B0 = nfac * numpy.einsum('k,ka->a',
                             numpy.sqrt(wts) * xts, wka) * numpy.sqrt(sfac * a)
    D0 = nfac * numpy.einsum('k,ka->a',
                             numpy.sqrt(wts) * xts * xts, wka) * (sfac * a)
    A1 = nfac * numpy.einsum('ka,kb->ab', wka, wka)
    B1 = nfac * numpy.einsum('k,ka,kb->ab', xts, wka, wka) * numpy.sqrt(
        sfac * a)
    D1 = nfac * numpy.einsum('k,ka,kb->ab', xts * xts, wka, wka) * (sfac * a)
    # Construction of MPOs
    idn = numpy.identity(4)
    nii = numpy.zeros((4, 4))
    nii[1, 1] = 1.0
    nii[2, 2] = 1.0
    nud = numpy.zeros((4, 4))
    nud[3, 3] = 1.0
    # first [A0,B0,D0]
    site0 = numpy.zeros((1, 3 * ng, 4, 4))
    site0[0, :ng] = numpy.einsum('a,mn->amn', A0, idn)
    site0[0, ng:2 * ng] = numpy.einsum('a,mn->amn', B0, nii)
    site0[0, 2 * ng:] = numpy.einsum('a,mn->amn', D0, nud)
    # last [D0,B0,A0]
    site1 = numpy.zeros((3 * ng, 1, 4, 4))
    site1[:ng, 0] = numpy.einsum('a,mn->amn', D0, nud)
    site1[ng:2 * ng, 0] = numpy.einsum('a,mn->amn', B0, nii)
    site1[2 * ng:, 0] = numpy.einsum('a,mn->amn', A0, idn)
    # centeral
    # [A1,B1,D1]
    # [ 0,A1,B1]
    # [ 0, 0,A1]
    site2 = numpy.zeros((3 * ng, 3 * ng, 4, 4))
    site2[:ng, :ng] = numpy.einsum('ab,mn->abmn', A1, idn)
    site2[ng:2 * ng, ng:2 * ng] = numpy.einsum('ab,mn->abmn', A1, idn)
    site2[2 * ng:, 2 * ng:] = numpy.einsum('ab,mn->abmn', A1, idn)
    site2[:ng, ng:2 * ng] = numpy.einsum('ab,mn->abmn', B1, nii)
    site2[ng:2 * ng, 2 * ng:] = numpy.einsum('ab,mn->abmn', B1, nii)
    site2[:ng, 2 * ng:] = numpy.einsum('ab,mn->abmn', D1, nud)
    sites = [site0] + [site2] * (n - 2) + [site1]
    vmpo = class_mpo(n, sites)
    return vmpo
Exemplo n.º 3
0
def genHmpo(n, a, vne):
    wfacs = []
    for i in range(n):
        t = 0.5 / a**2
        U = 1.0 / a**2 + vne[i]
        tmp = mpo_dmrg_model.genHubbardSpatial(n, i, t, U)
        wfacs.append(tmp)
    tmpo = mpo_class.class_mpo(n, sites=wfacs)
    return tmpo
Exemplo n.º 4
0
def genLmpo(n, tau, vi):
    wfacs = []
    for i in range(2 * n):
        tmp = numpy.identity(2)
        tmp[1, 1] = numpy.exp(-tau * vi[i])
        tmp = tmp.reshape((1, 1, 2, 2))
        wfacs.append(tmp)
    lmpo = mpo_class.class_mpo(2 * n, sites=wfacs)
    lmpo = lmpo.merge([[2 * i, 2 * i + 1] for i in range(n)])
    return lmpo
Exemplo n.º 5
0
def genEvenOdd(n, iop, vl, vr):
    io = numpy.zeros((1, 1, 4, 4))
    io[0, 0] = numpy.identity(4)
    if iop == 0:
        # apply t[even]
        if n % 2 == 0:
            wfacs = [vl, vr] * (n / 2)
            prj_mpo = mpo_class.class_mpo(n, sites=wfacs)
        else:
            wfacs = [vl, vr] * (n / 2) + [io]
            prj_mpo = mpo_class.class_mpo(n, sites=wfacs)
    else:
        # apply t[odd]
        if n % 2 == 0:
            wfacs = [io] + [vl, vr] * (n / 2) + [io]
            prj_mpo = mpo_class.class_mpo(n, sites=wfacs)
        else:
            wfacs = [io] + [vl, vr] * (n / 2)
            prj_mpo = mpo_class.class_mpo(n, sites=wfacs)
    return prj_mpo
Exemplo n.º 6
0
def genGMPO(n,left,right,middle,ifnormalize=False):
   A0,B0,D0 = left
   A2,C2,D2 = right
   A1,B1,C1,D1 = middle
   ng = A0.shape[0]
   # Construction of MPOs 
   idn = numpy.identity(4)
   nii = numpy.zeros((4,4))
   nii[1,1] = 1.0
   nii[2,2] = 1.0
   nud = numpy.zeros((4,4))
   nud[3,3] = 1.0
   # first [A0,B0,D0]
   site0 = numpy.zeros((1,3*ng,4,4))
   site0[0,:ng]     = numpy.einsum('a,mn->amn',A0,idn)
   site0[0,ng:2*ng] = numpy.einsum('a,mn->amn',B0,nii)
   site0[0,2*ng:]   = numpy.einsum('a,mn->amn',D0,nud)
   # last [D0,B0,A0]
   site1 = numpy.zeros((3*ng,1,4,4))
   site1[:ng,0]     = numpy.einsum('a,mn->amn',D2,nud)
   site1[ng:2*ng,0] = numpy.einsum('a,mn->amn',C2,nii)
   site1[2*ng:,0]   = numpy.einsum('a,mn->amn',A2,idn)
   # centeral
   # [A1,B1,D1]
   # [ 0,A1,C1]
   # [ 0, 0,A1]
   site2 = numpy.zeros((3*ng,3*ng,4,4))
   site2[:ng,:ng] 	  = numpy.einsum('ab,mn->abmn',A1,idn)
   site2[ng:2*ng,ng:2*ng] = numpy.einsum('ab,mn->abmn',A1,idn)
   site2[2*ng:,2*ng:] 	  = numpy.einsum('ab,mn->abmn',A1,idn)
   site2[:ng,ng:2*ng] 	  = numpy.einsum('ab,mn->abmn',B1,nii)
   site2[ng:2*ng,2*ng:]   = numpy.einsum('ab,mn->abmn',C1,nii)
   site2[:ng,2*ng:] 	  = numpy.einsum('ab,mn->abmn',D1,nud)
   sites = [site0]+[site2]*(n-2)+[site1]
   # Normalization
   if ifnormalize:
      Z0 = reduce(numpy.dot,[A0]+[A1]*(n-2)+[A2])
      scale = numpy.power(Z0,-1.0/n)
      print ' Z0=',Z0,' n=',n,' scale=',scale
      sites = map(lambda x:x*scale,sites)
   vmpo = class_mpo(n,sites)
   return vmpo
Exemplo n.º 7
0
def genEVmpoTaylor(n,a,ng=40,iop=0):
   # Quadrature
   sfac = 1.0/(1.0+0.5*kappa0**2*a**2)
   # OBC
   tij = numpy.diag([1.0]*n)
   for i in range(n-1):
      tij[i,i+1] = tij[i+1,i] = -0.5*sfac
   cfac = Aref*2.0*kappa0
   nfac = numpy.power(cfac*numpy.sqrt(numpy.linalg.det(tij)),1.0/n)/ \
          numpy.sqrt(numpy.pi)
  
   import math
   def denorm(n1,n2=None):
      if n2 == None:
         return 1.0/math.sqrt(float(math.factorial(n1)))
      else:
         return 1.0/math.sqrt(float(math.factorial(n1))*float(math.factorial(n2)))


   A0 = numpy.array([0.5*(1+(-1)**n1)*sfac**(n1/2.0)*math.gamma((n1+1.0)/2.0)\
	      *denorm(n1) for n1 in range(ng)])
   A1 = numpy.array([[0.5*(1+(-1)**(n1+n2))*sfac**((n1+n2)/2.0)*math.gamma((n1+n2+1.0)/2.0)\
	      *denorm(n1,n2) for n1 in range(ng)] for n2 in range(ng)])
   nfac1 = numpy.power(cfac/reduce(numpy.dot,[A0]+[A1]*(n-2)+[A0.T]),1.0/n)
   print 'n=',n,reduce(numpy.dot,[A0]+[A1]*(n-2)+[A0.T]),\
		numpy.pi**(n/2.0)/numpy.sqrt(numpy.linalg.det(tij)),\
		nfac,nfac1
   # New normalization factor
   if iop == 1: nfac = nfac1

   # A,B,D
   A0 = nfac*numpy.array([0.5*(1+(-1)**n1)*sfac**(n1/2.0)*math.gamma((n1+1.0)/2.0)\
		   *denorm(n1) for n1 in range(ng)])
   B0 = nfac*numpy.array([0.5*(1-(-1)**n1)*sfac**(n1/2.0)*math.gamma((n1+2.0)/2.0)\
		   *denorm(n1) for n1 in range(ng)])*numpy.sqrt(sfac*a)
   D0 = nfac*numpy.array([0.5*(1+(-1)**n1)*sfac**(n1/2.0)*math.gamma((n1+3.0)/2.0)\
		   *denorm(n1) for n1 in range(ng)])*(sfac*a)
   A1 = nfac*numpy.array([[0.5*(1+(-1)**(n1+n2))*sfac**((n1+n2)/2.0)*math.gamma((n1+n2+1.0)/2.0)\
		   *denorm(n1,n2) for n1 in range(ng)] for n2 in range(ng)])
   B1 = nfac*numpy.array([[0.5*(1-(-1)**(n1+n2))*sfac**((n1+n2)/2.0)*math.gamma((n1+n2+2.0)/2.0)\
		   *denorm(n1,n2) for n1 in range(ng)] for n2 in range(ng)])*numpy.sqrt(sfac*a)
   D1 = nfac*numpy.array([[0.5*(1+(-1)**(n1+n2))*sfac**((n1+n2)/2.0)*math.gamma((n1+n2+3.0)/2.0)\
		   *denorm(n1,n2) for n1 in range(ng)] for n2 in range(ng)])*(sfac*a)

   # Construction of MPOs 
   idn = numpy.identity(4)
   nii = numpy.zeros((4,4))
   nii[1,1] = 1.0
   nii[2,2] = 1.0
   nud = numpy.zeros((4,4))
   nud[3,3] = 1.0
   # first [A0,B0,D0]
   site0 = numpy.zeros((1,3*ng,4,4))
   site0[0,:ng]     = numpy.einsum('a,mn->amn',A0,idn)
   site0[0,ng:2*ng] = numpy.einsum('a,mn->amn',B0,nii)
   site0[0,2*ng:]   = numpy.einsum('a,mn->amn',D0,nud)
   # last [D0,B0,A0]
   site1 = numpy.zeros((3*ng,1,4,4))
   site1[:ng,0]     = numpy.einsum('a,mn->amn',D0,nud)
   site1[ng:2*ng,0] = numpy.einsum('a,mn->amn',B0,nii)
   site1[2*ng:,0]   = numpy.einsum('a,mn->amn',A0,idn)
   # centeral
   # [A1,B1,D1]
   # [ 0,A1,B1]
   # [ 0, 0,A1]
   site2 = numpy.zeros((3*ng,3*ng,4,4))
   site2[:ng,:ng] 	  = numpy.einsum('ab,mn->abmn',A1,idn)
   site2[ng:2*ng,ng:2*ng] = numpy.einsum('ab,mn->abmn',A1,idn)
   site2[2*ng:,2*ng:] 	  = numpy.einsum('ab,mn->abmn',A1,idn)
   site2[:ng,ng:2*ng] 	  = numpy.einsum('ab,mn->abmn',B1,nii)
   site2[ng:2*ng,2*ng:]   = numpy.einsum('ab,mn->abmn',B1,nii)
   site2[:ng,2*ng:] 	  = numpy.einsum('ab,mn->abmn',D1,nud)
   sites = [site0]+[site2]*(n-2)+[site1]
   vmpo = class_mpo(n,sites)
   return vmpo
Exemplo n.º 8
0
site1[:ng, 0] = numpy.einsum('a,mn->amn', D0, nii) / 2
site1[ng:2 * ng, 0] = numpy.einsum('a,mn->amn', B0, nii)
site1[2 * ng:, 0] = numpy.einsum('a,mn->amn', A0, idn)
# centeral
# [A1,B1,D1]
# [ 0,A1,B1]
# [ 0, 0,A1]
site2 = numpy.zeros((3 * ng, 3 * ng, 2, 2))
site2[:ng, :ng] = numpy.einsum('ab,mn->abmn', A1, idn)
site2[ng:2 * ng, ng:2 * ng] = numpy.einsum('ab,mn->abmn', A1, idn)
site2[2 * ng:, 2 * ng:] = numpy.einsum('ab,mn->abmn', A1, idn)
site2[:ng, ng:2 * ng] = numpy.einsum('ab,mn->abmn', B1, nii)
site2[ng:2 * ng, 2 * ng:] = numpy.einsum('ab,mn->abmn', B1, nii)
site2[:ng, 2 * ng:] = numpy.einsum('ab,mn->abmn', D1, nii) / 2
sites = [site0] + [site2] * (n - 2) + [site1]
mpo = class_mpo(n, sites)

# Simpler MPO:
# [1 sqrt(a)    1 ]
# [0    a  sqrt(a)]  a=exp(-alpha*e)/(2*alpha)**(1/n)
# [0    0       1 ]
afac = numpy.exp(-alpha * e)
site0 = numpy.zeros((1, 3, 2, 2))
site0[0, 0] = idn
site0[0, 1] = numpy.sqrt(afac) * nii
site0[0, 2] = nii / 2.0
site1 = numpy.zeros((3, 1, 2, 2))
site1[0, 0] = nii / 2.0
site1[1, 0] = numpy.sqrt(afac) * nii
site1[2, 0] = idn
site2 = numpy.zeros((3, 3, 2, 2))
Exemplo n.º 9
0
mps, qnum = mpo_dmrg_io.loadMPS(fmps, icase=1)
nsite = len(mps)

# Hamiltonian
fhop = h5py.File('./cal1/hop')
nops = fhop['nops'].value
assert nops == 1
wfacs = [0] * nsite
for isite in range(nsite):
    gname = 'site' + str(isite)
    grp = fhop[gname]
    for iop in range(nops):
        wfacs[isite] = grp['op' + str(iop)].value + 0.j
# H-MPO
hmpo = mpo_class.class_mpo(nsite, sites=wfacs)
# DM[i,i]
mps0 = mps_class.class_mps(nsite, sites=mps, iop=1)
e0 = mps0.dot(hmpo.dotMPS(mps0))
print('e0=', e0)

maxM = 100
ttotal = 500.
nstep = 5000
iorder = 4
prefix = './dataOrder' + str(iorder)

tau = ttotal / nstep
print('nstep=', nstep)
slst = [0]  #,1,2,3] #range(nsite)