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 })
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
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
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, )
def test_circular_shift_gate_repr(): g = CircularShiftGate(2) assert repr(g) == 'CircularShiftGate'
def test_circular_shift_gate_eq(): a = CircularShiftGate(1) b = CircularShiftGate(1) c = CircularShiftGate(2) assert a == b assert a != c
def test_circular_shift_gate_unknown_qubit_count(): g = CircularShiftGate(2) assert cirq.circuit_diagram_info(g, default=None) is None
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
def test_circular_shift_gate_unknown_qubit_count(): g = CircularShiftGate(2) args = cirq.TextDiagramInfoArgs.UNINFORMED_DEFAULT assert g.text_diagram_info(args) == NotImplemented
def test_circular_shift_gate_unknown_qubit_count(): g = CircularShiftGate(2) args = cirq.TextDiagramInfoArgs.UNINFORMED_DEFAULT assert g.text_diagram_info(args) == NotImplemented