Skip to content

Commit 683551c

Browse files
MichaelBroughtonrht
authored andcommitted
Deprecate device.qubit_set in cirq_google. (quantumlib#4940)
Yet more of quantumlib#4744 . It also looks like now we can get rid of the device shim @mpharrigan , @dstrain115 (will leave to seperate PR).
1 parent 0ae5741 commit 683551c

File tree

7 files changed

+60
-10
lines changed

7 files changed

+60
-10
lines changed

cirq-google/cirq_google/devices/serializable_device.py

+4
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,10 @@ def metadata(self) -> cirq.GridDeviceMetadata:
128128
"""Get metadata information for device."""
129129
return self._metadata
130130

131+
@_compat.deprecated(
132+
fix='Please use metadata.qubit_set if applicable.',
133+
deadline='v0.15',
134+
)
131135
def qubit_set(self) -> FrozenSet[cirq.Qid]:
132136
return frozenset(self.qubits)
133137

cirq-google/cirq_google/devices/serializable_device_test.py

+9-1
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,14 @@ def test_gate_definition_equality():
133133
eq.add_equality_group(cirq.X)
134134

135135

136+
def test_qubit_set_deprecated():
137+
foxtail = cg.SerializableDevice.from_proto(
138+
proto=cg.devices.known_devices.FOXTAIL_PROTO, gate_sets=[cg.XMON]
139+
)
140+
with cirq.testing.assert_deprecated('qubit_set', deadline='v0.15'):
141+
_ = foxtail.qubit_set()
142+
143+
136144
def test_foxtail():
137145
valid_qubit1 = cirq.GridQubit(0, 0)
138146
valid_qubit2 = cirq.GridQubit(1, 0)
@@ -143,7 +151,7 @@ def test_foxtail():
143151
foxtail = cg.SerializableDevice.from_proto(
144152
proto=cg.devices.known_devices.FOXTAIL_PROTO, gate_sets=[cg.XMON]
145153
)
146-
assert foxtail.qubit_set() == frozenset(cirq.GridQubit.rect(2, 11, 0, 0))
154+
assert foxtail.metadata.qubit_set == frozenset(cirq.GridQubit.rect(2, 11, 0, 0))
147155
foxtail.validate_operation(cirq.X(valid_qubit1))
148156
foxtail.validate_operation(cirq.X(valid_qubit2))
149157
foxtail.validate_operation(cirq.X(valid_qubit3))

cirq-google/cirq_google/devices/xmon_device.py

+4
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,10 @@ def metadata(self) -> cirq.GridDeviceMetadata:
6363
"""Return the metadata for this device"""
6464
return self._metadata
6565

66+
@_compat.deprecated(
67+
fix='Use metadata.qubit_set if applicable.',
68+
deadline='v0.15',
69+
)
6670
def qubit_set(self) -> FrozenSet[cirq.GridQubit]:
6771
return self.qubits
6872

cirq-google/cirq_google/devices/xmon_device_test.py

+7
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,13 @@ def test_device_metadata():
7373
)
7474

7575

76+
@mock.patch.dict(os.environ, clear='CIRQ_TESTING')
77+
def test_qubit_set_deprecated():
78+
d = square_device(2, 2)
79+
with cirq.testing.assert_deprecated('qubit_set', deadline='v0.15'):
80+
_ = d.qubit_set()
81+
82+
7683
@mock.patch.dict(os.environ, clear='CIRQ_TESTING')
7784
def test_init():
7885
d = square_device(2, 2, holes=[cirq.GridQubit(1, 1)])

cirq-google/cirq_google/engine/virtual_engine_factory.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,9 @@
6464

6565
def _create_perfect_calibration(device: cirq.Device) -> calibration.Calibration:
6666
all_metrics: calibration.ALL_METRICS = {}
67-
qubit_set = device.qubit_set()
68-
if qubit_set is None:
67+
if device.metadata is None:
6968
raise ValueError('Devices for noiseless Virtual Engine must have qubits')
69+
qubit_set = device.metadata.qubit_set
7070
qubits = [cast(cirq.GridQubit, q) for q in qubit_set]
7171
for name in METRICS_1Q:
7272
all_metrics[name] = {(q,): [0.0] for q in qubits}

cirq-google/cirq_google/workflow/_device_shim.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
# limitations under the License.
1414

1515
import itertools
16-
from typing import Iterable, cast
16+
from typing import Iterable
1717

1818
import cirq
1919
import networkx as nx
@@ -27,4 +27,6 @@ def _gridqubits_to_graph_device(qubits: Iterable[cirq.GridQubit]):
2727

