Skip to content

Commit 89f88b0

Browse files
Remove use of .device in contrib. (#4821)
Another sub-component for #4744 . This removes the use of `circuit.device` from all contrib modules. BREAKING_CHANGE=removing the `device` property from the `SwapNetwork` class. It also removes some type checking done by the code (all logic in the bulk still works), which makes it more forgiving. With the amount of meaningful maintenance contrib has had (not much), I'm not a huge fan of going through a deprecation process for these mild behavior widenings with no API changes. Are others alright with this ?
1 parent 0a12c88 commit 89f88b0

18 files changed

+21
-83
lines changed

cirq-core/cirq/contrib/acquaintance/devices.py

-6
Original file line numberDiff line numberDiff line change
@@ -41,15 +41,9 @@ def validate_operation(self, operation: 'cirq.Operation') -> None:
4141
)
4242

4343

44-
def is_acquaintance_strategy(circuit: 'cirq.Circuit') -> bool:
45-
return isinstance(circuit._device, AcquaintanceDevice)
46-
47-
4844
def get_acquaintance_size(obj: Union[circuits.Circuit, ops.Operation]) -> int:
4945
"""The maximum number of qubits to be acquainted with each other."""
5046
if isinstance(obj, circuits.Circuit):
51-
if not is_acquaintance_strategy(obj):
52-
raise TypeError('not is_acquaintance_strategy(circuit)')
5347
return max(tuple(get_acquaintance_size(op) for op in obj.all_operations()) or (0,))
5448
if not isinstance(obj, ops.Operation):
5549
raise TypeError('not isinstance(obj, (Circuit, Operation))')

cirq-core/cirq/contrib/acquaintance/devices_test.py

-11
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,3 @@ def test_acquaintance_device():
2828
swap_network = cca.SwapNetworkGate((1, 2, 1))
2929
cca.UnconstrainedAcquaintanceDevice.validate_operation(cca.acquaint(*qubits[:2]))
3030
cca.UnconstrainedAcquaintanceDevice.validate_operation(swap_network(*qubits))
31-
32-
33-
def test_get_acquaintance_size():
34-
with pytest.raises(TypeError):
35-
cca.get_acquaintance_size(cirq.Circuit())
36-
37-
with pytest.raises(TypeError):
38-
cca.get_acquaintance_size(3)
39-
40-
circuit = cirq.Circuit(device=cca.UnconstrainedAcquaintanceDevice)
41-
cca.get_acquaintance_size(circuit)

cirq-core/cirq/contrib/acquaintance/executor.py

-4
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
from cirq import circuits, devices, ops, protocols
2121

