def sweep_fidelity2(kets,maxN=30,usvmode=False): ''' Sweep fidelity from center to edge. Parameters: :kets: len-2 list, the kets to sweep fidelity. :maxN: int, the maximum retained singular value for usv mode, and the maximum retained states for direct mode. :usvmode: bool, use usv mode if True. ''' nsite=kets[0].nsite bra=kets[0].tobra(labels=[kets[0].labels[0],kets[0].labels[1]+'\'']) ket=kets[1] dl=maxN*ones(nsite+1,dtype='int32') if not usvmode: #compress datas ket.compress(maxN=maxN) bra.compress(maxN=maxN) ket>>(nsite/2-ket.l,1e-8,Inf) bra>>(nsite/2-bra.l,1e-8,Inf) rlink_axis=kets[0].rlink_axis edge_labels_l=[bra.AL[-1].labels[rlink_axis],ket.AL[-1].labels[rlink_axis]] llink_axis=kets[0].llink_axis bra.BL[0].labels[llink_axis]+='@' ket.BL[0].labels[llink_axis]+='@' edge_labels_r=[bra.BL[0].labels[llink_axis],ket.BL[0].labels[llink_axis]] if usvmode: Ci=USVobj(U=tensor.Tensor(diag(bra.S)[:,newaxis,:],labels=[edge_labels_l[0],'null',edge_labels_r[0]]),S=None,\ V=tensor.Tensor(diag(ket.S)[:,newaxis,:],labels=[edge_labels_l[1],'null',edge_labels_r[1]])) else: Ci=tensor.Tensor(diag(bra.S),labels=[edge_labels_l[0],edge_labels_r[0]])*tensor.Tensor(diag(ket.S),labels=[edge_labels_l[1],edge_labels_r[1]]) fs=[1] SL=[] for i in xrange(ket.nsite/2): t0=time.time() site_l=nsite/2-i-1 site_r=nsite/2+i if usvmode: t0=time.time() Li=USVobj(U=bra.get(site_l,attach_S='B'),S=None,V=ket.get(site_l,attach_S='B')) Ci=Li.join(Ci) print Ci Ci=Ci.compress(min(dl[2*i+1],min(Ci.shape))) Ri=USVobj(U=bra.get(site_r,attach_S='A'),S=None,V=ket.get(site_r,attach_S='A')) Ci=Ci.join(Ri) print Ci t1=time.time() Ci=Ci.compress(min(dl[2*i+2],min(Ci.shape))) t2=time.time() print 'Elapse -> %s, %s'%(t1-t0,t2-t1) fi=sum(Ci.S) print Ci,Ci.S.min() SL.append(Ci.S) else: t0=time.time() Ci=bra.get(site_l,attach_S='B')*(ket.get(site_l,attach_S='B')*Ci)*bra.get(site_r,attach_S='A')*ket.get(site_r,attach_S='A') #Ci=tensor.contract(mpses) t1=time.time() Ci=Ci.chorder(array([0,2,1,3])) S=svdvals(Ci.reshape([Ci.shape[0]*Ci.shape[1],-1])) t2=time.time() print 'Elapse -> %s, %s'%(t1-t0,t2-t1) fi=sum(S) SL.append(S) fs.append(fi) t1=time.time() print '%s F->%s, Elapse->%s'%(i,fi,t1-t0) save('data/SL.npy',SL) return fs
def sweep_fidelity_f(kets,spaceconfig,maxN=None,usvmode=False): ''' Sweep fidelity from center to edge, the version with fermionic sign. Parameters: :kets: len-2 list, the kets to sweep fidelity. :maxN: int, the maximum retained singular value for usv mode, and the maximum retained states for direct mode. :usvmode: bool, use usv mode if True. ''' nsite=kets[0].nsite bra=kets[0].tobra(labels=[kets[0].labels[0],kets[0].labels[1]+'\'']) ket=kets[1] ordering=kets[0].forder assert(allclose(ordering,arange(nsite)[::-1])) if not usvmode and maxN is not None: #compress datas ket.compress(maxN=maxN) bra.compress(maxN=maxN) ket>>(nsite/2-ket.l,1e-8,Inf) bra>>(nsite/2-bra.l,1e-8,Inf) ket_bra=bra.toket() bra_ket=ket.tobra() #get SRLS(sign for right part) from right to left site_axis=ket.site_axis rlink_axis=ket.rlink_axis llink_axis=ket.llink_axis op=prod([opunit_Z(spaceconfig,siteindex=j) for j in xrange(nsite/2,nsite)]) #op=prod([OpUnitI(hndim=spaceconfig.hndim,siteindex=j) for j in xrange(nsite/2,nsite)]) SRLS=[] for kt,br in [(ket,bra_ket),(ket_bra,bra)]: if br is bra: kt.chlabel('site',br.labels[0]+'2') kt.chlabel('link',br.labels[1]+'2') else: br.chlabel('site',kt.labels[0]+'2') br.chlabel('link',kt.labels[1]+'2') SRL=[] res=None for i in xrange(nsite/2): sitei=nsite-i-1 M=kt.get(sitei,attach_S='A') MH=br.get(sitei,attach_S='A') if i==0: MH.labels[rlink_axis]=M.labels[rlink_axis] opunit=op if isinstance(op,OpUnit) else op.query(sitei)[0] MH.labels[site_axis]=M.labels[site_axis]+'\'' O=tensor.Tensor(opunit.get_data(),labels=[MH.labels[site_axis],M.labels[site_axis]]) items=[MH,O,M] for item in items: res=tensor.contract(res,item) if res is not None else item SRL.append(res.diagonal()) assert(sum(abs(res))-sum(abs(res.diagonal()))<1e-5) SRLS.append(SRL) SRLS=zip(SRLS) #calculation edge_labels_l=[bra.AL[-1].labels[rlink_axis],ket.AL[-1].labels[rlink_axis]] bra.BL[0].labels[llink_axis]+='@' ket.BL[0].labels[llink_axis]+='@' edge_labels_r=[bra.BL[0].labels[llink_axis],ket.BL[0].labels[llink_axis]] if usvmode: Ci=USVobj(U=tensor.Tensor(diag(bra.S)[:,newaxis,:],labels=[edge_labels_l[0],'null',edge_labels_r[0]]),S=None,\ V=tensor.Tensor(diag(ket.S)[:,newaxis,:],labels=[edge_labels_l[1],'null',edge_labels_r[1]])) else: Ci=tensor.Tensor(diag(bra.S),labels=[edge_labels_l[0],edge_labels_r[0]])*tensor.Tensor(diag(ket.S),labels=[edge_labels_l[1],edge_labels_r[1]]) fs=[1] SL=[] for i in xrange(ket.nsite/2): t0=time.time() site_l=nsite/2-i-1 site_r=nsite/2+i if usvmode: t0=time.time() Li=USVobj(U=bra.get(site_l,attach_S='B'),S=None,V=ket.get(site_l,attach_S='B')) Ci=Li.join(Ci) print Ci Ci=Ci.compress(min(maxN,min(Ci.shape))) Ri=USVobj(U=bra.get(site_r,attach_S='A'),S=None,V=ket.get(site_r,attach_S='A')) Ci=Ci.join(Ri) print Ci t1=time.time() Ci=Ci.compress(min(maxN,min(Ci.shape))) t2=time.time() print 'Elapse -> %s, %s'%(t1-t0,t2-t1) fi=sum(Ci.S) print Ci,Ci.S.min() SL.append(Ci.S) else: #get the sign SK,SB=SRLS[nsite/2-i-1] pdb.set_trace() Ci=bra.get(site_l,attach_S='B')*(ket.get(site_l,attach_S='B')*Ci)*bra.get(site_r,attach_S='A')*ket.get(site_r,attach_S='A') pdb.set_trace() #Ci=tensor.contract(mpses) Ci=Ci.chorder(array([0,2,1,3])) S=svdvals(Ci.reshape([Ci.shape[0]*Ci.shape[1],-1])) fi=sum(S) SL.append(S) fs.append(fi) t1=time.time() print '%s F->%s, Elapse->%s'%(i,fi,t1-t0) save('data/SL.npy',SL) return fs