Пример #1
0
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)
Пример #2
0
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)
Пример #3
0
 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
Пример #4
0
 def backward(self, scope: Scope, y: Array):
     kernel, bias = self.params(scope, y.shape[-1])
     return jnp.dot(y - bias, expm(-kernel))
Пример #5
0
 def forward(self, scope: Scope, x: Array):
     kernel, bias = self.params(scope, x.shape[-1])
     return jnp.dot(x, expm(kernel)) + bias
Пример #6
0
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)
Пример #7
0
def metric_expm(H, softabs_const=1e0):
    temp = sla.expm(softabs_const * H) + sla.expm(-softabs_const * H)
    return sla.cholesky(temp)
Пример #8
0
 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)
Пример #9
0
 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))