def iter(self):
'''
The Lanczos iteration.
'''
while len(self.candidates)>0:
v=self.candidates.pop(0)
norm=nl.norm(v)
if norm>self.dtol:
break
elif self.niter>=self.nc:
self.deflations.append(self.niter-self.nc)
else:
self.stop=True
if not self.stop:
self.vectors[self.niter]=v/norm
if self.niter-self.nc-1>=0:
self._T_[self.niter,self.niter-self.nc-1]=norm
else:
self.P[self.niter,self.niter-self.nc-1+self.nv0]=norm
for k,vc in enumerate(self.candidates):
overlap=np.vdot(self.vectors[self.niter],vc)
if k+self.niter>=self.nc:
self._T_[self.niter,k+self.niter-self.nc]=overlap
else:
self.P[self.niter,self.niter-self.nc+k+self.nv0]=overlap
vc-=overlap*self.vectors[self.niter]
v=self.matrix.dot(self.vectors[self.niter])
for k in xrange(max(self.niter-self.nc-1,0),self.niter):
self._T_[k,self.niter]=np.conjugate(self._T_[self.niter,k])
v-=self._T_[k,self.niter]*self.vectors[k]
for k in it.chain(self.deflations,[self.niter]):
overlap=np.vdot(self.vectors[k],v)
if k in set(self.deflations)|{self.niter}:
self._T_[k,self.niter]=overlap
self._T_[self.niter,k]=np.conjugate(overlap)
v-=overlap*self.vectors[k]
self.candidates.append(v)
if not self.keepstate and self.niter>=self.nc and self.niter-self.nc not in self.deflations: self.vectors[self.niter-self.nc]=None
self.niter+=1
评论列表
文章目录