def genWfacSpatialQt(nsite, isite, hq, vqrs, isz): isym = 2 status = 'L' site = mpo_dmrg_opers.genWfacSpatial(nsite, isite, hq, vqrs) qt = qtensor.qtensor([False, True, False, True]) # Site physical indices qu, qd = genQphys(isym, isite) # Quantum numbers ql1, qr1 = genWfacQnums(nsite, 2 * isite, isz, status) ql2, qr2 = genWfacQnums(nsite, 2 * isite + 1, isz, status) ql = ql1 qr = qr2 qt.fromDenseTensor(site, [ql, qr, qu, qd]) return qt
def testWfacSpatial(): # # Time for tc becomes smaller for nsite=100, # due to the saving in contraction two sites. # # ta = 14.3027746677 # tb = 16.9804520607 averaged(/100) = 0.16s. # tc = 13.7098605633 # # isz,isite= 0 46 # wop= (402, 402, 4, 4) # Basic information: # rank = 4 shape= [402 402 4 4] nsyms= [8 8 4 4] # nblks_allowed = 84 nblks = 1024 # size_allowed = 212956 size = 2585664 savings= 0.0823602757357 # isz,isite,diff= 0 46 0.0 # Basic information: # rank = 4 shape= [402 402 4 4] nsyms= [8 8 4 4] # nblks_allowed = 84 nblks = 1024 # size_allowed = 212956 size = 2585664 savings= 0.0823602757357 # isz,isite,diff= 0 46 0.0 # equalSym= True # t1= 0.189389944077 # t2= 0.212503194809 # t3= 0.176101922989 # nsite = 40 nbas = nsite * 2 hmo = numpy.random.uniform(-1, 1, (nbas, nbas)) hmo[::2, 1::2] = hmo[1::2, ::2] = 0. # [ij|kl] eri = numpy.random.uniform(-1, 1, (nbas, nbas, nbas, nbas)) eri[::2, 1::2] = eri[1::2, ::2] = eri[:, :, ::2, 1::2] = eri[:, :, 1::2, ::2] = 0. # The spin symmetry is essential. # <ij|kl>=[ik|jl] eri = eri.transpose(0, 2, 1, 3) # Antisymmetry is not since only r<s is taken. # # Antisymmetrize V[pqrs]=-1/2*<pq||rs> # eri = -0.5*(eri-eri.transpose(0,1,3,2)) for isz in [0, 1]: hq = hmo[isz] vqrs = eri[isz] ta = 0. tb = 0. tc = 0. for isite in range(nsite): print '\nisz,isite=', isz, isite t0 = time.time() site0 = mpo_dmrg_opers.genWfacSpatial(nbas, isite, hq, vqrs) t1 = time.time() print 'wop=', site0.shape # Wsite qt12 = genWfacSpatialQt(nbas, isite, hq, vqrs, isz) qt12.prt() site1 = qt12.toDenseTensor() t2 = time.time() ta += t1 - t0 tb += t2 - t1 assert site0.shape == site1.shape diff = numpy.linalg.norm(site0 - site1) print 'isz,isite,diff=', isz, isite, diff assert diff < 1.e-10 t3 = time.time() qt12a = genWfacSpinQt(nbas, 2 * isite, hq, vqrs, isz) qt12b = genWfacSpinQt(nbas, 2 * isite + 1, hq, vqrs, isz) qt12l = linkTwoOpers(qt12a, qt12b) qt12l.prt() site2 = qt12l.toDenseTensor() t4 = time.time() tc += t4 - t3 assert site1.shape == site2.shape diff = numpy.linalg.norm(site1 - site2) print 'isz,isite,diff=', isz, isite, diff assert diff < 1.e-10 print ' equalSym=', qt12l.equalSym(qt12) print ' t1=', t1 - t0 print ' t2=', t2 - t1 print ' t3=', t4 - t3 print print 'ta =', ta print 'tb =', tb print 'tc =', tc return 0
def test_Wfac(): # # Wop*Site = [256*30,4,30*1015] = [935424000] - 7G # # isite/nsite= 4 14 # Basic information: # rank = 3 shape= [ 256 4 1015] nsyms= [25 4 36] # nblks_allowed = 100 nblks = 3600 # size_allowed = 62804 size = 1039360 savings= 0.0604256465517 # wop= (30, 30, 4, 4) # t1= 13.3494501114 # t2= 2.59876251221e-05 # # isite/nsite= 5 14 --- 50G for storage. # Basic information: # rank = 3 shape= [1015 4 1822] nsyms= [36 4 44] # nblks_allowed = 136 nblks = 6336 # size_allowed = 376882 size = 7397320 savings= 0.0509484516014 # wop= (30, 30, 4, 4) # #>>> Sparse op becomes better for D~500 for computational time. # #isite/nsite= 3 14 #Basic information: # rank = 3 shape= [ 64 4 256] nsyms= [16 4 25] # nblks_allowed = 64 nblks = 1600 # size_allowed = 4900 size = 65536 savings= 0.0747680664062 # wop= (30, 30, 4, 4) # t1= 0.615185976028 # t2= 0.715934991837 #isite,diff= 3 (1920, 4, 7680) 0.0 t0= 0.615185976028 t1= 0.715934991837 # #isite/nsite= 4 14 #Basic information: # rank = 3 shape= [ 256 4 1015] nsyms= [25 4 36] # nblks_allowed = 100 nblks = 3600 # size_allowed = 62804 size = 1039360 savings= 0.0604256465517 # wop= (30, 30, 4, 4) # t1= 10.8923699856 # t2= 3.5177989006 #isite,diff= 4 (7680, 4, 30450) 0.0 t0= 10.8923699856 t1= 3.5177989006 # #ta= 11.5469501019 #tb= 4.54184865952 # # 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. isz = 0 nbas = 2 * nsite # random hmo = numpy.random.uniform(-1, 1, (nbas, nbas)) hmo[::2, 1::2] = hmo[1::2, ::2] = 0. # [ij|kl] eri = numpy.random.uniform(-1, 1, (nbas, nbas, nbas, nbas)) eri[::2, 1::2] = eri[1::2, ::2] = eri[:, :, ::2, 1::2] = eri[:, :, 1::2, ::2] = 0. # The spin symmetry is essential. # <ij|kl>=[ik|jl] eri = eri.transpose(0, 2, 1, 3) hq = hmo[isz] vqrs = eri[isz] maxn = 3 for isite in range(min(nsite, maxn)): 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() print('isite/nsite=', isite, nsite) site = mps[isite] tmps = qtensor.qtensor([False, False, True]) tmps.fromDenseTensor(site, [ql, qn, qr]) tmps.prt() t0 = time.time() op = mpo_dmrg_opers.genWfacSpatial(nbas, isite, hq, vqrs) print(' wop=', op.shape) #csite = numpy.einsum('lrij,ajb->lairb',op,site) csite = numpy.tensordot(op, site, axes=([3], [1])) # lriab csite = csite.transpose(0, 3, 2, 1, 4) # lriab->lairb s = csite.shape csite = csite.reshape((s[0] * s[1], s[2], s[3] * s[4])) t1 = time.time() print(' t1=', t1 - t0) qop = qtensor_opers.genWfacSpatialQt(nbas, isite, hq, vqrs, isz) 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() print(' t2=', t2 - t1) assert csite.shape == tsite.shape diff = numpy.linalg.norm(tsite - csite) print('isite,diff=', isite, csite.shape, diff, ' t0=', t1 - t0, ' t1=', t2 - t1) assert diff < 1.e-10 ta += t1 - t0 tb += t2 - t1 print() print('ta=', ta) print('tb=', tb) print() return 0