2828
def _Device_dot_get_nx_graph(device: 'cirq.Device') -> nx.Graph:
2929
"""Shim over future `cirq.Device` method to get a NetworkX graph."""
30-
return _gridqubits_to_graph_device(cast(Iterable[cirq.GridQubit], device.qubit_set()))
30+
if device.metadata is not None:
31+
return device.metadata.nx_graph
32+
raise ValueError('Supplied device must contain metadata.')

cirq-google/cirq_google/workflow/qubit_placement_test.py

+30-5
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,12 @@
2222
class TestDevice(cirq.Device):
2323
def __init__(self):
2424
self.qubits = cirq.GridQubit.rect(2, 8)
25+
neighbors = [(a, b) for a in self.qubits for b in self.qubits if a.is_adjacent(b)]
26+
self._metadata = cirq.GridDeviceMetadata(neighbors, cirq.Gateset(cirq.H))
27+
28+
@property
29+
def metadata(self):
30+
return self._metadata
2531

2632

2733
def test_naive_qubit_placer():
@@ -31,7 +37,7 @@ def test_naive_qubit_placer():
3137
qubits, depth=8, two_qubit_op_factory=lambda a, b, _: cirq.SQRT_ISWAP(a, b)
3238
)
3339

34-
assert all(q in cg.Sycamore23.qubit_set() for q in circuit.all_qubits())
40+
assert all(q in cg.Sycamore23.metadata.qubit_set for q in circuit.all_qubits())
3541

3642
qp = cg.NaiveQubitPlacer()
3743
circuit2, mapping = qp.place_circuit(
@@ -42,7 +48,7 @@ def test_naive_qubit_placer():
4248
)
4349
assert circuit is not circuit2
4450
assert circuit == circuit2
45-
assert all(q in cg.Sycamore23.qubit_set() for q in circuit2.all_qubits())
51+
assert all(q in cg.Sycamore23.metadata.qubit_set for q in circuit2.all_qubits())
4652
for k, v in mapping.items():
4753
assert k == v
4854

@@ -53,7 +59,7 @@ def test_random_device_placer_tilted_square_lattice():
5359
circuit = cirq.experiments.random_rotations_between_grid_interaction_layers_circuit(
5460
qubits, depth=8, two_qubit_op_factory=lambda a, b, _: cirq.SQRT_ISWAP(a, b)
5561
)
56-
assert not all(q in cg.Sycamore23.qubit_set() for q in circuit.all_qubits())
62+
assert not all(q in cg.Sycamore23.metadata.qubit_set for q in circuit.all_qubits())
5763

5864
qp = cg.RandomDevicePlacer()
5965
circuit2, mapping = qp.place_circuit(
@@ -64,7 +70,7 @@ def test_random_device_placer_tilted_square_lattice():
6470
)
6571
assert circuit is not circuit2
6672
assert circuit != circuit2
67-
assert all(q in cg.Sycamore23.qubit_set() for q in circuit2.all_qubits())
73+
assert all(q in cg.Sycamore23.metadata.qubit_set for q in circuit2.all_qubits())
6874
for k, v in mapping.items():
6975
assert k != v
7076

@@ -83,7 +89,7 @@ def test_random_device_placer_line():
8389
)
8490
assert circuit is not circuit2
8591
assert circuit != circuit2
86-
assert all(q in cg.Sycamore23.qubit_set() for q in circuit2.all_qubits())
92+
assert all(q in cg.Sycamore23.metadata.qubit_set for q in circuit2.all_qubits())
8793
for k, v in mapping.items():
8894
assert k != v
8995

@@ -120,3 +126,22 @@ def test_random_device_placer_small_device():
120126
shared_rt_info=cg.SharedRuntimeInfo(run_id='1', device=TestDevice()),
121127
rs=np.random.RandomState(1),
122128
)
129+
130+
131+
def test_device_missing_metadata():
132+
class BadDevice(cirq.Device):
133+
pass
134+
135+
topo = cirq.TiltedSquareLattice(3, 3)
136+
qubits = sorted(topo.nodes_to_gridqubits().values())
137+
circuit = cirq.experiments.random_rotations_between_grid_interaction_layers_circuit(
138+
qubits, depth=8, two_qubit_op_factory=lambda a, b, _: cirq.SQRT_ISWAP(a, b)
139+
)
140+
qp = cg.RandomDevicePlacer()
141+
with pytest.raises(ValueError):
142+
qp.place_circuit(
143+
circuit,
144+
problem_topology=topo,
145+
shared_rt_info=cg.SharedRuntimeInfo(run_id='1', device=BadDevice()),
146+
rs=np.random.RandomState(1),
147+
)

0 commit comments

Comments
 (0)