Ejemplo n.º 1
0
def genHfacSpinQt0(p, nsite, isite, hq, vqrs):
    isz = p % 2
    elem = genElemSpinQt(p, isite, iop=1)
    wfac = genWfacSpinQt(nsite, isite, hq, vqrs, isz)
    # lrij,abjk-> lriabk ->larbik
    hfac = qtensor.tensordot(elem, wfac, axes=([3], [2]))
    hfac = hfac.transpose(0, 3, 1, 4, 2, 5)
    hfac = hfac.merge([[0, 1], [2, 3], [4], [5]])
    return hfac
Ejemplo n.º 2
0
def mps_dot(bmps, kmps, status='L'):
    nsite1 = len(bmps)
    nsite2 = len(kmps)
    assert nsite1 == nsite2
    nsite = nsite1
    if status == 'L':
        tmp = qtensor.tensordot(bmps[0], kmps[0], axes=([1], [1]))
        tmp.status[0] = ~tmp.status[0]
        tmp.status[2] = ~tmp.status[2]
        tmp = tmp.merge([[0, 1], [2, 3]])
        for i in range(1, nsite):
            # t[l,r]*k[r,n,r'] = t[l,n,r']
            # b[l,n,l']*t[l,n,r'] = t[l',r']
            tmp = qtensor.tensordot(tmp, kmps[i], axes=([1], [0]))
            tmp = qtensor.tensordot(bmps[i], tmp, axes=([0, 1], [0, 1]))
    elif status == 'R':
        tmp = qtensor.tensordot(bmps[nsite - 1],
                                kmps[nsite - 1],
                                axes=([1], [1]))
        tmp.status[1] = ~tmp.status[1]
        tmp.status[3] = ~tmp.status[3]
        tmp = tmp.merge([[0, 1], [2, 3]])
        for i in range(nsite - 2, -1, -1):
            # b[l,n,l']*t[l',r'] = t[l,n,r']
            # t[l,n,r']*k[r,n,r'] = t[l,r]
            tmp = qtensor.tensordot(bmps[i], tmp, axes=([2], [0]))
            tmp = qtensor.tensordot(tmp, kmps[i], axes=([1, 2], [1, 2]))
    assert len(tmp.value) == 1
    ovlp = tmp.value[0]
    return ovlp
