Esempio n. 1
0
def genHubbardSpatial(dmrg, isite):
    iden = mpo_dmrg_spinopers.genIpMat()
    nanb = mpo_dmrg_spinopers.genNaNbMat()
    creA = mpo_dmrg_opers.genElemSpatialMat(2 * isite, isite, 1)
    creB = mpo_dmrg_opers.genElemSpatialMat(2 * isite + 1, isite, 1)
    annA = mpo_dmrg_opers.genElemSpatialMat(2 * isite, isite, 0)
    annB = mpo_dmrg_opers.genElemSpatialMat(2 * isite + 1, isite, 0)
    # ai^+[alpha]*aj[alpha]   =  creA*sgnA*sgnB * annA
    # -ai[alpha]*aj^+[alpha]  = -annA*sgnA*sgnB * creA
    # ai^+[beta]*aj[beta]     =  sgnA*creB*sgnB * annB
    # -ai[beta]*aj^+[beta]   =  -sgnA*annB*sgnB * creB
    sa = genSaSpatialMat()
    sb = genSbSpatialMat()
    sasb = genSaSbSpatialMat()
    creAs = numpy.dot(creA, sasb)
    annAs = numpy.dot(annA, sasb)
    # Note that creB already contains a sign factor sgnA, so
    # an additional sgnA is needed to cancel it.
    creBs = numpy.dot(sa, numpy.dot(creB, sb))
    annBs = numpy.dot(sa, numpy.dot(annB, sb))
    # Set up elements
    if isite == 0:
        # [I C D] = [ I (-t)au^+ (-t)ad^+ (-t)au (-t)ad U*niA*niB ]
        cop = numpy.zeros((1, 6, 4, 4))
        cop[0, 0] = iden
        cop[0, 1] = -dmrg.model_t * creAs
        cop[0, 2] = -dmrg.model_t * creBs
        cop[0, 3] = -dmrg.model_t * annAs
        cop[0, 4] = -dmrg.model_t * annBs
        cop[0, 5] = dmrg.model_u * nanb
    elif isite == dmrg.nsite - 1:
        # [D B I]^T
        cop = numpy.zeros((6, 1, 4, 4))
        cop[0, 0] = dmrg.model_u * nanb
        cop[1, 0] = annA
        cop[2, 0] = annB
        cop[3, 0] = -creA
        cop[4, 0] = -creB
        cop[5, 0] = iden
    else:
        # [ I  -t*a^+ -t*a D  ]
        # [ 0    0     0   a  ]
        # [ 0    0     0  -a^+]
        # [ 0    0     0   I  ]
        cop = numpy.zeros((6, 6, 4, 4))
        cop[0, 0] = iden
        cop[0, 1] = -dmrg.model_t * creAs
        cop[0, 2] = -dmrg.model_t * creBs
        cop[0, 3] = -dmrg.model_t * annAs
        cop[0, 4] = -dmrg.model_t * annBs
        cop[0, 5] = dmrg.model_u * nanb
        cop[1, 5] = annA
        cop[2, 5] = annB
        cop[3, 5] = -creA
        cop[4, 5] = -creB
        cop[5, 5] = iden
    return cop
Esempio n. 2
0
def test_creann():
    # LOAD MPS
    fname = './mps.h5'
    mps, qnum = mps_io.loadMPS(fname)
    lmps = [mps, qnum]
    bdim = [len(x) for x in qnum]
    print(' bdim = ', bdim)
    nsite = len(mps)
    qphys = mpo_dmrg_qphys.initSpatialOrb(nsite, 2)
    ta = 0.
    tb = 0.
    for isite in range(nsite):
        ql = qnum[isite]
        qn = qphys[isite]
        qr = qnum[isite + 1]
        cl = qtensor_util.classification(ql)
        cn = qtensor_util.classification(qn)
        cr = qtensor_util.classification(qr)
        print('isite/nsite=', isite, nsite)
        site = mps[isite]
        tmps = qtensor.qtensor([False, False, True])
        tmps.fromDenseTensor(site, [ql, qn, qr])
        tmps.prt()
        for iop in [1, 0]:
            for p in range(2 * nsite):
                t0 = time.time()
                op = mpo_dmrg_opers.genElemSpatialMat(p, isite, iop)
                #csite = numpy.einsum('ij,ajb->aib',op,site)
                csite = numpy.tensordot(op, site, axes=([1], [1]))  # iab
                csite = csite.transpose(1, 0, 2)
                t1 = time.time()
                qop = qtensor_opers.genElemSpatialQt(p, isite, iop)
                # ijab,xby-> ijaxy -> ix,a,jy
                tmps2 = qtensor.tensordot(qop, tmps, axes=([3], [1]))
                tmps2 = tmps2.transpose(0, 3, 2, 1, 4)
                tmps2 = tmps2.merge([[0, 1], [2], [3, 4]])
                tsite = tmps2.toDenseTensor()
                t2 = time.time()
                assert csite.shape == tsite.shape
                diff = numpy.linalg.norm(tsite - csite)
                print('iop,p,diff=', iop, p, csite.shape, diff, ' t0=',
                      t1 - t0, ' t1=', t2 - t1)
                assert diff < 1.e-10
                ta += t1 - t0
                tb += t2 - t1
    # In case of large bond dimension, e.g.,
    # D=2000, t0/t1~0.21/0.09 due to sparsity!
    print()
    print('ta=', ta)  # ta= 20.7766697407
    print('tb=', tb)  # tb= 18.2862818241
    print()
    return 0
