def evolution_pepo_real_time(g: float, dt: float, bc: str, dtype: np.dtype, lx: Optional[int] = None, ly: Optional[int] = None) -> Operator: # PEPO for U(dt) ~ U_vert(dt/2) U_bond(dt) U_vert(dt/2) # # half bond operators: # # | | | | # U_bond = A -- A # | | | | # # expm(-i H_bond dt) = expm(-i (-XX) dt) = expm(i dt XX) = cos(dt) + i sin(dt) XX = A_0 A_0 + A_1 A_1 # with A_0 = (cos(dt) ** 0.5) * 1 , A_1 = (i sin(dt)) ** 0.5 * X # A & B legs: (p,p*,k) A = np.zeros([2, 2, 2], dtype=dtype) # u_hb(p,p*,a) # A[:,:,0] = (np.cos(dt)) ** 0.5 * s0 # A[:,:,1] = (1.j * np.sin(dt)) ** 0.5 * sx A = index_update(A, index[:, :, 0], (np.cos(dt))**0.5 * s0) A = index_update(A, index[:, :, 1], (1.j * np.sin(dt))**0.5 * sx) # expm(- i H_vert dt/2) = expm(- i(-gZ) dt/2) = expm(i/2 g dt Z) u_vert = np.asarray(expm(.5j * g * dt * sz), dtype=dtype) return _build_evolution_pepo(u_vert, A, bc, lx, ly)
def evolution_pepo_imag_time(g: float, dt: float, bc: str, dtype: np.dtype, lx: Optional[int] = None, ly: Optional[int] = None) -> Operator: # PEPO for U(dt) ~ U_vert(dt/2) U_bond(dt) U_vert(dt/2) # # half bond operators: # # | | | | # U_bond = A -- A # | | | | # # expm(- H_bond dt) = expm(- (-XX) dt) = expm(dt XX) = cosh(dt) + sinh(dt) XX = A_0 A_0 + A_1 A_1 # with A_0 = (cosh(dt) ** 0.5) * 1 , A_1 = (sinh(dt) ** 0.5) * X # A & B legs: (p,p*,k) A = np.empty([2, 2, 2], dtype=dtype) A = index_update(A, index[:, :, 0], (np.cosh(dt)**0.5) * s0) A = index_update(A, index[:, :, 1], (np.sinh(dt)**0.5) * sx) # expm(- H_vert dt/2) = expm(- (-gZ) dt/2) = expm(g dt/2 Z) u_vert = np.asarray(expm(g * (dt / 2) * sz), dtype=dtype) return _build_evolution_pepo(u_vert, A, bc, lx, ly)
def goalFun(x): p = x.reshape(p0.shape) * env goal1 = costf(p) pNew = p[:, :, None, None] H = np.sum(H0 + pNew * Hcs, axis=0) U = np.array([expm(-1j * Ht * dt) for Ht in H]) goal0 = gradFun(H, U) goal1 *= costWeight if goal0 / saver.goal0 < 0.5: saver.save(goal0, goal1, p) return goal0 + goal1
def backward(self, scope: Scope, y: Array): kernel, bias = self.params(scope, y.shape[-1]) return jnp.dot(y - bias, expm(-kernel))
def forward(self, scope: Scope, x: Array): kernel, bias = self.params(scope, x.shape[-1]) return jnp.dot(x, expm(kernel)) + bias
def get_u_site(g: float, dt: float, dtype: np.dtype, real_time: bool): if real_time: return np.asarray(expm(1j * g * dt * sz), dtype=dtype) else: np.asarray(expm(g * dt * sz), dtype=dtype)
def metric_expm(H, softabs_const=1e0): temp = sla.expm(softabs_const * H) + sla.expm(-softabs_const * H) return sla.cholesky(temp)
def gate(self, params): a, b = self.process(self.extract(params)) alpha = a + b * 1j astar = alpha.conjugate() return expm(alpha * self.cr - astar * self.an)
def koopman_sim(params, x0): # x(t) = decode(exp(A * t) encode(x0)) A, encoder_params, decoder_params = params z0 = encoder.apply(encoder_params, jnp.expand_dims(x0, 0))[0, :] return decoder.apply(decoder_params, vmap(lambda t: expm(t * A) @ z0)(sim_timesteps))