Пример #1
0
def test_convert_to_ion_circuit():
    q0 = cirq.LineQubit(0)
    q1 = cirq.LineQubit(1)
    us = cirq.Duration(nanos=1000)
    ion_device = cirq.IonDevice(us, us, us, [q0, q1])

    clifford_circuit_1 = cirq.Circuit()
    clifford_circuit_1.append(
        [cirq.X(q0), cirq.H(q1),
         cirq.MS(np.pi / 4).on(q0, q1)])
    ion_circuit_1 = cirq.ion.ConvertToIonGates().convert_circuit(
        clifford_circuit_1)

    ion_device.validate_circuit(ion_circuit_1)
    cirq.testing.assert_circuits_with_terminal_measurements_are_equivalent(
        clifford_circuit_1, ion_circuit_1, atol=1e-6)
    clifford_circuit_2 = cirq.Circuit()
    clifford_circuit_2.append(
        [cirq.X(q0),
         cirq.CNOT(q1, q0),
         cirq.MS(np.pi / 4).on(q0, q1)])
    ion_circuit_2 = cirq.ion.ConvertToIonGates().convert_circuit(
        clifford_circuit_2)
    ion_device.validate_circuit(ion_circuit_2)
    cirq.testing.assert_circuits_with_terminal_measurements_are_equivalent(
        clifford_circuit_2, ion_circuit_2, atol=1e-6)
Пример #2
0
def test_MS_matrix():
    s = np.sqrt(0.5)
    np.testing.assert_allclose(cirq.unitary(cirq.MS(np.pi / 4)),
                               np.array([[s, 0, 0,
                                          -1j * s], [0, s, -1j * s, 0],
                                         [0, -1j * s, s, 0],
                                         [-1j * s, 0, 0, s]]),
                               atol=1e-8)
    np.testing.assert_allclose(cirq.unitary(cirq.MS(np.pi)),
                               np.diag([-1, -1, -1, -1]),
                               atol=1e-8)
Пример #3
0
def test_MS_diagrams():
    a = cirq.NamedQubit('a')
    b = cirq.NamedQubit('b')
    circuit = cirq.Circuit(cirq.SWAP(a, b), cirq.X(a), cirq.Y(a),
                           cirq.MS(np.pi).on(a, b))
    cirq.testing.assert_has_diagram(circuit, """
a: ───×───X───Y───MS(π)───
      │           │
b: ───×───────────MS(π)───
""")
Пример #4
0
def test_convert_to_ion_circuit():
    q0 = cirq.GridQubit(0, 0)
    q1 = cirq.GridQubit(0, 1)

    clifford_circuit_1 = cirq.Circuit()
    clifford_circuit_1.append(
        [cirq.X(q0), cirq.H(q1),
         cirq.MS(np.pi / 4).on(q0, q1)])
    ion_circuit_1 = cirq.ion.ConvertToIonGates().\
        convert_circuit(clifford_circuit_1)
    clifford_circuit_2 = cirq.Circuit()
    clifford_circuit_2.append(
        [cirq.X(q0),
         cirq.CNOT(q1, q0),
         cirq.MS(np.pi / 4).on(q0, q1)])
    ion_circuit_2 = cirq.ion.ConvertToIonGates().\
        convert_circuit(clifford_circuit_2)

    cirq.testing.assert_has_diagram(ion_circuit_1,
                                    """
(0, 0): ───X───────────────────MS(0.25π)───
                               │
(0, 1): ───Rx(π)───Ry(-0.5π)───MS(0.25π)───
    """,
                                    use_unicode_characters=True)

    cirq.testing.assert_has_diagram(ion_circuit_2,
                                    """
(0, 0): ───X──────────MS(0.25π)───Rx(-0.5π)───────────────MS(0.25π)───
                      │                                   │
(0, 1): ───Ry(0.5π)───MS(0.25π)───Rx(-0.5π)───Ry(-0.5π)───MS(0.25π)───
        """,
                                    use_unicode_characters=True)

    assert_ops_implement_unitary(q0, q1, ion_circuit_1,
                                 cirq.unitary(clifford_circuit_1))
    assert_ops_implement_unitary(q0, q1, ion_circuit_2,
                                 cirq.unitary(clifford_circuit_2))
