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, )
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)
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',)) )
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'), ), )