Skip to content

Commit

Permalink
Accept all_qubits in GridDevice._from_device_information() to allow i…
Browse files Browse the repository at this point in the history
…solated qubits (#6103)
  • Loading branch information
verult committed May 23, 2023
1 parent 683286b commit 97e8b98
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 4 deletions.
10 changes: 8 additions & 2 deletions cirq-google/cirq_google/devices/grid_device.py
Expand Up @@ -510,7 +510,8 @@ def _from_device_information(
*,
qubit_pairs: Collection[Tuple[cirq.GridQubit, cirq.GridQubit]],
gateset: cirq.Gateset,
gate_durations: Optional[Mapping['cirq.GateFamily', 'cirq.Duration']] = None,
gate_durations: Optional[Mapping[cirq.GateFamily, cirq.Duration]] = None,
all_qubits: Optional[Collection[cirq.GridQubit]] = None,
) -> 'GridDevice':
"""Constructs a GridDevice using the device information provided.
Expand Down Expand Up @@ -555,9 +556,14 @@ def _from_device_information(
ValueError: If `gate_durations` contains keys which are not in `gateset`.
ValueError: If multiple gate families in gate_durations can
represent a particular gate, but they have different durations.
ValueError: If all_qubits is provided and is not a superset
of all the qubits found in qubit_pairs.
"""
metadata = cirq.GridDeviceMetadata(
qubit_pairs=qubit_pairs, gateset=gateset, gate_durations=gate_durations
qubit_pairs=qubit_pairs,
gateset=gateset,
gate_durations=gate_durations,
all_qubits=all_qubits,
)
incomplete_device = GridDevice(metadata)
# incomplete_device may have incomplete gateset and gate durations information, as described
Expand Down
25 changes: 23 additions & 2 deletions cirq-google/cirq_google/devices/grid_device_test.py
Expand Up @@ -204,6 +204,24 @@ def _create_device_spec_with_all_couplings():
return spec


def _create_device_spec_with_isolated_qubits():
# Qubit layout:
# x -- x
# x -- x
# x -- x
# x -- x
# x -- x
# x x
device_info, spec = _create_device_spec_with_horizontal_couplings()

isolated_qubits = [cirq.GridQubit(GRID_HEIGHT, j) for j in range(2)]
spec.valid_qubits.extend([v2.qubit_to_proto_id(q) for q in isolated_qubits])

device_info.grid_qubits.extend(isolated_qubits)

return device_info, spec


def _create_device_spec_duplicate_qubit() -> v2.device_pb2.DeviceSpecification:
"""Creates a DeviceSpecification with a qubit name that does not conform to '<int>_<int>'."""
q_proto_id = v2.qubit_to_proto_id(cirq.GridQubit(0, 0))
Expand Down Expand Up @@ -440,7 +458,7 @@ def test_grid_device_repr_pretty(cycle, func):


def test_device_from_device_information_equals_device_from_proto():
device_info, spec = _create_device_spec_with_horizontal_couplings()
device_info, spec = _create_device_spec_with_isolated_qubits()

# The set of gates in gateset and gate durations are consistent with what's generated in
# _create_device_spec_with_horizontal_couplings()
Expand Down Expand Up @@ -482,7 +500,10 @@ def test_device_from_device_information_equals_device_from_proto():
}

device_from_information = cirq_google.GridDevice._from_device_information(
qubit_pairs=device_info.qubit_pairs, gateset=gateset, gate_durations=gate_durations
qubit_pairs=device_info.qubit_pairs,
gateset=gateset,
gate_durations=gate_durations,
all_qubits=device_info.grid_qubits,
)

assert device_from_information == cirq_google.GridDevice.from_proto(spec)
Expand Down

0 comments on commit 97e8b98

Please sign in to comment.