Пример #5
0
def test_convert_to_ion_gates():
    q0 = cirq.GridQubit(0, 0)
    q1 = cirq.GridQubit(0, 1)
    op = cirq.CNOT(q0, q1)
    circuit = cirq.Circuit()

    with pytest.raises(TypeError):
        cirq.ion.ConvertToIonGates().convert_one(circuit)

    with pytest.raises(TypeError):
        cirq.ion.ConvertToIonGates().convert_one(NoUnitary().on(q0))

    no_unitary_op = NoUnitary().on(q0)
    assert cirq.ion.ConvertToIonGates(
        ignore_failures=True).convert_one(no_unitary_op) == [no_unitary_op]

    rx = cirq.ion.ConvertToIonGates().convert_one(OtherX().on(q0))
    rop = cirq.ion.ConvertToIonGates().convert_one(op)
    rcnot = cirq.ion.ConvertToIonGates().convert_one(OtherCNOT().on(q0, q1))
    assert rx == [
        cirq.PhasedXPowGate(phase_exponent=1).on(cirq.GridQubit(0, 0))
    ]
    assert rop == [
        cirq.Ry(np.pi / 2).on(op.qubits[0]),
        cirq.ion.MS(np.pi / 4).on(op.qubits[0], op.qubits[1]),
        cirq.ops.Rx(-1 * np.pi / 2).on(op.qubits[0]),
        cirq.ops.Rx(-1 * np.pi / 2).on(op.qubits[1]),
        cirq.ops.Ry(-1 * np.pi / 2).on(op.qubits[0])
    ]
    assert rcnot == [
        cirq.PhasedXPowGate(phase_exponent=-0.75,
                            exponent=0.5).on(cirq.GridQubit(0, 0)),
        cirq.PhasedXPowGate(phase_exponent=1,
                            exponent=0.25).on(cirq.GridQubit(0, 1)),
        cirq.T.on(cirq.GridQubit(0, 0)),
        cirq.MS(-0.5 * np.pi / 2).on(cirq.GridQubit(0,
                                                    0), cirq.GridQubit(0, 1)),
        (cirq.Y**0.5).on(cirq.GridQubit(0, 0)),
        cirq.PhasedXPowGate(phase_exponent=1,
                            exponent=0.25).on(cirq.GridQubit(0, 1)),
        (cirq.Z**-0.75).on(cirq.GridQubit(0, 0))
    ]
Пример #6
0
def test_MS_repr():
    assert repr(cirq.MS(np.pi / 2)) == 'cirq.MS(np.pi/2)'
    assert repr(cirq.MS(np.pi / 4)) == 'cirq.MS(0.5*np.pi/2)'
    cirq.testing.assert_equivalent_repr(cirq.MS(np.pi / 4))
Пример #7
0
def test_MS_str():
    assert str(cirq.MS(np.pi / 2)) == 'MS(π/2)'
    assert str(cirq.MS(np.pi)) == 'MS(2.0π/2)'
Пример #8
0
def test_MS_arguments():
    eq_tester = cirq.testing.EqualsTester()
    eq_tester.add_equality_group(cirq.MS(np.pi / 2),
                                 cirq.XXPowGate(global_shift=-0.5))
Пример #9
0
def assert_ms_depth_below(operations, threshold):
    total_ms = 0

    for op in operations:
        assert len(op.qubits) <= 2
        if len(op.qubits) == 2:
            assert isinstance(op, cirq.GateOperation)
            assert isinstance(op.gate, cirq.XXPowGate)
            total_ms += abs(op.gate.exponent)
    assert total_ms <= threshold


@pytest.mark.parametrize('max_ms_depth,effect', [
    (0, np.eye(4)),
    (0, np.array([[0, 0, 0, 1], [0, 0, 1, 0], [0, 1, 0, 0], [1, 0, 0, 0j]])),
    (1, cirq.unitary(cirq.MS(np.pi / 4))),
    (0, cirq.unitary(cirq.CZ**0.00000001)),
    (0.5, cirq.unitary(cirq.CZ**0.5)),
    (1, cirq.unitary(cirq.CZ)),
    (1, cirq.unitary(cirq.CNOT)),
    (1, np.array([
        [1, 0, 0, 1j],
        [0, 1, 1j, 0],
        [0, 1j, 1, 0],
        [1j, 0, 0, 1],
    ]) * np.sqrt(0.5)),
    (1,
     np.array([
         [1, 0, 0, -1j],
         [0, 1, -1j, 0],
         [0, -1j, 1, 0],
Пример #10
0
def test_deprecated_ms(rads):
    assert np.all(cirq.unitary(cirq.ms(rads)) == cirq.unitary(cirq.MS(rads)))
Пример #11
0
def test_deprecated_ms(rads):
    with capture_logging():
        assert np.all(
            cirq.unitary(cirq.ms(rads)) == cirq.unitary(cirq.MS(rads)))