Esempio n. 3
0
def genCAopsNQt(norder, dmrg, fbmps, fkmps, fname, status, debug=False):
    if dmrg.comm.rank == 0:
        print '[mpo_dmrg_block.genCAopsNQt] status=', status
        print ' fname = ', fname
    t0 = time.time()
    bnsite = fbmps['nsite'].value
    knsite = fkmps['nsite'].value
    assert bnsite == knsite
    nsite = bnsite
    sbas = 2 * nsite
    prefix = fname + '_site_'
    #
    # On-site operators
    #
    sgnn = numpy.array([1., -1., -1., 1.])
    cre = [0] * 2
    cre[0] = mpo_dmrg_opers.genElemSpatialMat(0, 0, 1)
    cre[1] = mpo_dmrg_opers.genElemSpatialMat(1, 0, 1)
    ann = [0] * 2
    ann[0] = mpo_dmrg_opers.genElemSpatialMat(0, 0, 0)
    ann[1] = mpo_dmrg_opers.genElemSpatialMat(1, 0, 0)
    cc2 = cre[0].dot(cre[1])
    aa2 = ann[0].dot(ann[1])
    ca2 = [cre[i].dot(ann[j]) for i in range(2) for j in range(2)]
    ac2 = [ann[i].dot(cre[j]) for i in range(2) for j in range(2)]
    #
    # L->R sweeps
    #
    if status == 'L':

        mpo_dmrg_init.genBmat(dmrg, fname, -1)
        for isite in range(0, nsite):
            if debug: print ' isite=', isite, ' of nsite=', nsite
            ti = time.time()
            f0 = h5py.File(prefix + str(isite - 1), "r")
            f1name = prefix + str(isite)
            f1 = h5py.File(f1name, "w")
            bsite = mpo_dmrg_io.loadSite(fbmps, isite, dmrg.ifQt)
            ksite = mpo_dmrg_io.loadSite(fkmps, isite, dmrg.ifQt)

            # 0. Qnums
            porbs = 2 * isite
            nqum = fkmps['qnum' + str(isite)].value[:, 0]
            sgnl = numpy.power(-1.0, nqum)
            ksite2 = numpy.einsum('l,lnr->lnr', sgnl, ksite)

            # 1. Similar to mpo_dmrg_init.genSopsNQt: <li[A]|lj[B]>
            oplst = ['mat']
            renorm_l1(bsite, ksite, f0, f1, oplst)

            # 2. Part-1: <l'n'|op|ln> = <l'|op|l>*<n'|n>  if p < 2k
            oplst = ['op_C_'+str(p) for p in range(porbs)]\
                  + ['op_A_'+str(p) for p in range(porbs)]
            renorm_l1(bsite, ksite, f0, f1, oplst)
            #   Part-2: <l'n'|op|ln> = <l'|l>(-1)^l*<n'|op|n> if p = 2k,2k+1
            #   	     <L'|op|L> = A[l'n',L']*<l'|l><n'|op|n>*A[ln,L]
            tmp0 = renorm_l2_absorb_lop(bsite, f0['mat'])
            for ispin in range(2):
                tmp = renorm_l2_transform_nop(tmp0, cre[ispin], ksite2)
                f1['op_C_' + str(2 * isite + ispin)] = tmp
                tmp = renorm_l2_transform_nop(tmp0, ann[ispin], ksite2)
                f1['op_A_' + str(2 * isite + ispin)] = tmp

            # 3. Part-1: <l'n'|aa(p<q)|ln> = <l'|apq|l><n'|n>  if p,q < 2k
            oplst = ['op_CC_'+str(p)+'_'+str(q) for p in range(porbs) for q in range(p+1,porbs)]\
                  + ['op_AA_'+str(p)+'_'+str(q) for p in range(porbs) for q in range(p+1,porbs)]
            renorm_l1(bsite, ksite, f0, f1, oplst)
            #    Part-2: <l'|ap|l>*<n'|aq|n> if p < 2k and q in 2k,2k+1
            for p in range(porbs):
                # CC
                tmp0 = renorm_l2_absorb_lop(bsite, f0['op_C_' + str(p)])
                for ispin in range(2):
                    tmp = renorm_l2_transform_nop(tmp0, cre[ispin], ksite2)
                    f1['op_CC_' + str(p) + '_' + str(2 * isite + ispin)] = tmp
                # AA
                tmp0 = renorm_l2_absorb_lop(bsite, f0['op_A_' + str(p)])
                for ispin in range(2):
                    tmp = renorm_l2_transform_nop(tmp0, ann[ispin], ksite2)
                    f1['op_AA_' + str(p) + '_' + str(2 * isite + ispin)] = tmp
            #    Part-3: <l'|l>*<n'|apq|n> if p,q in 2k,2k+1
            #   	      <L'|opq|L> = A[l'n',L']*<l'|l><n'|op|n>*A[ln,L]
            tmp0 = renorm_l2_absorb_lop(bsite, f0['mat'])
            tmp = renorm_l2_transform_nop(tmp0, cc2, ksite)
            f1['op_CC_' + str(2 * isite + 0) + '_' + str(2 * isite + 1)] = tmp
            tmp = renorm_l2_transform_nop(tmp0, aa2, ksite)
            f1['op_AA_' + str(2 * isite + 0) + '_' + str(2 * isite + 1)] = tmp

            # 4. Part-1: <l'n'|cp*aq|ln> = <l'|cp*aq|l><n'|n>  if p,q < 2k
            oplst = ['op_CA_'+str(p)+'_'+str(q) for p in range(porbs) for q in range(porbs)]\
                  + ['op_AC_'+str(p)+'_'+str(q) for p in range(porbs) for q in range(porbs)]
            renorm_l1(bsite, ksite, f0, f1, oplst)
            #    Part-2: cp[l]*aq[n] or cq[n]*ap[l]=-ap[l]*cq[n]
            #	      ap[l]*cq[n] or aq[n]*cp[l]=-cp[l]*aq[n]
            #	      for p < 2*k and q in 2k,2k+1
            for p in range(porbs):
                # CA
                tmp0 = renorm_l2_absorb_lop(bsite, f0['op_C_' + str(p)])
                for ispin in range(2):
                    tmp = renorm_l2_transform_nop(tmp0, ann[ispin], ksite2)
                    f1['op_CA_' + str(p) + '_' + str(2 * isite + ispin)] = tmp
                    f1['op_AC_' + str(2 * isite + ispin) + '_' + str(p)] = -tmp
                # AC
                tmp0 = renorm_l2_absorb_lop(bsite, f0['op_A_' + str(p)])
                for ispin in range(2):
                    tmp = renorm_l2_transform_nop(tmp0, cre[ispin], ksite2)
                    f1['op_AC_' + str(p) + '_' + str(2 * isite + ispin)] = tmp
                    f1['op_CA_' + str(2 * isite + ispin) + '_' + str(p)] = -tmp
            #    Part-3: <l'|l>*<n'|cp*aq|n> if p,q in 2k,2k+1
            tmp0 = renorm_l2_absorb_lop(bsite, f0['mat'])
            for ispin in range(2):
                for jspin in range(2):
                    tmp = renorm_l2_transform_nop(tmp0, ca2[ispin * 2 + jspin],
                                                  ksite)
                    f1['op_CA_' + str(2 * isite + ispin) + '_' +
                       str(2 * isite + jspin)] = tmp
                    tmp = renorm_l2_transform_nop(tmp0, ac2[ispin * 2 + jspin],
                                                  ksite)
                    f1['op_AC_' + str(2 * isite + ispin) + '_' +
                       str(2 * isite + jspin)] = tmp

        # final isite
            f0.close()
            f1.close()
            tf = time.time()
            if dmrg.comm.rank == 0:
                print ' isite =', os.path.split(
                    f1name)[-1], ' t = %.2f s' % (tf - ti)

    #
    # L<-R sweeps: For properties, left canonical form is assumed even for R sweeps!
    #
    elif status == 'R':

        mpo_dmrg_init.genBmat(dmrg, fname, nsite)
        for isite in range(nsite - 1, -1, -1):
            if debug: print ' isite=', isite, ' of nsite=', nsite
            ti = time.time()
            f0 = h5py.File(prefix + str(isite + 1), "r")
            f1name = prefix + str(isite)
            f1 = h5py.File(f1name, "w")
            bsite = mpo_dmrg_io.loadSite(fbmps, isite, dmrg.ifQt)
            ksite = mpo_dmrg_io.loadSite(fkmps, isite, dmrg.ifQt)

            # 0. Qnums
            porbs = 2 * (isite + 1)
            ksite2 = numpy.einsum('n,lnr->lnr', sgnn, ksite)

            # 1. <ri[A]|rj[B]>
            oplst = ['mat']
            renorm_r1(bsite, ksite, f0, f1, oplst)

            # 2. Part-1: <n'r'|op|nr> = <n'|n>(-1)^n*<r'|op|r> if p > 2k
            # 	      A[l',n',r']<n'|n>(-1)^n*<r'|op|r>*A[l,n,r]
            oplst = ['op_C_'+str(p) for p in range(porbs,sbas)]\
                  + ['op_A_'+str(p) for p in range(porbs,sbas)]
            renorm_r1(bsite, ksite2, f0, f1, oplst)
            #    Part-2: <n'r'|op|nr> = <n'|op|n>*<r'|r> if p = 2k,2k+1
            #	      <l'|op|l> = A[l',n'r']*<n'|op|n>*<r'|r>*A[l,nr]
            tmp0 = renorm_r2_absorb_rop(ksite, f0['mat'])
            for ispin in range(2):
                tmp = renorm_r2_transform_nop(tmp0, cre[ispin], bsite)
                f1['op_C_' + str(2 * isite + ispin)] = tmp
                tmp = renorm_r2_transform_nop(tmp0, ann[ispin], bsite)
                f1['op_A_' + str(2 * isite + ispin)] = tmp

            # 3. Part-1: <n'r'|aa(p<q)|n'r'> = <n'|n><r'|apq|r> if p,q > 2k
            #	      <l'|aa(p<q)|l> = A[l',n',r']<n'|n><r'|apq|r>A[l,n,r]
            oplst = ['op_CC_'+str(p)+'_'+str(q) for p in range(porbs,sbas) for q in range(p+1,porbs)]\
                  + ['op_AA_'+str(p)+'_'+str(q) for p in range(porbs,sbas) for q in range(p+1,porbs)]
            renorm_r1(bsite, ksite, f0, f1, oplst)
            #    Part-2: <n'r'|aa(p<q)|n'r'> = <n'|ap|n>*S*<r'|aq|r> if p in 2k,2k+1 and q > 2k
            #	      <l'|aa(p<q)|l> = A[l',n',r']*<n'|ap|n>S*<r'|aq|r>*A[l,n,r]
            for p in range(porbs, sbas):
                # CC
                tmp0 = renorm_r2_absorb_rop(ksite2, f0['op_C_' + str(p)])
                for ispin in range(2):
                    tmp = renorm_r2_transform_nop(tmp0, cre[ispin], bsite)
                    f1['op_CC_' + str(2 * isite + ispin) + '_' + str(p)] = tmp
                # AA
                tmp0 = renorm_r2_absorb_rop(ksite2, f0['op_A_' + str(p)])
                for ispin in range(2):
                    tmp = renorm_r2_transform_nop(tmp0, ann[ispin], bsite)
                    f1['op_AA_' + str(2 * isite + ispin) + '_' + str(p)] = tmp
            #    Part-3: <n'r'|aa(p<q)|n'r'> = <n'|apq|n>*<r'|r> if p,q in 2k,2k+1
            #	      <l'|aa(p<q)|l> = A[l',n',r]*<n'|apq|n>*<r'|r>*A[l,n,r]
            tmp0 = renorm_r2_absorb_rop(ksite, f0['mat'])
            tmp = renorm_r2_transform_nop(tmp0, cc2, bsite)
            f1['op_CC_' + str(2 * isite + 0) + '_' + str(2 * isite + 1)] = tmp
            tmp = renorm_r2_transform_nop(tmp0, aa2, bsite)
            f1['op_AA_' + str(2 * isite + 0) + '_' + str(2 * isite + 1)] = tmp

            # 4. Part-1: <n'r'|cp*aq|nr> = <n'|n><r'|cp*aq|r> if p,q > 2k
            #	      <l'|cp*aq|l> = A[l',nr']*<r'|cp*aq|r>*A[l,nr]
            oplst = ['op_CA_'+str(p)+'_'+str(q) for p in range(porbs,sbas) for q in range(porbs,sbas)]\
                  + ['op_AC_'+str(p)+'_'+str(q) for p in range(porbs,sbas) for q in range(porbs,sbas)]
            renorm_r1(bsite, ksite, f0, f1, oplst)
            #    Part-2: <n'r'|cp*aq|nr> = <n'|cp|n>S*<r'|aq|r>
            for p in range(porbs, sbas):
                # CA
                tmp0 = renorm_r2_absorb_rop(ksite2, f0['op_A_' + str(p)])
                for ispin in range(2):
                    tmp = renorm_r2_transform_nop(tmp0, cre[ispin], bsite)
                    f1['op_CA_' + str(2 * isite + ispin) + '_' + str(p)] = tmp
                    f1['op_AC_' + str(p) + '_' + str(2 * isite + ispin)] = -tmp
                # AA
                tmp0 = renorm_r2_absorb_rop(ksite2, f0['op_C_' + str(p)])
                for ispin in range(2):
                    tmp = renorm_r2_transform_nop(tmp0, ann[ispin], bsite)
                    f1['op_AC_' + str(2 * isite + ispin) + '_' + str(p)] = tmp
                    f1['op_CA_' + str(p) + '_' + str(2 * isite + ispin)] = -tmp
            #    Part-3: <n'r'|cp*aq|n'r'> = <n'|cp*aq|n>*<r'|r> if p,q in 2k,2k+1
            tmp0 = renorm_r2_absorb_rop(ksite, f0['mat'])
            for ispin in range(2):
                for jspin in range(2):
                    tmp = renorm_r2_transform_nop(tmp0, ca2[ispin * 2 + jspin],
                                                  bsite)
                    f1['op_CA_' + str(2 * isite + ispin) + '_' +
                       str(2 * isite + jspin)] = tmp
                    tmp = renorm_r2_transform_nop(tmp0, ac2[ispin * 2 + jspin],
                                                  bsite)
                    f1['op_AC_' + str(2 * isite + ispin) + '_' +
                       str(2 * isite + jspin)] = tmp

            # final isite
            f0.close()
            f1.close()
            tf = time.time()
            if dmrg.comm.rank == 0:
                print ' isite =', os.path.split(
                    f1name)[-1], ' t = %.2f s' % (tf - ti)

    # CHECK
    f = h5py.File(f1name, 'r')
    rdm1 = numpy.zeros((sbas, sbas))
    hdm1 = numpy.zeros((sbas, sbas))
    for i in range(sbas):
        for j in range(sbas):
            rdm1[i, j] = f['op_CA_' + str(i) + '_' + str(j)].value
            hdm1[j, i] = f['op_AC_' + str(i) + '_' + str(j)].value
    sab = f['mat'].value[0, 0]
    #print rdm1+hdm1
    print ' ovlap=', sab
    print ' P+H-I=', numpy.linalg.norm(rdm1 + hdm1 -
                                       numpy.identity(sbas) * sab)
    print ' skewP=', numpy.linalg.norm(rdm1 - rdm1.T)
    print ' skewH=', numpy.linalg.norm(hdm1 - hdm1.T)
    print ' trace=', numpy.trace(rdm1)
    f.close()

    t1 = time.time()
    dmrg.comm.Barrier()
    print ' time for genHops = %.2f s' % (t1 - t0), ' rank =', dmrg.comm.rank
    return rdm1
Esempio n. 4
0
    mps_i1 = mps_i1.add(k1)
    mps_i1 = mps_i1.add(k2)
    mps_i1 = mps_i1.add(k3)
    mps_i1 = mps_i1.add(k4)
    norm = compress(mps_i1, maxM)
    return mps_i1, norm


for isite in slst:

    # create complex MPS
    mpsi = None
    mpsi = [mps[i] + 0.j for i in range(nsite)]

    # MPSi = ai*|psi0>
    annA = mpo_dmrg_opers.genElemSpatialMat(2 * isite, isite, 0)
    tmp = numpy.tensordot(annA, mpsi[isite], axes=([1], [1]))
    mpsi[isite] = tmp.transpose(1, 0, 2)

    # sign change
    for jsite in range(isite):
        sgn = mpo_dmrg_model.genSaSbSpatialMat()
        tmp = numpy.tensordot(sgn, mpsi[jsite], axes=([1], [1]))
        mpsi[jsite] = tmp.transpose(1, 0, 2)

    # MPS class
    mps_i0 = mps_class.class_mps(nsite, sites=mpsi, iop=1)
    mps_i = mps_class.class_mps(nsite, sites=mpsi, iop=1)

    # DM[i,i]
    norm0 = mps_i.norm()