def test_remove_redundant_acquaintance_opportunities(): a, b, c, d, e = cirq.LineQubit.range(5) swap = cca.SwapPermutationGate() ops = [cca.acquaint(a, b), cca.acquaint(a, b)] strategy = cirq.Circuit(ops) diagram_before = """ 0: ───█───█─── │ │ 1: ───█───█─── """ ct.assert_has_diagram(strategy, diagram_before) cca.remove_redundant_acquaintance_opportunities(strategy) diagram_after = """ 0: ───█─────── │ 1: ───█─────── """ ct.assert_has_diagram(strategy, diagram_after) ops = [ cca.acquaint(a, b), cca.acquaint(c, d), swap(d, e), swap(c, d), cca.acquaint(d, e) ] strategy = cirq.Circuit(ops) diagram_before = """ 0: ───█─────────────────── │ 1: ───█─────────────────── 2: ───█─────────0↦1─────── │ │ 3: ───█───0↦1───1↦0───█─── │ │ 4: ───────1↦0─────────█─── """ ct.assert_has_diagram(strategy, diagram_before) cca.remove_redundant_acquaintance_opportunities(strategy) diagram_after = """ 0: ───█─────────────────── │ 1: ───█─────────────────── 2: ───█─────────0↦1─────── │ │ 3: ───█───0↦1───1↦0─────── │ 4: ───────1↦0───────────── """ ct.assert_has_diagram(strategy, diagram_after)
def test_get_acquaintance_size(): qubits = cirq.LineQubit.range(8) op = OtherOperation(qubits) assert op.with_qubits(qubits) == op assert cca.get_acquaintance_size(op) == 0 for s, _ in enumerate(qubits): op = cca.acquaint(*qubits[:s + 1]) assert cca.get_acquaintance_size(op) == s + 1 part_lens = (2, 2, 2, 2) acquaintance_size = 3 gate = cca.SwapNetworkGate(part_lens, acquaintance_size) op = gate(*qubits[:sum(part_lens)]) assert cca.get_acquaintance_size(op) == 3 part_lens = (2, 2, 2, 2) acquaintance_size = 4 gate = cca.SwapNetworkGate(part_lens, acquaintance_size) op = gate(*qubits[:sum(part_lens)]) assert cca.get_acquaintance_size(op) == 0 part_lens = (2, 2, 2, 2) acquaintance_size = 1 gate = cca.SwapNetworkGate(part_lens, acquaintance_size) op = gate(*qubits[:sum(part_lens)]) assert cca.get_acquaintance_size(op) == 0 part_lens = (2, 2, 2, 2) acquaintance_size = 1 gate = cca.SwapNetworkGate(part_lens, acquaintance_size) op = gate(*qubits[:sum(part_lens)]) assert cca.get_acquaintance_size(op) == 0
def test_rectification(): qubits = cirq.LineQubit.range(4) with pytest.raises(TypeError): cca.rectify_acquaintance_strategy(cirq.Circuit()) perm_gate = cca.SwapPermutationGate() operations = [ perm_gate(*qubits[:2]), cca.acquaint(*qubits[2:]), cca.acquaint(*qubits[:2]), perm_gate(*qubits[2:]), ] strategy = cirq.Circuit(operations, device=cca.UnconstrainedAcquaintanceDevice) cca.rectify_acquaintance_strategy(strategy) actual_text_diagram = strategy.to_text_diagram().strip() expected_text_diagram = """ 0: ───────0↦1─────────█─── │ │ 1: ───────1↦0─────────█─── 2: ───█─────────0↦1─────── │ │ 3: ───█─────────1↦0─────── """.strip() assert actual_text_diagram == expected_text_diagram strategy = cirq.Circuit(operations, device=cca.UnconstrainedAcquaintanceDevice) cca.rectify_acquaintance_strategy(strategy, False) actual_text_diagram = strategy.to_text_diagram() expected_text_diagram = """ 0: ───0↦1───────█───────── │ │ 1: ───1↦0───────█───────── 2: ─────────█───────0↦1─── │ │ 3: ─────────█───────1↦0─── """.strip() assert actual_text_diagram == expected_text_diagram
def test_acquaintance_device(): with pytest.raises(ValueError): op = cirq.X(cirq.NamedQubit('q')) cca.UnconstrainedAcquaintanceDevice.validate_operation(op) qubits = cirq.LineQubit.range(4) swap_network = cca.SwapNetworkGate((1, 2, 1)) cca.UnconstrainedAcquaintanceDevice.validate_operation( cca.acquaint(*qubits[:2])) cca.UnconstrainedAcquaintanceDevice.validate_operation( swap_network(*qubits))
def test_acquaintance_gate_text_diagram_info(): qubits = [cirq.NamedQubit(s) for s in 'xyz'] circuit = cirq.Circuit([cirq.Moment([cca.acquaint(*qubits)])]) actual_text_diagram = circuit.to_text_diagram().strip() expected_text_diagram = """ x: ───█─── │ y: ───█─── │ z: ───█─── """.strip() assert actual_text_diagram == expected_text_diagram
def test_remove_redundant_acquaintance_opportunities(): device = cca.UnconstrainedAcquaintanceDevice a, b, c, d, e = cirq.LineQubit.range(5) swap = cca.SwapPermutationGate() with pytest.raises(TypeError): ops = [cca.acquaint(a, b)] strategy = cirq.Circuit.from_ops(ops) cca.remove_redundant_acquaintance_opportunities(strategy) ops = [cca.acquaint(a, b), cca.acquaint(a, b)] strategy = cirq.Circuit.from_ops(ops, device=device) diagram_before = """ 0: ───█───█─── │ │ 1: ───█───█─── """ ct.assert_has_diagram(strategy, diagram_before) cca.remove_redundant_acquaintance_opportunities(strategy) cca.remove_redundant_acquaintance_opportunities(strategy) diagram_after = """ 0: ───█─────── │ 1: ───█─────── """ ct.assert_has_diagram(strategy, diagram_after) ops = [ cca.acquaint(a, b), cca.acquaint(c, d), swap(d, e), swap(c, d), cca.acquaint(d, e) ] strategy = cirq.Circuit.from_ops(ops, device=device) diagram_before = """ 0: ───█─────────────────── │ 1: ───█─────────────────── 2: ───█─────────0↦1─────── │ │ 3: ───█───0↦1───1↦0───█─── │ │ 4: ───────1↦0─────────█─── """ ct.assert_has_diagram(strategy, diagram_before) cca.remove_redundant_acquaintance_opportunities(strategy) diagram_after = """ 0: ───█─────────────────── │ 1: ───█─────────────────── 2: ───█─────────0↦1─────── │ │ 3: ───█───0↦1───1↦0─────── │ 4: ───────1↦0───────────── """ ct.assert_has_diagram(strategy, diagram_after)