예제 #1
0
파일: shift_test.py 프로젝트: xcgfth/Cirq
def test_circular_shift_gate_permutation():
    assert (CircularShiftGate(4).permutation(3) == {0: 2, 1: 0, 2: 1})
    assert (CircularShiftGate(0).permutation(4) == {0: 0, 1: 1, 2: 2, 3: 3})

    assert (CircularShiftGate(2).permutation(5) == {
        0: 3,
        1: 4,
        2: 0,
        3: 1,
        4: 2
    })
예제 #2
0
파일: shift_test.py 프로젝트: xcgfth/Cirq
def test_circular_shift_gate_decomposition():
    qubits = [cirq.NamedQubit(q) for q in 'abcdef']

    expander = cirq.ExpandComposite()
    circular_shift = CircularShiftGate(1, cirq.CZ)(*qubits[:2])
    circuit = cirq.Circuit.from_ops(circular_shift)
    expander.optimize_circuit(circuit)
    expected_circuit = cirq.Circuit((cirq.Moment((cirq.CZ(*qubits[:2]), )), ))
    assert circuit == expected_circuit

    no_decomp = lambda op: (isinstance(op, cirq.GateOperation) and op.gate ==
                            cirq.SWAP)
    expander = cirq.ExpandComposite(no_decomp=no_decomp)

    circular_shift = CircularShiftGate(3)(*qubits)
    circuit = cirq.Circuit.from_ops(circular_shift)
    expander.optimize_circuit(circuit)
    actual_text_diagram = circuit.to_text_diagram().strip()
    expected_text_diagram = """
a: ───────────×───────────
              │
b: ───────×───×───×───────
          │       │
c: ───×───×───×───×───×───
      │       │       │
d: ───×───×───×───×───×───
          │       │
e: ───────×───×───×───────
              │
f: ───────────×───────────
    """.strip()
    assert actual_text_diagram == expected_text_diagram

    circular_shift = CircularShiftGate(2)(*qubits)
    circuit = cirq.Circuit.from_ops(circular_shift)
    expander.optimize_circuit(circuit)
    actual_text_diagram = circuit.to_text_diagram().strip()
    expected_text_diagram = """
a: ───────×───────────────
          │
b: ───×───×───×───────────
      │       │
c: ───×───×───×───×───────
          │       │
d: ───────×───×───×───×───
              │       │
e: ───────────×───×───×───
                  │
f: ───────────────×───────
    """.strip()
    assert actual_text_diagram == expected_text_diagram
예제 #3
0
파일: shift_test.py 프로젝트: xcgfth/Cirq
def test_circular_shift_gate_wire_symbols():
    qubits = [cirq.NamedQubit(q) for q in 'xyz']
    circuit = cirq.Circuit.from_ops(CircularShiftGate(2)(*qubits))
    actual_text_diagram = circuit.to_text_diagram().strip()
    expected_text_diagram = """
x: ───╲0╱───
      │
y: ───╲1╱───
      │
z: ───╱2╲───
    """.strip()
    assert actual_text_diagram == expected_text_diagram

    actual_text_diagram = circuit.to_text_diagram(use_unicode_characters=False)
    expected_text_diagram = r"""
x: ---\0/---
      |
y: ---\1/---
      |
z: ---/2\---
    """.strip()
    assert actual_text_diagram.strip() == expected_text_diagram
