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
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
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
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
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
def dot(self, other): mps1 = self.torank2() mps2 = other.torank2() return mpslib.mps_dot(mps1, mps2)
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