예제 #1
0
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
예제 #2
0
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
예제 #3
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