Skip to content

Commit 382e37b

Browse files
authored
GridDevice: Exclude MeasurementGates in validation of qubit pairs (#5654)
I'm comfortable with special-casing MeasurementGate because it's the only gate today with the property that it can be applied to any subset of qubits. Fixes #5652 @maffoo
1 parent 8246c5b commit 382e37b

File tree

2 files changed

+63
-0
lines changed

2 files changed

+63
-0
lines changed

cirq-google/cirq_google/devices/grid_device.py

+4
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@
3737
MEASUREMENT_GATE_FAMILY = cirq.GateFamily(cirq.MeasurementGate)
3838
WAIT_GATE_FAMILY = cirq.GateFamily(cirq.WaitGate)
3939

40+
# Families of gates which can be applied to any subset of valid qubits.
41+
_VARIADIC_GATE_FAMILIES = [MEASUREMENT_GATE_FAMILY, WAIT_GATE_FAMILY]
42+
4043

4144
def _validate_device_specification(proto: v2.device_pb2.DeviceSpecification) -> None:
4245
"""Raises a ValueError if the `DeviceSpecification` proto is invalid."""
@@ -338,6 +341,7 @@ def validate_operation(self, operation: cirq.Operation) -> None:
338341

339342
if (
340343
len(operation.qubits) == 2
344+
and not any(operation in gf for gf in _VARIADIC_GATE_FAMILIES)
341345
and frozenset(operation.qubits) not in self._metadata.qubit_pairs
342346
):
343347
raise ValueError(f'Qubit pair is not valid on device: {operation.qubits!r}.')

cirq-google/cirq_google/devices/grid_device_test.py

+59
Original file line numberDiff line numberDiff line change
@@ -252,15 +252,74 @@ def test_grid_device_from_proto():
252252
def test_grid_device_validate_operations_positive():
253253
device_info, spec = _create_device_spec_with_horizontal_couplings()
254254
device = cirq_google.GridDevice.from_proto(spec)
255+
# Gates that can be applied to any subset of valid qubits
256+
variadic_gates = [cirq.measure, cirq.WaitGate(cirq.Duration(nanos=1), num_qubits=2)]
255257

256258
for q in device_info.grid_qubits:
257259
device.validate_operation(cirq.X(q))
260+
device.validate_operation(cirq.measure(q))
258261

259262
# horizontal qubit pairs
260263
for i in range(GRID_HEIGHT):
261264
device.validate_operation(
262265
cirq.CZ(device_info.grid_qubits[2 * i], device_info.grid_qubits[2 * i + 1])
263266
)
267+
for gate in variadic_gates:
268+
device.validate_operation(
269+
gate(device_info.grid_qubits[2 * i], device_info.grid_qubits[2 * i + 1])
270+
)
271+
272+
273+
@pytest.mark.parametrize(
274+
'gate_func',
275+
[
276+
lambda _: cirq.measure,
277+
lambda num_qubits: cirq.WaitGate(cirq.Duration(nanos=1), num_qubits=num_qubits),
278+
],
279+
)
280+
def test_grid_device_validate_operations_variadic_gates_positive(gate_func):
281+
device_info, spec = _create_device_spec_with_horizontal_couplings()
282+
device = cirq_google.GridDevice.from_proto(spec)
283+
284+
# Single qubit operations
285+
for q in device_info.grid_qubits:
286+
device.validate_operation(gate_func(1)(q))
287+
288+
# horizontal qubit pairs (coupled)
289+
for i in range(GRID_HEIGHT):
290+
device.validate_operation(
291+
gate_func(2)(device_info.grid_qubits[2 * i], device_info.grid_qubits[2 * i + 1])
292+
)
293+
294+
# Variadic gates across vertical qubit pairs (uncoupled pairs) should succeed.
295+
for i in range(GRID_HEIGHT - 1):
296+
device.validate_operation(
297+
gate_func(2)(device_info.grid_qubits[2 * i], device_info.grid_qubits[2 * (i + 1)])
298+
)
299+
device.validate_operation(
300+
gate_func(2)(
301+
device_info.grid_qubits[2 * i + 1], device_info.grid_qubits[2 * (i + 1) + 1]
302+
)
303+
)
304+
305+
# 3-qubit measurements
306+
for i in range(GRID_HEIGHT - 2):
307+
device.validate_operation(
308+
gate_func(3)(
309+
device_info.grid_qubits[2 * i],
310+
device_info.grid_qubits[2 * (i + 1)],
311+
device_info.grid_qubits[2 * (i + 2)],
312+
)
313+
)
314+
device.validate_operation(
315+
gate_func(3)(
316+
device_info.grid_qubits[2 * i + 1],
317+
device_info.grid_qubits[2 * (i + 1) + 1],
318+
device_info.grid_qubits[2 * (i + 2) + 1],
319+
)
320+
)
321+
# All-qubit measurement
322+
device.validate_operation(gate_func(len(device_info.grid_qubits))(*device_info.grid_qubits))
264323

265324

266325
def test_grid_device_validate_operations_negative():

0 commit comments

Comments
 (0)