Ejemplo n.º 3
0
def test_creann():
    # LOAD MPS
    fname = './mps.h5'
    mps, qnum = mps_io.loadMPS(fname)
    lmps = [mps, qnum]
    bdim = map(lambda x: len(x), 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
Ejemplo n.º 4
0
def linkTwoOpers(qt1, qt2):
    # (abij),(bckl)-> (aij,ckl)
    qt12 = qtensor.tensordot(qt1, qt2, axes=([1], [0]))
    qt12 = qt12.transpose(0, 3, 1, 4, 2, 5)
    qt12 = qt12.merge([[0], [1], [2, 3], [4, 5]])
    return qt12
Ejemplo n.º 5
0
def test_HRfac():
    # LOAD MPS
    fname = './mps.h5'
    mps, qnum = mps_io.loadMPS(fname)
    lmps = [mps, qnum]
    bdim = map(lambda x: len(x), qnum)
    print ' bdim = ', bdim
    nsite = len(mps)
    qphys = mpo_dmrg_qphys.initSpatialOrb(nsite, 2)
    ta = 0.
    tb = 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)
    maxn = 3
    for p in [6, 5]:
        isz = p % 2
        for isite in range(min(nsite, 5)):
            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])
            print 'mps site info:'
            tmps.prt()

            if isite < maxn:
                # Reference value:
                t0 = time.time()
                pindx = (p, 0)
                qpts = numpy.array([0.3])
                op = mpo_dmrg_opers.genHRfacSpatial(pindx, nbas, isite, hmo,
                                                    eri, qpts)
                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

                # Lowering the symmetry of MPS?
                qop = qtensor_opers.genHRfacSpatialQt(pindx, nbas, isite, hmo,
                                                      eri, qpts)
                # We need to change qop construction allowing given qsyms !
                tmps2 = tmps.reduceQsymsToN()
                #tmps2 = tmps2.projectionNMs(tmps.qsyms)
                #diff = numpy.linalg.norm(tmps2.value-tmps.value)
                #print ' diff=',diff
                tmps2 = qtensor.tensordot(qop, tmps2, 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

            else:

                # Reference value:
                t0 = time.time()
                pindx = (p, 0)
                qpts = numpy.array([0.3])
                t1 = time.time()
                qop = qtensor_opers.genHRfacSpatialQt(pindx, nbas, isite, hmo,
                                                      eri, qpts)
                tmps2 = tmps.reduceQsymsToN()
                tmps2 = qtensor.tensordot(qop, tmps2, axes=([3], [1]))
                print 'before transposing:'
                tmps2.prt()
                tmps2 = tmps2.transpose(0, 3, 2, 1, 4)
                print 'after transposing:'
                tmps2.prt()
                tmps2 = tmps2.merge([[0, 1], [2], [3, 4]])
                print 'after merging:'
                tmps2.prt()
                t2 = time.time()
                print 'isite=', isite, ' t2=', t2 - t1

    print
    print 'ta=', ta
    print 'tb=', tb
    print
    return 0
Ejemplo n.º 6
0
def test_Hfac():
    #
    #------------------------------------------------------------------------
    # The large memory cost of Wop*|Psi> [O(K2D2)] requires, for large Dmps
    # and Dwop, a sequential compression should be implemented as a sweep,
    # such that the [Wsite*MPSsite] can be avoided partially.
    #------------------------------------------------------------------------
    #
    # isite,diff= 0 (1, 4, 232) 0.0  t0= 0.0527150630951  t1= 0.0431280136108
    # isite,diff= 1 (232, 4, 928) 0.0  t0= 0.0108029842377  t1= 0.050961971283
    # isite,diff= 2 (928, 4, 3712) 0.0  t0= 0.146265029907  t1= 0.182390928268
    # isite,diff= 3 (3712, 4, 14848) 0.0  t0= 2.27565908432  t1= 1.25626206398
    # isite= 4 [14848     4 58870]  t1= 3.11030101776
    # isite= 5 [ 58870      4 105676]  t1= 30.1744351387
    # isite= 6 [105676      4 162806]  t1= 101.686741114
    # isite= 7 [162806      4  76966]  t1= 75.6775298119
    # isite= 8 [76966     4 29638]  t1= 8.44200801849
    # isite= 9 [29638     4  9976]  t1= 1.69688081741
    # isite= 10 [9976    4 3074]  t1= 0.343852996826
    # isite= 11 [3074    4  870]  t1= 0.101953983307
    # isite= 12 [870   4 232]  t1= 0.044182062149
    # isite= 13 [232   4   1]  t1= 0.00591492652893
    #
    # LOAD MPS
    fname = './mps.h5'
    mps, qnum = mps_io.loadMPS(fname)
    lmps = [mps, qnum]
    bdim = map(lambda x: len(x), qnum)
    print ' bdim = ', bdim
    nsite = len(mps)
    qphys = mpo_dmrg_qphys.initSpatialOrb(nsite, 2)
    ta = 0.
    tb = 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)
    maxn = 3
    for p in [6, 5]:
        isz = p % 2
        hq = hmo[isz]
        vqrs = eri[isz]
        for isite in range(min(nsite, 5)):
            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])
            print 'mps site info:'
            tmps.prt()

            if isite < maxn:
                t0 = time.time()

                #op = mpo_dmrg_opers.genWfacSpatial(nbas,isite,hq,vqrs)
                op = mpo_dmrg_opers.genHfacSpatial(p, 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)
                qop = qtensor_opers.genHfacSpatialQt(p, nbas, isite, hq, vqrs)
                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

            else:

                if isite == maxn: print '>>> Check internal consistency <<<'
                t0 = time.time()
                #qop = qtensor_opers.genWfacSpatialQt(nbas,isite,hq,vqrs,isz)
                qop = qtensor_opers.genHfacSpatialQt(p, nbas, isite, hq, vqrs)
                tmps2 = qtensor.tensordot(qop, tmps, axes=([3], [1]))
                tmps2 = tmps2.transpose(0, 3, 2, 1, 4)
                tmps2 = tmps2.merge([[0, 1], [2], [3, 4]])
                tmps2.prt()
                t1 = time.time()
                sum1 = numpy.sum(tmps2.value)
                print 'isite=', isite, tmps.shape, ' t0=', t1 - t0, ' sum=', sum1
                tmps2 = None

                qop = qtensor_opers.genHfacSpatialQt0(p, nbas, isite, hq, vqrs)
                tmps2 = qtensor.tensordot(qop, tmps, axes=([3], [1]))
                tmps2 = tmps2.transpose(0, 3, 2, 1, 4)
                tmps2 = tmps2.merge([[0, 1], [2], [3, 4]])
                tmps2.prt()
                t2 = time.time()
                sum2 = numpy.sum(tmps2.value)
                print 'isite=', isite, tmps2.shape, ' t1=', t2 - t1, ' sum=', sum2
                tmps2 = None

                diff = abs(sum1 - sum2)
                print 'diff =', diff
                assert diff < 1.e-10
    print
    print 'ta=', ta
    print 'tb=', tb
    print
    return 0
