예제 #1
0
 def fx(xdata, mps, rfun, args=None, dtype=numpy.complex_):
     nsite = mps.nsite
     sites1 = mps.torank2()
     ydata = numpy.zeros(xdata.shape, dtype=dtype)
     for i, x in enumerate(xdata):
         sites2 = []
         for isite in range(nsite):
             if args is None:
                 ntmp = rfun(x)
             else:
                 occ = [args[2 * isite], args[2 * isite + 1]]
                 ntmp = rfun(x, occ)
             if isite == 0:
                 #tmp = numpy.einsum('ij,ja->ia',ntmp,sites1[isite])
                 tmp = numpy.dot(ntmp, sites1[isite])
             elif isite == nsite - 1:
                 #tmp = numpy.einsum('ij,aj->ai',ntmp,sites1[isite])
                 tmp = numpy.dot(sites1[isite], ntmp.T)
             else:
                 #tmp = numpy.einsum('ij,ajb->aib',ntmp,sites1[isite])
                 # ajb,ij->abi
                 tmp = numpy.tensordot(sites1[isite],
                                       ntmp,
                                       axes=([1], [1]))
                 # abi->aib
                 tmp = tmp.transpose(0, 2, 1).copy()
             sites2.append(tmp)
         ydata[i] = mpslib.mps_dot(sites1, sites2)
     return ydata
예제 #2
0
def makeRDM1(mps):
    nb = len(mps)
    rdm1 = numpy.zeros((nb, nb))
    for i in range(nb):
        for j in range(nb):
            print 'rdm[i,j] (i,j)=', i, j
            ci = mpo_r1(nb, i, 1)
            aj = mpo_r1(nb, j, 0)
            Aij = mpo_r1mul(ci, aj)
            op = class_mpo(nb)
            op.fromRank1(Aij)
            rdm1[i, j] = mpslib.mps_dot(mps, op.dot(mps))
    print 'Hermicity=', numpy.linalg.norm(rdm1 - rdm1.T)
    return rdm1
예제 #3
0
 def fx(x, mps, refdet, n):
     global icounter
     icounter += 1
     nsite = len(refdet)
     sites1 = mps.torank2()
     sites2 = []
     for isite in range(nsite):
         if refdet[isite] == 0:
             ntmp = numpy.array([[1., 0.], [0., cmath.exp(1.j * x)]])
         else:
             ntmp = numpy.array([[cmath.exp(1.j * x), 0.], [0., 1.]])
         if isite == 0:
             tmp = numpy.einsum('ij,ja->ia', ntmp, sites1[isite])
         elif isite == nsite - 1:
             tmp = numpy.einsum('ij,aj->ai', ntmp, sites1[isite])
         else:
             tmp = numpy.einsum('ij,ajb->aib', ntmp, sites1[isite])
         sites2.append(tmp)
     val = mpslib.mps_dot(sites1, sites2)
     val = val * cmath.exp(-1.j * n * x) / (2.0 * numpy.pi)
     val = val.real
     return val
예제 #4
0
 def makeRDM1q(self):
     mps = self.torank2()
     nb = len(mps)
     rdm1 = numpy.zeros((4, nb, nb))
     types = [[1, 0], [1, 1], [0, 1], [0, 0]]
     for i in range(nb):
         for j in range(nb):
             print 'rdm[i,j] (i,j)=', i, j
             for ijtp in range(4):
                 itp, jtp = types[ijtp]
                 ci = mpo_class.mpo_r1(nb, i, itp)
                 cj = mpo_class.mpo_r1(nb, j, jtp)
                 Aij = mpo_class.mpo_r1mul(ci, cj)
                 op = mpo_class.class_mpo(nb)
                 op.fromRank1(Aij)
                 rdm1[ijtp, i, j] = mpslib.mps_dot(mps, op.dot(mps))
     rdm1q = numpy.zeros((2 * nb, 2 * nb))
     rdm1q[:nb, :nb] = rdm1[0]
     rdm1q[:nb, nb:] = rdm1[1]
     rdm1q[nb:, :nb] = rdm1[2]
     rdm1q[nb:, nb:] = rdm1[3]
     print 'Hermicity=', numpy.linalg.norm(rdm1q - rdm1q.T)
     return rdm1q
