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───
''',
    )
Beispiel #5
0
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───
''',
    )