Ejemplo n.º 7
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 = map(lambda x: len(x), 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
Ejemplo n.º 8
0
def test_tensordot():
    # LOAD MPS
    fname = './mps.h5'
    mps, qnum = mps_io.loadMPS(fname)
    lmps = [mps, qnum]
    bdim = map(lambda x: len(x), qnum)
    print ' bdim = ', bdim
    for item in mps:
        print item.shape
    for item in qnum:
        print item
    nsite = len(mps)
    print nsite
    qphys = mpo_dmrg_qphys.initSpatialOrb(nsite, 2)
    print qphys
    print len(qnum)
    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)
        site = mps[isite]
        print
        print 'isite=', isite
        #print len(ql),len(qn),len(qr)
        #print 'cl',cl
        #print 'cn',cn
        #print 'cr',cr
        tmps = qtensor.qtensor([False, False, True])
        tmps.fromDenseTensor(site, [ql, qn, qr])
        tsite = tmps.toDenseTensor()
        diffDense = numpy.linalg.norm(tsite - site)
        print ' diffDense=', diffDense
        assert diffDense < 1.e-12
        ##
        ## test-1
        ##
        #print site.shape
        #t0 = time.time()
        #tmp = numpy.tensordot(site,site,axes=([0,1],[0,1]))
        ##tmp1 = numpy.einsum('ijk,lmn',site,site)
        ##print 'outer=',numpy.linalg.norm(tmp-tmp1)
        #t1 = time.time()
        #print 'norm=',numpy.linalg.norm(tmp),'t1-t0=',t1-t0
        #t1 = time.time()
        #tmp2 = qtensor.tensordot(tmps,tmps,axes=([0,1],[0,1]),debug=False)
        #t2 = time.time()
        #print 'norm=',numpy.linalg.norm(tmp2.value),'t2-t1=',t2-t1
        #print 'ratio=',(t2-t1)/(t1-t0)
        #ta += t1-t0
        #tb += t2-t1
        ## compare
        #tmp3 = tmp2.toDenseTensor()
        #diffDense2 = numpy.linalg.norm(tmp-tmp3)
        #print ' diffDense2=',diffDense2
        #assert diffDense2<1.e-12
        #
        # test-2: full contraction
        #
        print 'full contraction:', site.shape
        t0 = time.time()
        tmp = numpy.tensordot(site, site, axes=([0, 1, 2], [0, 1, 2]))
        t1 = time.time()
        print 'norm=', numpy.linalg.norm(tmp), 't1-t0=', t1 - t0
        t1 = time.time()
        tmp2 = qtensor.tensordot(tmps,
                                 tmps,
                                 axes=([0, 1, 2], [0, 1, 2]),
                                 debug=False)
        t2 = time.time()
        print 'norm=', numpy.linalg.norm(tmp2), 't2-t1=', t2 - t1
        print 'ratio=', (t2 - t1) / (t1 - t0)
        ta += t1 - t0
        tb += t2 - t1
        # compare
        diff = numpy.linalg.norm(tmp - tmp2)
        print ' diff=', diff
        assert diff < 1.e-10
    print
    print 'ta=', ta
    print 'tb=', tb
    print
    return 0