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
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)
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, _)
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