예제 #5
0
 def fx(xdata, mps, refdet):
     global icounter
     icounter += 1
     nsite = len(refdet)
     sites1 = mps.torank2()
     ydata = numpy.zeros(xdata.shape, dtype=numpy.complex_)
     for i, x in enumerate(xdata):
         sites2 = []
         for isite in range(nsite):
             if refdet[isite] == 0:
                 ntmp = numpy.array([[1., 0.], [0.,
                                                cmath.exp(1.j * x)]])
             else:
                 ntmp = numpy.array([[cmath.exp(1.j * x), 0.], [0.,
                                                                1.]])
             if isite == 0:
                 tmp = numpy.einsum('ij,ja->ia', ntmp, sites1[isite])
             elif isite == nsite - 1:
                 tmp = numpy.einsum('ij,aj->ai', ntmp, sites1[isite])
             else:
                 tmp = numpy.einsum('ij,ajb->aib', ntmp, sites1[isite])
             sites2.append(tmp)
         ydata[i] = mpslib.mps_dot(sites1, sites2) / (2.0 * numpy.pi)
     return ydata
예제 #6
0
 def dot(self, other):
     mps1 = self.torank2()
     mps2 = other.torank2()
     return mpslib.mps_dot(mps1, mps2)
예제 #7
0
def testDet(nb=12, nelec=6):
    import jacobi
    print '\n[testDet]'
    # Init
    numpy.random.seed(2)
    h = numpy.random.uniform(-1, 1, nb * nb)
    h = h.reshape(nb, nb)
    h = 0.5 * (h + h.T)
    e1, v1, givens = jacobi.jacobi(h, ifswap=False)
    vmat1 = v1[:, :nelec].copy()
    mps = detToMPS(vmat1)
    bdim0 = mpslib.mps_bdim(mps)
    rdm1 = makeRDM1(mps)
    diff = numpy.linalg.norm(rdm1 - vmat1.dot(vmat1.T))
    print 'RDMdiff=', diff
    if diff > 1.e-10: exit()
    #-----------------------------------------------------#
    # Try to convert MPS(in AO basis) to MPS(in MO basis) #
    # by applying the unitary transformation gates.       #
    #-----------------------------------------------------#
    ngivens = len(givens)
    mps1 = copy.deepcopy(mps)
    for idx, rot in enumerate(givens):
        k, l, arg = rot
        if abs(arg) < 1.e-10: continue
        print '>>> idx=', idx, '/', ngivens, ' arg=', arg, math.cos(
            arg), math.sin(arg)
        umpo = genU1mpo(nb, k, l, -arg)
        mps1 = copy.deepcopy(umpo.dot(mps1))
        print 'mps.bdim = ', mpslib.mps_bdim(mps1)
        mpslib.mps_compress(mps1)
    # Print
    bdim0 = mpslib.mps_bdim(mps)
    bdim1 = mpslib.mps_bdim(mps1)
    print 'bdim0', bdim0
    print 'bdim1', bdim1
    # Comparison
    dmps = mpslib.detmps(nb, nelec)
    rr = mpslib.mps_diff(dmps, mps1, iprt=1)
    print 'diff=', rr
    nmpo = occmpo(nb)
    nelec1 = mpslib.mps_dot(dmps, nmpo.dot(dmps))
    nelec2 = mpslib.mps_dot(mps1, nmpo.dot(mps1))
    print 'Check nelec:'
    print 'nelec =', nelec
    print 'nelec1=', nelec1
    print 'nelec2=', nelec2
    #
    # bdim0 [2, 4, 8, 16, 32, 64, 128, 256, 128, 64, 32, 16, 8, 4, 2]
    # bdim1 [2, 3, 3, 3, 3, 3, 4, 4, 4, 3, 2, 2, 2, 1, 1]
    # [mps_diff]
    # rr=0.00000e+00
    # pp=1.00000
    # pq=1.00000
    # qp=1.00000
    # qq=1.00000
    # diff= 0.0
    # Check nelec:
    # nelec = 8
    # nelec1= 8.0
    # nelec2= 8.00000000001
    #
    return 0