def test_unroll_circuit_op_deep(): q0, q1, q2 = cirq.LineQubit.range(3) c = cirq.Circuit( cirq.X(q0), cirq.CircuitOperation( cirq.FrozenCircuit( cirq.X(q1), cirq.CircuitOperation(cirq.FrozenCircuit(cirq.X(q2))))), ) expected = cirq.Circuit(cirq.X.on_each(q0, q1, q2)) cirq.testing.assert_same_circuits( cirq.unroll_circuit_op(c, tags_to_check=None, deep=True), expected) expected = cirq.Circuit( cirq.X.on_each(q0, q1), cirq.CircuitOperation(cirq.FrozenCircuit(cirq.X(q2)))) cirq.testing.assert_same_circuits( cirq.unroll_circuit_op(c, tags_to_check=None, deep=False), expected)
def test_unroll_circuit_op_and_variants(): q = cirq.LineQubit.range(2) c = cirq.Circuit(cirq.X(q[0]), cirq.CNOT(q[0], q[1]), cirq.X(q[0])) cirq.testing.assert_has_diagram( c, ''' 0: ───X───@───X─── │ 1: ───────X─────── ''', ) mapped_circuit = cirq.map_operations( c, lambda op, i: [cirq.Z(q[1])] * 2 if op.gate == cirq.CNOT else op) mapped_circuit_deep = cirq.Circuit( [ cirq.Moment(cirq.CircuitOperation(cirq.FrozenCircuit(m))) for m in mapped_circuit[:-1] ], mapped_circuit[-1], ) for unroller in [ cirq.unroll_circuit_op_greedy_earliest, cirq.unroll_circuit_op_greedy_frontier, cirq.unroll_circuit_op, ]: cirq.testing.assert_same_circuits( unroller(mapped_circuit), unroller(mapped_circuit_deep, tags_to_check=None, deep=True)) cirq.testing.assert_has_diagram( cirq.unroll_circuit_op(mapped_circuit), ''' 0: ───X───────────X─── 1: ───────Z───Z─────── ''', ) cirq.testing.assert_has_diagram( cirq.unroll_circuit_op_greedy_earliest(mapped_circuit), ''' 0: ───X───────X─── 1: ───Z───Z─────── ''', ) cirq.testing.assert_has_diagram( cirq.unroll_circuit_op_greedy_frontier(mapped_circuit), ''' 0: ───X───────X─── 1: ───────Z───Z─── ''', )
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_map_operations_deep_subcircuits(): q = cirq.LineQubit.range(5) c_orig = cirq.Circuit( cirq.CX(q[0], q[1]), cirq.CX(q[3], q[2]), cirq.CX(q[3], q[4]), ) c_orig_with_circuit_ops = cirq.Circuit( cirq.CircuitOperation( cirq.FrozenCircuit([ cirq.CircuitOperation(cirq.FrozenCircuit(op)) for op in c_orig.all_operations() ]))) def map_func(op: cirq.Operation, _: int) -> cirq.OP_TREE: yield [ cirq.Z.on_each(*op.qubits), cirq.CX(*op.qubits), cirq.Z.on_each(*op.qubits), ] if op.gate == cirq.CX else op c_mapped = cirq.map_operations(c_orig_with_circuit_ops, map_func, deep=True) c_mapped = cirq.unroll_circuit_op(c_mapped, deep=True, tags_to_check=None) cirq.testing.assert_has_diagram( c_mapped, ''' 0: ───Z───@───Z─────────────── │ 1: ───Z───X───Z─────────────── 2: ───Z───X───Z─────────────── │ 3: ───Z───@───Z───Z───@───Z─── │ 4: ───────────────Z───X───Z─── ''', )
def test_unroll_circuit_op_and_variants(): q = cirq.LineQubit.range(2) c = cirq.Circuit(cirq.X(q[0]), cirq.CNOT(q[0], q[1]), cirq.X(q[0])) cirq.testing.assert_has_diagram( c, ''' 0: ───X───@───X─── │ 1: ───────X─────── ''', ) mapped_circuit = cirq.map_operations( c, lambda op, i: [cirq.Z(q[1])] * 2 if op.gate == cirq.CNOT else op) cirq.testing.assert_has_diagram( cirq.unroll_circuit_op(mapped_circuit), ''' 0: ───X───────────X─── 1: ───────Z───Z─────── ''', ) cirq.testing.assert_has_diagram( cirq.unroll_circuit_op_greedy_earliest(mapped_circuit), ''' 0: ───X───────X─── 1: ───Z───Z─────── ''', ) cirq.testing.assert_has_diagram( cirq.unroll_circuit_op_greedy_frontier(mapped_circuit), ''' 0: ───X───────X─── 1: ───────Z───Z─── ''', )