@@ -252,15 +252,74 @@ def test_grid_device_from_proto():
252
252
def test_grid_device_validate_operations_positive ():
253
253
device_info , spec = _create_device_spec_with_horizontal_couplings ()
254
254
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 )]
255
257
256
258
for q in device_info .grid_qubits :
257
259
device .validate_operation (cirq .X (q ))
260
+ device .validate_operation (cirq .measure (q ))
258
261
259
262
# horizontal qubit pairs
260
263
for i in range (GRID_HEIGHT ):
261
264
device .validate_operation (
262
265
cirq .CZ (device_info .grid_qubits [2 * i ], device_info .grid_qubits [2 * i + 1 ])
263
266
)
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 ))
264
323
265
324
266
325
def test_grid_device_validate_operations_negative ():
0 commit comments