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
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
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
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()