Beispiel #1
0
def test_sympy_control():
    q0, q1 = cirq.LineQubit.range(2)
    circuit = cirq.Circuit(
        cirq.measure(q0, q1, key='a'),
        cirq.X(q1).with_classical_controls(sympy.Symbol('a')))
    with pytest.raises(ValueError, match='Only KeyConditions are allowed'):
        _ = cirq.defer_measurements(circuit)
def test_diagram():
    q0, q1, q2, q3 = cirq.LineQubit.range(4)
    circuit = cirq.Circuit(
        cirq.measure(q0, q2, key='a'),
        cirq.measure(q1, q3, key='b'),
        cirq.X(q0),
        cirq.measure(q0, q1, q2, q3, key='c'),
    )
    deferred = cirq.defer_measurements(circuit)
    cirq.testing.assert_has_diagram(
        deferred,
        """
                ┌────┐
0: ──────────────@───────X────────M('c')───
                 │                │
1: ──────────────┼─@──────────────M────────
                 │ │              │
2: ──────────────┼@┼──────────────M────────
                 │││              │
3: ──────────────┼┼┼@─────────────M────────
                 ││││
M('a', q=0): ────X┼┼┼────M('a')────────────
                  │││    │
M('a', q=2): ─────X┼┼────M─────────────────
                   ││
M('b', q=1): ──────X┼────M('b')────────────
                    │    │
M('b', q=3): ───────X────M─────────────────
                └────┘
""",
        use_unicode_characters=True,
    )
Beispiel #3
0
def test_multi_qubit_control():
    q0, q1 = cirq.LineQubit.range(2)
    circuit = cirq.Circuit(cirq.measure(q0, q1, key='a'),
                           cirq.X(q1).with_classical_controls('a'))
    with pytest.raises(ValueError,
                       match='Only single qubit conditions are allowed'):
        _ = cirq.defer_measurements(circuit)
def test_nocompile_context():
    q0, q1 = cirq.LineQubit.range(2)
    circuit = cirq.Circuit(
        cirq.measure(q0, key='a').with_tags('nocompile'),
        cirq.X(q1).with_classical_controls('a').with_tags('nocompile'),
        cirq.measure(q1, key='b'),
    )
    deferred = cirq.defer_measurements(
        circuit,
        context=cirq.TransformerContext(tags_to_ignore=('nocompile', )))
    cirq.testing.assert_same_circuits(deferred, circuit)
Beispiel #5
0
def test_nocompile_context_leaves_invalid_circuit():
    q0, q1 = cirq.LineQubit.range(2)
    circuit = cirq.Circuit(
        cirq.measure(q0, key='a').with_tags('nocompile'),
        cirq.X(q1).with_classical_controls('a'),
        cirq.measure(q1, key='b'),
    )
    with pytest.raises(ValueError, match='Deferred measurement for key=a not found'):
        _ = cirq.defer_measurements(
            circuit, context=cirq.TransformerContext(tags_to_ignore=('nocompile',))
        )
Beispiel #6
0
def test_confusion_map():
    q0, q1 = cirq.LineQubit.range(2)
    circuit = cirq.Circuit(
        cirq.measure(q0,
                     q1,
                     key='a',
                     confusion_map={(0, ): np.array([[0.9, 0.1], [0.1,
                                                                  0.9]])}),
        cirq.X(q1).with_classical_controls('a'),
    )
    with pytest.raises(
            NotImplementedError,
            match='Deferring confused measurement is not implemented'):
        _ = cirq.defer_measurements(circuit)
def assert_equivalent_to_deferred(circuit: cirq.Circuit):
    qubits = list(circuit.all_qubits())
    sim = cirq.Simulator()
    num_qubits = len(qubits)
    for i in range(2**num_qubits):
        bits = cirq.big_endian_int_to_bits(i, bit_count=num_qubits)
        modified = cirq.Circuit()
        for j in range(num_qubits):
            if bits[j]:
                modified.append(cirq.X(qubits[j]))
        modified.append(circuit)
        deferred = cirq.defer_measurements(modified)
        result = sim.simulate(modified)
        result1 = sim.simulate(deferred)
        np.testing.assert_equal(result.measurements, result1.measurements)
def test_basic():
    q0, q1 = cirq.LineQubit.range(2)
    circuit = cirq.Circuit(
        cirq.measure(q0, key='a'),
        cirq.X(q1).with_classical_controls('a'),
        cirq.measure(q1, key='b'),
    )
    assert_equivalent_to_deferred(circuit)
    deferred = cirq.defer_measurements(circuit)
    q_ma = _MeasurementQid('a', q0)
    cirq.testing.assert_same_circuits(
        deferred,
        cirq.Circuit(
            cirq.CX(q0, q_ma),
            cirq.CX(q_ma, q1),
            cirq.measure(q_ma, key='a'),
            cirq.measure(q1, key='b'),
        ),
    )
def test_pauli():
    q0, q1 = cirq.LineQubit.range(2)
    circuit = cirq.Circuit(
        cirq.PauliMeasurementGate(cirq.DensePauliString('Y'), key='a').on(q0),
        cirq.X(q1).with_classical_controls('a'),
        cirq.measure(q1, key='b'),
    )
    deferred = cirq.defer_measurements(circuit)
    q_ma = _MeasurementQid('a', q0)
    cirq.testing.assert_same_circuits(
        cirq.unroll_circuit_op(deferred),
        cirq.Circuit(
            cirq.SingleQubitCliffordGate.X_sqrt(q0),
            cirq.CX(q0, q_ma),
            (cirq.SingleQubitCliffordGate.X_sqrt(q0)**-1),
            cirq.Moment(cirq.CX(q_ma, q1)),
            cirq.measure(q_ma, key='a'),
            cirq.measure(q1, key='b'),
        ),
    )
def test_subcircuit():
    q0, q1 = cirq.LineQubit.range(2)
    circuit = cirq.Circuit(
        cirq.CircuitOperation(
            cirq.FrozenCircuit(
                cirq.measure(q0, key='a'),
                cirq.X(q1).with_classical_controls('a'),
                cirq.measure(q1, key='b'),
            )))
    assert_equivalent_to_deferred(circuit)
    deferred = cirq.defer_measurements(circuit)
    q_m = _MeasurementQid('a', q0)
    cirq.testing.assert_same_circuits(
        deferred,
        cirq.Circuit(
            cirq.CX(q0, q_m),
            cirq.CX(q_m, q1),
            cirq.measure(q_m, key='a'),
            cirq.measure(q1, key='b'),
        ),
    )
def test_multi_qubit_measurements():
    q0, q1 = cirq.LineQubit.range(2)
    circuit = cirq.Circuit(
        cirq.measure(q0, q1, key='a'),
        cirq.X(q0),
        cirq.measure(q0, key='b'),
        cirq.measure(q1, key='c'),
    )
    assert_equivalent_to_deferred(circuit)
    deferred = cirq.defer_measurements(circuit)
    q_ma0 = _MeasurementQid('a', q0)
    q_ma1 = _MeasurementQid('a', q1)
    cirq.testing.assert_same_circuits(
        deferred,
        cirq.Circuit(
            cirq.CX(q0, q_ma0),
            cirq.CX(q1, q_ma1),
            cirq.X(q0),
            cirq.measure(q_ma0, q_ma1, key='a'),
            cirq.measure(q0, key='b'),
            cirq.measure(q1, key='c'),
        ),
    )