Example #1
0
def test_kak_decomposition_eq():
    eq = cirq.testing.EqualsTester()

    eq.make_equality_group(lambda: cirq.KakDecomposition(
        global_phase=1,
        single_qubit_operations_before=(cirq.unitary(cirq.X),
                                        cirq.unitary(cirq.Y)),
        interaction_coefficients=(0.3, 0.2, 0.1),
        single_qubit_operations_after=(np.eye(2), cirq.unitary(cirq.Z)),
    ))

    eq.add_equality_group(cirq.KakDecomposition(
        global_phase=-1,
        single_qubit_operations_before=(cirq.unitary(cirq.X),
                                        cirq.unitary(cirq.Y)),
        interaction_coefficients=(0.3, 0.2, 0.1),
        single_qubit_operations_after=(np.eye(2), cirq.unitary(cirq.Z)),
    ))

    eq.make_equality_group(lambda: cirq.KakDecomposition(
        global_phase=1,
        single_qubit_operations_before=(cirq.unitary(cirq.X),
                                        cirq.unitary(cirq.H)),
        interaction_coefficients=(0.3, 0.2, 0.1),
        single_qubit_operations_after=(np.eye(2), cirq.unitary(cirq.Z)),
    ))

    eq.make_equality_group(lambda: cirq.KakDecomposition(
        global_phase=1,
        single_qubit_operations_before=(cirq.unitary(cirq.X),
                                        cirq.unitary(cirq.Y)),
        interaction_coefficients=(0.5, 0.2, 0.1),
        single_qubit_operations_after=(np.eye(2), cirq.unitary(cirq.Z)),
    ))
Example #2
0
def test_kak_repr():
    cirq.testing.assert_equivalent_repr(
        cirq.KakDecomposition(
            global_phase=1j,
            single_qubit_operations_before=(cirq.unitary(cirq.X),
                                            cirq.unitary(cirq.Y)),
            interaction_coefficients=(0.3, 0.2, 0.1),
            single_qubit_operations_after=(np.eye(2), cirq.unitary(cirq.Z)),
        ))

    assert repr(
        cirq.KakDecomposition(
            global_phase=1,
            single_qubit_operations_before=(cirq.unitary(cirq.X),
                                            cirq.unitary(cirq.Y)),
            interaction_coefficients=(0.5, 0.25, 0),
            single_qubit_operations_after=(np.eye(2), cirq.unitary(cirq.Z)),
        )) == """
cirq.KakDecomposition(
    interaction_coefficients=(0.5, 0.25, 0),
    single_qubit_operations_before=(
        np.array([[0j, (1+0j)], [(1+0j), 0j]], dtype=np.complex128),
        np.array([[0j, -1j], [1j, 0j]], dtype=np.complex128),
    ),
    single_qubit_operations_after=(
        np.array([[1.0, 0.0], [0.0, 1.0]], dtype=np.float64),
        np.array([[(1+0j), 0j], [0j, (-1+0j)]], dtype=np.complex128),
    ),
    global_phase=1)
""".strip()
def test_kak_canonicalize_vector(x, y, z):
    i = np.eye(2)
    m = cirq.unitary(
        cirq.KakDecomposition(
            global_phase=1,
            single_qubit_operations_after=(i, i),
            interaction_coefficients=(x, y, z),
            single_qubit_operations_before=(i, i),
        ))

    kak = cirq.kak_canonicalize_vector(x, y, z, atol=1e-10)
    a1, a0 = kak.single_qubit_operations_after
    x2, y2, z2 = kak.interaction_coefficients
    b1, b0 = kak.single_qubit_operations_before
    m2 = cirq.unitary(kak)

    assert 0.0 <= x2 <= np.pi / 4
    assert 0.0 <= y2 <= np.pi / 4
    assert -np.pi / 4 < z2 <= np.pi / 4
    assert abs(x2) >= abs(y2) >= abs(z2)
    assert x2 < np.pi / 4 - 1e-10 or z2 >= 0
    assert cirq.is_special_unitary(a1)
    assert cirq.is_special_unitary(a0)
    assert cirq.is_special_unitary(b1)
    assert cirq.is_special_unitary(b0)
    assert np.allclose(m, m2)
Example #4
0
def test_kak_str():
    v = cirq.KakDecomposition(
        interaction_coefficients=(0.3 * np.pi / 4, 0.2 * np.pi / 4,
                                  0.1 * np.pi / 4),
        single_qubit_operations_before=(cirq.unitary(cirq.I),
                                        cirq.unitary(cirq.X)),
        single_qubit_operations_after=(cirq.unitary(cirq.Y),
                                       cirq.unitary(cirq.Z)),
        global_phase=1j)
    assert str(v) == """KAK {
def random_locals(x, y, z, seed=None):
    rng = np.random.RandomState(seed)
    a0 = cirq.testing.random_unitary(2, random_state=rng)
    a1 = cirq.testing.random_unitary(2, random_state=rng)
    b0 = cirq.testing.random_unitary(2, random_state=rng)
    b1 = cirq.testing.random_unitary(2, random_state=rng)
    return cirq.unitary(
        cirq.KakDecomposition(
            interaction_coefficients=(x, y, z),
            single_qubit_operations_before=(a0, a1),
            single_qubit_operations_after=(b0, b1),
        ))
def test_kak_str():
    v = cirq.KakDecomposition(
        interaction_coefficients=(0.3 * np.pi / 4, 0.2 * np.pi / 4,
                                  0.1 * np.pi / 4),
        single_qubit_operations_before=(cirq.unitary(cirq.I),
                                        cirq.unitary(cirq.X)),
        single_qubit_operations_after=(cirq.unitary(cirq.Y),
                                       cirq.unitary(cirq.Z)),
        global_phase=1j,
    )
    assert (str(v) == """KAK {
    xyz*(4/π): 0.3, 0.2, 0.1
    before: (0*π around X) ⊗ (1*π around X)
    after: (1*π around Y) ⊗ (1*π around Z)
}""")
Example #7
0
def test_kak_vector_on_weyl_chamber_face():
    # unitaries with KAK vectors from I to ISWAP
    theta_swap = np.linspace(0, np.pi / 4, 10)
    k_vecs = np.zeros((10, 3))
    k_vecs[:, (0, 1)] = theta_swap[:, np.newaxis]

    kwargs = dict(global_phase=1j,
                  single_qubit_operations_before=(X, Y),
                  single_qubit_operations_after=(Z, 1j * X))
    unitaries = np.array([
        cirq.unitary(
            cirq.KakDecomposition(interaction_coefficients=(t, t, 0),
                                  **kwargs)) for t in theta_swap
    ])

    actual = cirq.kak_vector(unitaries)
    np.testing.assert_almost_equal(actual, k_vecs)
Example #8
0
def perturbations_unitary(u, amount=1e-10):
    """Returns several unitaries in the neighborhood of u to test for numerical
    corner cases near critical values."""
    kak = cirq.kak_decomposition(u)
    yield u
    for i in range(3):
        for neg in (-1, 1):
            perturb_xyz = list(kak.interaction_coefficients)
            perturb_xyz[i] += neg * amount
            yield cirq.unitary(
                cirq.KakDecomposition(
                    global_phase=kak.global_phase,
                    single_qubit_operations_before=kak.single_qubit_operations_before,
                    single_qubit_operations_after=kak.single_qubit_operations_after,
                    interaction_coefficients=tuple(perturb_xyz),
                )
            )
def perturbations_weyl(x, y, z, amount=1e-10):
    return perturbations_gate(
        cirq.KakDecomposition(interaction_coefficients=(x, y, z), ),
        amount,
    )