예제 #4
0
def acquaint_and_shift(
    parts: Tuple[List['cirq.Qid'], List['cirq.Qid']],
    layers: Layers,
    acquaintance_size: Optional[int],
    swap_gate: 'cirq.Gate',
    mapping: Dict[ops.Qid, int],
):
    """Acquaints and shifts a pair of lists of qubits. The first part is
    acquainted with every qubit individually in the second part, and vice
    versa. Operations are grouped into several layers:
        * prior_interstitial: The first layer of acquaintance gates.
        * prior: The combination of acquaintance gates and swaps that acquaints
            the inner halves.
        * intra: The shift gate.
        * post: The combination of acquaintance gates and swaps that acquaints
            the outer halves.
        * posterior_interstitial: The last layer of acquaintance gates.

    Args:
        parts: The two lists of qubits to acquaint.
        layers: The layers to put gates into.
        acquaintance_size: The number of qubits to acquaint at a time. If None,
            after each pair of parts is shifted the union thereof is
            acquainted.
        swap_gate: The gate used to swap logical indices.
        mapping: The mapping from qubits to logical indices. Used to keep track
            of the effect of inside-acquainting swaps.
    """
    left_part, right_part = parts
    left_size, right_size = len(left_part), len(right_part)
    assert not (set(left_part) & set(right_part))
    qubits = left_part + right_part
    shift = CircularShiftGate(len(qubits), left_size, swap_gate=swap_gate)(*qubits)
    if acquaintance_size is None:
        layers.intra.append(shift)
        layers.post.append(acquaint(*qubits))
        shift.gate.update_mapping(mapping, qubits)
    elif max(left_size, right_size) != acquaintance_size - 1:
        layers.intra.append(shift)
        shift.gate.update_mapping(mapping, qubits)
    elif acquaintance_size == 2:
        layers.prior_interstitial.append(acquaint(*qubits))
        layers.intra.append(shift)
        shift.gate.update_mapping(mapping, qubits)
    else:
        # before
        if left_size == acquaintance_size - 1:
            # right part
            pre_acquaintance_gate = acquaint(*qubits[:acquaintance_size])
            acquaint_insides(
                swap_gate=swap_gate,
                acquaintance_gate=pre_acquaintance_gate,
                qubits=right_part,
                before=True,
                layers=layers,
                mapping=mapping,
            )

        if right_size == acquaintance_size - 1:
            # left part
            pre_acquaintance_gate = acquaint(*qubits[-acquaintance_size:])
            acquaint_insides(
                swap_gate=swap_gate,
                acquaintance_gate=pre_acquaintance_gate,
                qubits=left_part[::-1],
                before=True,
                layers=layers,
                mapping=mapping,
            )

        layers.intra.append(shift)
        shift.gate.update_mapping(mapping, qubits)

        # after
        if (left_size == acquaintance_size - 1) and (right_size > 1):
            # right part
            post_acquaintance_gate = acquaint(*qubits[-acquaintance_size:])

            new_left_part = qubits[right_size - 1 :: -1]
            acquaint_insides(
                swap_gate=swap_gate,
                acquaintance_gate=post_acquaintance_gate,
                qubits=new_left_part,
                before=False,
                layers=layers,
                mapping=mapping,
            )

        if (right_size == acquaintance_size - 1) and (left_size > 1):
            # left part

            post_acquaintance_gate = acquaint(*qubits[:acquaintance_size])
            acquaint_insides(
                swap_gate=swap_gate,
                acquaintance_gate=post_acquaintance_gate,
                qubits=qubits[right_size:],
                before=False,
                layers=layers,
                mapping=mapping,
            )
예제 #5
0
파일: shift_test.py 프로젝트: xcgfth/Cirq
def test_circular_shift_gate_repr():
    g = CircularShiftGate(2)
    assert repr(g) == 'CircularShiftGate'
예제 #6
0
파일: shift_test.py 프로젝트: xcgfth/Cirq
def test_circular_shift_gate_eq():
    a = CircularShiftGate(1)
    b = CircularShiftGate(1)
    c = CircularShiftGate(2)
    assert a == b
    assert a != c
예제 #7
0
파일: shift_test.py 프로젝트: xcgfth/Cirq
def test_circular_shift_gate_unknown_qubit_count():
    g = CircularShiftGate(2)
    assert cirq.circuit_diagram_info(g, default=None) is None
예제 #8
0
파일: shift_test.py 프로젝트: xcgfth/Cirq
def test_circular_shift_gate_init():
    g = CircularShiftGate(2)
    assert g.shift == 2

    g = CircularShiftGate(1, swap_gate=cirq.CZ)
    assert g.swap_gate == cirq.CZ
예제 #9
0
def test_circular_shift_gate_unknown_qubit_count():
    g = CircularShiftGate(2)
    args = cirq.TextDiagramInfoArgs.UNINFORMED_DEFAULT
    assert g.text_diagram_info(args) == NotImplemented
예제 #10
0
def test_circular_shift_gate_unknown_qubit_count():
    g = CircularShiftGate(2)
    args = cirq.TextDiagramInfoArgs.UNINFORMED_DEFAULT
    assert g.text_diagram_info(args) == NotImplemented