2222
from cirq.contrib.acquaintance.gates import AcquaintanceOpportunityGate
23-
from cirq.contrib.acquaintance.devices import is_acquaintance_strategy
2423
from cirq.contrib.acquaintance.permutation import (
2524
PermutationGate,
2625
LogicalIndex,
@@ -74,10 +73,7 @@ def __init__(self, execution_strategy: ExecutionStrategy) -> None:
7473
self.mapping = execution_strategy.initial_mapping.copy()
7574

7675
def __call__(self, strategy: 'cirq.Circuit'):
77-
if not is_acquaintance_strategy(strategy):
78-
raise TypeError('not is_acquaintance_strategy(strategy)')
7976
expose_acquaintance_gates(strategy)
80-
strategy.device = self.execution_strategy.device
8177
super().optimize_circuit(strategy)
8278
return self.mapping.copy()
8379

cirq-core/cirq/contrib/acquaintance/executor_test.py

-3
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,6 @@ def test_executor_explicit():
5454
bad_gates = {(0,): ExampleGate(['0']), (0, 1): ExampleGate(['0', '1'])}
5555
cca.GreedyExecutionStrategy(bad_gates, initial_mapping)
5656

57-
with pytest.raises(TypeError):
58-
executor(cirq.Circuit())
59-
6057
with pytest.raises(TypeError):
6158
bad_strategy = cirq.Circuit(cirq.X(qubits[0]))
6259
executor(bad_strategy)

cirq-core/cirq/contrib/acquaintance/gates_test.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ def test_acquaint_part_pairs(part_lens):
135135
n_qubits += part_len
136136
qubits = cirq.LineQubit.range(n_qubits)
137137
swap_network_op = cca.SwapNetworkGate(part_lens, acquaintance_size=None)(*qubits)
138-
swap_network = cirq.Circuit(swap_network_op, device=cca.UnconstrainedAcquaintanceDevice)
138+
swap_network = cirq.Circuit(swap_network_op)
139139
initial_mapping = {q: i for i, q in enumerate(qubits)}
140140

141141
actual_opps = cca.get_logical_acquaintance_opportunities(swap_network, initial_mapping)

cirq-core/cirq/contrib/acquaintance/inspection_utils.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ def get_acquaintance_dag(strategy: 'cirq.Circuit', initial_mapping: LogicalMappi
5959
for op in moment.operations
6060
if isinstance(op, AcquaintanceOperation)
6161
)
62-
return circuits.CircuitDag.from_ops(acquaintance_ops, device=strategy.device)
62+
return circuits.CircuitDag.from_ops(acquaintance_ops)
6363

6464

6565
def get_logical_acquaintance_opportunities(

cirq-core/cirq/contrib/acquaintance/mutation_utils.py

+1-9
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
from cirq import circuits, ops, optimizers
2020

2121
from cirq.contrib.acquaintance.gates import SwapNetworkGate, AcquaintanceOpportunityGate
22-
from cirq.contrib.acquaintance.devices import is_acquaintance_strategy, get_acquaintance_size
22+
from cirq.contrib.acquaintance.devices import get_acquaintance_size
2323
from cirq.contrib.acquaintance.permutation import PermutationGate
2424

2525
if TYPE_CHECKING:
@@ -41,10 +41,6 @@ def rectify_acquaintance_strategy(circuit: 'cirq.Circuit', acquaint_first: bool
4141
Raises:
4242
TypeError: If the circuit is not an acquaintance strategy.
4343
"""
44-
45-
if not is_acquaintance_strategy(circuit):
46-
raise TypeError('not is_acquaintance_strategy(circuit)')
47-
4844
rectified_moments = []
4945
for moment in circuit:
5046
gate_type_to_ops: Dict[bool, List[ops.GateOperation]] = collections.defaultdict(list)
@@ -85,10 +81,6 @@ def replace_acquaintance_with_swap_network(
8581
Raises:
8682
TypeError: circuit is not an acquaintance strategy.
8783
"""
88-
89-
if not is_acquaintance_strategy(circuit):
90-
raise TypeError('not is_acquaintance_strategy(circuit)')
91-
9284
rectify_acquaintance_strategy(circuit)
9385
reflected = False
9486
reverse_map = {q: r for q, r in zip(qubit_order, reversed(qubit_order))}

cirq-core/cirq/contrib/acquaintance/mutation_utils_test.py

+2-11
Original file line numberDiff line numberDiff line change
@@ -142,9 +142,6 @@ def test_complete_acquaintance_strategy():
142142
def test_rectification():
143143
qubits = cirq.LineQubit.range(4)
144144

145-
with pytest.raises(TypeError):
146-
cca.rectify_acquaintance_strategy(cirq.Circuit())
147-
148145
perm_gate = cca.SwapPermutationGate()
149146
operations = [
150147
perm_gate(*qubits[:2]),
@@ -153,7 +150,7 @@ def test_rectification():
153150
perm_gate(*qubits[2:]),
154151
]
155152

156-
strategy = cirq.Circuit(operations, device=cca.UnconstrainedAcquaintanceDevice)
153+
strategy = cirq.Circuit(operations)
157154
cca.rectify_acquaintance_strategy(strategy)
158155
actual_text_diagram = strategy.to_text_diagram().strip()
159156
expected_text_diagram = """
@@ -167,7 +164,7 @@ def test_rectification():
167164
""".strip()
168165
assert actual_text_diagram == expected_text_diagram
169166

170-
strategy = cirq.Circuit(operations, device=cca.UnconstrainedAcquaintanceDevice)
167+
strategy = cirq.Circuit(operations)
171168
cca.rectify_acquaintance_strategy(strategy, False)
172169
actual_text_diagram = strategy.to_text_diagram()
173170
expected_text_diagram = """
@@ -180,9 +177,3 @@ def test_rectification():
180177
3: ─────────█───────1↦0───
181178
""".strip()
182179
assert actual_text_diagram == expected_text_diagram
183-
184-
185-
def test_replace_acquaintance_with_swap_network():
186-
with pytest.raises(TypeError):
187-
qubits = cirq.LineQubit.range(3)
188-
cca.replace_acquaintance_with_swap_network(cirq.Circuit(), qubits)

cirq-core/cirq/contrib/acquaintance/optimizers.py

-3
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
from cirq import ops
1818

19-
from cirq.contrib.acquaintance.devices import is_acquaintance_strategy
2019
from cirq.contrib.acquaintance.gates import acquaint
2120
from cirq.contrib.acquaintance.executor import AcquaintanceOperation
2221
from cirq.contrib.acquaintance.mutation_utils import expose_acquaintance_gates
@@ -28,8 +27,6 @@
2827

2928
def remove_redundant_acquaintance_opportunities(strategy: 'cirq.Circuit') -> int:
3029
"""Removes redundant acquaintance opportunities."""
31-
if not is_acquaintance_strategy(strategy):
32-
raise TypeError('not is_acquaintance_strategy(circuit)')
3330

3431
qubits = sorted(strategy.all_qubits())
3532
mapping = {q: i for i, q in enumerate(qubits)}

cirq-core/cirq/contrib/acquaintance/optimizers_test.py

+2-11
Original file line numberDiff line numberDiff line change
@@ -11,26 +11,17 @@
1111
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
14-
15-
import pytest
16-
1714
import cirq
1815
import cirq.testing as ct
1916
import cirq.contrib.acquaintance as cca
2017

2118

2219
def test_remove_redundant_acquaintance_opportunities():
23-
device = cca.UnconstrainedAcquaintanceDevice
2420
a, b, c, d, e = cirq.LineQubit.range(5)
2521
swap = cca.SwapPermutationGate()
2622

27-
with pytest.raises(TypeError):
28-
ops = [cca.acquaint(a, b)]
29-
strategy = cirq.Circuit(ops)
30-
cca.remove_redundant_acquaintance_opportunities(strategy)
31-
3223
ops = [cca.acquaint(a, b), cca.acquaint(a, b)]
33-
strategy = cirq.Circuit(ops, device=device)
24+
strategy = cirq.Circuit(ops)
3425
diagram_before = """
3526
0: ───█───█───
3627
│ │
@@ -47,7 +38,7 @@ def test_remove_redundant_acquaintance_opportunities():
4738
ct.assert_has_diagram(strategy, diagram_after)
4839

4940
ops = [cca.acquaint(a, b), cca.acquaint(c, d), swap(d, e), swap(c, d), cca.acquaint(d, e)]
50-
strategy = cirq.Circuit(ops, device=device)
41+
strategy = cirq.Circuit(ops)
5142
diagram_before = """
5243
0: ───█───────────────────
5344

cirq-core/cirq/contrib/acquaintance/shift_swap_network_test.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ def test_shift_swap_network_gate_acquaintance_opps(left_part_lens, right_part_le
3434
gate = cca.ShiftSwapNetworkGate(left_part_lens, right_part_lens)
3535
n_qubits = gate.qubit_count()
3636
qubits = cirq.LineQubit.range(n_qubits)
37-
strategy = cirq.Circuit(gate(*qubits), device=cca.UnconstrainedAcquaintanceDevice)
37+
strategy = cirq.Circuit(gate(*qubits))
3838

3939
# actual_opps
4040
initial_mapping = {q: i for i, q in enumerate(qubits)}

cirq-core/cirq/contrib/acquaintance/strategies/complete.py

+4-7
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
from cirq import circuits, ops
1818

19-
from cirq.contrib.acquaintance.devices import UnconstrainedAcquaintanceDevice
2019
from cirq.contrib.acquaintance.gates import acquaint
2120
from cirq.contrib.acquaintance.mutation_utils import (
2221
expose_acquaintance_gates,
@@ -47,16 +46,14 @@ def complete_acquaintance_strategy(
4746
if acquaintance_size < 0:
4847
raise ValueError('acquaintance_size must be non-negative.')
4948
if acquaintance_size == 0:
50-
return circuits.Circuit(device=UnconstrainedAcquaintanceDevice)
49+
return circuits.Circuit()
5150

5251
if acquaintance_size > len(qubit_order):
53-
return circuits.Circuit(device=UnconstrainedAcquaintanceDevice)
52+
return circuits.Circuit()
5453
if acquaintance_size == len(qubit_order):
55-
return circuits.Circuit(acquaint(*qubit_order), device=UnconstrainedAcquaintanceDevice)
54+
return circuits.Circuit(acquaint(*qubit_order))
5655

57-
strategy = circuits.Circuit(
58-
(acquaint(q) for q in qubit_order), device=UnconstrainedAcquaintanceDevice
59-
)
56+
strategy = circuits.Circuit((acquaint(q) for q in qubit_order))
6057
for size_to_acquaint in range(2, acquaintance_size + 1):
6158
expose_acquaintance_gates(strategy)
6259
replace_acquaintance_with_swap_network(strategy, qubit_order, size_to_acquaint, swap_gate)

cirq-core/cirq/contrib/acquaintance/strategies/cubic.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
from typing import Iterable, Sequence, Tuple, TypeVar, TYPE_CHECKING
1717

1818
from cirq import circuits, ops
19-
from cirq.contrib.acquaintance.devices import UnconstrainedAcquaintanceDevice
2019
from cirq.contrib.acquaintance.gates import acquaint
2120
from cirq.contrib.acquaintance.permutation import LinearPermutationGate, SwapPermutationGate
2221

@@ -77,4 +76,4 @@ def cubic_acquaintance_strategy(
7776
)
7877
moments.append(moment)
7978
index_order = new_index_order[::-1]
80-
return circuits.Circuit(moments, device=UnconstrainedAcquaintanceDevice)
79+
return circuits.Circuit(moments)

cirq-core/cirq/contrib/acquaintance/strategies/quartic_paired.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
from typing import cast, Iterable, List, Sequence, Tuple, TYPE_CHECKING
1616

1717
from cirq import circuits, ops
18-
from cirq.contrib.acquaintance.devices import UnconstrainedAcquaintanceDevice
1918
from cirq.contrib.acquaintance.gates import acquaint, SwapNetworkGate
2019
from cirq.contrib.acquaintance.mutation_utils import expose_acquaintance_gates
2120

@@ -61,7 +60,7 @@ def quartic_paired_acquaintance_strategy(
6160
qubits = qubit_pairs_to_qubit_order(qubit_pairs)
6261
n_qubits = len(qubits)
6362
swap_network = SwapNetworkGate((1,) * n_qubits, 2)(*qubits)
64-
strategy = circuits.Circuit(swap_network, device=UnconstrainedAcquaintanceDevice)
63+
strategy = circuits.Circuit(swap_network)
6564
expose_acquaintance_gates(strategy)
6665
for i in reversed(range(0, n_qubits, 2)):
6766
moment = ops.Moment([acquaint(*qubits[j : j + 4]) for j in range(i % 4, n_qubits - 3, 4)])

cirq-core/cirq/contrib/paulistring/recombine.py

+1-3
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,4 @@ def move_pauli_strings_into_circuit(
104104

105105
assert not string_dag.nodes(), 'There was a cycle in the CircuitDag'
106106

107-
return circuits.Circuit(
108-
output_ops, strategy=circuits.InsertStrategy.EARLIEST, device=circuit_right.device
109-
)
107+
return circuits.Circuit(output_ops, strategy=circuits.InsertStrategy.EARLIEST)

cirq-core/cirq/contrib/routing/greedy.py

+1-3
Original file line numberDiff line numberDiff line change
@@ -89,9 +89,7 @@ def route_circuit_greedily(
8989
router.route()
9090

9191
swap_network = router.swap_network
92-
swap_network.circuit = circuits.Circuit(
93-
swap_network.circuit.all_operations(), device=swap_network.device
94-
)
92+
swap_network.circuit = circuits.Circuit(swap_network.circuit.all_operations())
9593
return swap_network
9694

9795

cirq-core/cirq/contrib/routing/swap_network.py

+3-5
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@ class SwapNetwork:
3636
"""
3737

3838
def __init__(
39-
self, circuit: 'cirq.Circuit', initial_mapping: Dict['cirq.Qid', 'cirq.Qid']
39+
self,
40+
circuit: 'cirq.Circuit',
41+
initial_mapping: Dict['cirq.Qid', 'cirq.Qid'],
4042
) -> None:
4143
if not all(isinstance(i, ops.Qid) for I in initial_mapping.items() for i in I):
4244
raise ValueError('Mapping must be from Qids to Qids.')
@@ -56,10 +58,6 @@ def __eq__(self, other) -> bool:
5658
return NotImplemented
5759
return self.circuit == other.circuit and self.initial_mapping == other.initial_mapping
5860

59-
@property
60-
def device(self) -> 'cirq.Device':
61-
return self.circuit.device
62-
6361
def __str__(self) -> str:
6462
circuit = self.circuit.copy()
6563
cca.display_mapping(circuit, self.initial_mapping)

cirq-core/cirq/protocols/qasm.py

+2
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,9 @@ def qasm(
159159
kwargs['args'] = args
160160
if qubits is not None:
161161
kwargs['qubits'] = tuple(qubits)
162+
# pylint: disable=not-callable
162163
result = method(**kwargs)
164+
# pylint: enable=not-callable
163165
if result is not None and result is not NotImplemented:
164166
return result
165167

0 commit comments

Comments
 (0)