示例#1
0
文件: tmps.py 项目: gharib85/py-tmps
 def evolve(self):
     """
         Perform a Trotterized time evolution step by tau. Compress after each dot product or after each sweep
         through the chain. Renormalizes state after one full timestep due to compression.
     :return:
     """
     overlap = self.base_overlap
     last_start_at = self.system_index
     if not self.canonicalize_every_step:
         canonicalize_to(self.psi_t, to_cform=self.to_cform)
     for (start_at, trotter_mpo) in self.propagator.trotter_steps:
         self.psi_t = mp.partialdot(trotter_mpo,
                                    self.psi_t,
                                    start_at=start_at,
                                    axes=self.axes)
         if self.full_compression:
             if start_at == self.propagator.L - 2 or start_at == 0:
                 # Compress after a full sweep
                 if start_at != last_start_at:
                     overlap *= self.psi_t.compress(
                         **self.state_compression_kwargs)
         else:
             if len(trotter_mpo) > 1:
                 self.lc.compress(self.psi_t, start_at)
     if self.final_compression:
         overlap *= self.psi_t.compress(**self.state_compression_kwargs)
     else:
         if not self.canonicalize_every_step:
             canonicalize_to(self.psi_t, to_cform=self.to_cform)
     self._normalize_state()
     self.cumulative_overlap *= overlap
     self.last_overlap = overlap
     self.trotter_error += self.propagator.step_trotter_error
     self.stepno += 1
示例#2
0
文件: iht.py 项目: dsuess/pycsalgs
    def stepsize(A, g, X):
        # its actually not a projection, but it works surprisingly
        proj = mp.MPArray(
            [_local_contraction(l)[None, ..., None] for l in X.lt[:-1]])
        g = mp.partialdot(proj, g, start_at=0)
        g.compress(**compargs)

        return stepfun(A, g, None)
示例#3
0
文件: iht.py 项目: dsuess/pycsalgs
    def stepsize(A, g, X):
        X.normalize(left=len(X) - 1)

        # get the left-eigenvectors
        Us, _ = X.split(len(X) - 2)
        Us = Us.reshape([s + (1, ) for s in Us.pdims[:-1]] + [Us.pdims[-1]])
        proj = mp.dot(Us.conj(), Us, axes=(1, 1))
        g = mp.partialdot(proj, g, start_at=0)
        g.compress(**compargs)

        return stepfun(A, g, _)
示例#4
0
 def evolve(self):
     """
         Perform a Trotterized time evolution step by tau. Compress after each dot product or after each sweep
         through the chain. Renormalize state after one full timestep due to compression.
     :return:
     """
     overlap = self.base_overlap
     last_start_at = self.system_index
     if not self.canonicalize_every_step:
         canonicalize_to(self.psi_t, to_cform=self.to_cform)
     for (start_at, trotter_mpo) in self.propagator.trotter_steps:
         self.psi_t = mp.partialdot(trotter_mpo,
                                    self.psi_t,
                                    start_at=start_at,
                                    axes=self.axes)
         if self.full_compression:
             if (start_at == self.propagator.L - 2
                     or start_at == 0) and start_at != last_start_at:
                 # Compress after a full sweep
                 overlap *= self.psi_t.compress(
                     **self.state_compression_kwargs)
         else:
             if len(trotter_mpo) > 1:
                 self.lc.compress(self.psi_t, start_at)
         if (start_at == self.propagator.L - 2
                 or start_at == 0) and start_at != last_start_at:
             self.pmps_compression_step += 1
             if self.pmps_compression_step - 1 == self.compress_sites_step:
                 compress_pmps_sites(self.psi_t,
                                     relerr=self.compress_sites_relerr,
                                     rank=self.compress_sites_rank,
                                     stable=self.compress_sites_stable,
                                     to_cform=self.to_cform)
                 self.pmps_compression_step = 1
         last_start_at = start_at
     if self.final_compression:
         overlap *= self.psi_t.compress(**self.state_compression_kwargs)
     else:
         if not self.canonicalize_every_step:
             canonicalize_to(self.psi_t, to_cform=self.to_cform)
     self._normalize_state()
     self.cumulative_overlap *= overlap
     self.last_overlap = overlap
     if self.system_index == 0:
         # reset by one, because next propagation step starts at the edge of chain and increments counter immediately
         self.pmps_compression_step -= 1
     self.trotter_error += self.propagator.step_trotter_error
     self.stepno += 1