Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Accept all_qubits in GridDevice._from_device_information() to allow isolated qubits #6103

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions cirq-google/cirq_google/devices/grid_device.py
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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