Skip to content
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
83 changes: 79 additions & 4 deletions cirq-core/cirq/experiments/google_v2_supremacy_circuit.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,84 @@ def generate_boixo_2018_supremacy_circuits_v2_grid(
return generate_boixo_2018_supremacy_circuits_v2(qubits, cz_depth, seed)


_bristlecone_qubits = frozenset(
{
devices.GridQubit(4, 8),
devices.GridQubit(2, 5),
devices.GridQubit(3, 2),
devices.GridQubit(5, 10),
devices.GridQubit(0, 6),
devices.GridQubit(4, 3),
devices.GridQubit(6, 7),
devices.GridQubit(8, 4),
devices.GridQubit(5, 5),
devices.GridQubit(4, 9),
devices.GridQubit(7, 8),
devices.GridQubit(8, 5),
devices.GridQubit(6, 2),
devices.GridQubit(7, 3),
devices.GridQubit(5, 0),
devices.GridQubit(4, 4),
devices.GridQubit(1, 4),
devices.GridQubit(7, 9),
devices.GridQubit(6, 3),
devices.GridQubit(3, 7),
devices.GridQubit(5, 1),
devices.GridQubit(7, 4),
devices.GridQubit(8, 6),
devices.GridQubit(4, 5),
devices.GridQubit(9, 7),
devices.GridQubit(3, 8),
devices.GridQubit(1, 5),
devices.GridQubit(2, 6),
devices.GridQubit(8, 7),
devices.GridQubit(5, 11),
devices.GridQubit(7, 5),
devices.GridQubit(3, 3),
devices.GridQubit(3, 9),
devices.GridQubit(1, 6),
devices.GridQubit(6, 8),
devices.GridQubit(2, 7),
devices.GridQubit(4, 1),
devices.GridQubit(5, 6),
devices.GridQubit(10, 5),
devices.GridQubit(7, 6),
devices.GridQubit(4, 10),
devices.GridQubit(8, 3),
devices.GridQubit(0, 5),
devices.GridQubit(3, 4),
devices.GridQubit(6, 9),
devices.GridQubit(10, 6),
devices.GridQubit(5, 7),
devices.GridQubit(9, 4),
devices.GridQubit(6, 4),
devices.GridQubit(2, 8),
devices.GridQubit(5, 2),
devices.GridQubit(3, 5),
devices.GridQubit(7, 2),
devices.GridQubit(2, 3),
devices.GridQubit(6, 10),
devices.GridQubit(5, 8),
devices.GridQubit(9, 5),
devices.GridQubit(4, 6),
devices.GridQubit(8, 8),
devices.GridQubit(6, 5),
devices.GridQubit(2, 4),
devices.GridQubit(5, 3),
devices.GridQubit(5, 9),
devices.GridQubit(3, 6),
devices.GridQubit(9, 6),
devices.GridQubit(4, 7),
devices.GridQubit(1, 7),
devices.GridQubit(4, 2),
devices.GridQubit(6, 6),
devices.GridQubit(7, 7),
devices.GridQubit(5, 4),
devices.GridQubit(6, 1),
}
)


def generate_boixo_2018_supremacy_circuits_v2_bristlecone(
n_rows: int, cz_depth: int, seed: int
) -> circuits.Circuit:
Expand Down Expand Up @@ -135,12 +213,9 @@ def count_neighbors(qubits, qubit):

assert 2 <= n_rows <= 11
max_row = n_rows - 1
# to avoid circular dependencies
import cirq_google

dev = cirq_google.Bristlecone
# we need a consistent order of qubits
qubits = list(dev.qubits)
qubits = list(_bristlecone_qubits)
qubits.sort()
qubits = [
q
Expand Down
12 changes: 12 additions & 0 deletions cirq-google/cirq_google/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@

"""Classes for working with Google's Quantum Engine API."""

import sys
from cirq import _compat
from cirq_google import api

from cirq_google._version import (
Expand Down Expand Up @@ -150,3 +152,13 @@
from cirq_google.json_resolver_cache import _class_resolver_dictionary

_register_resolver(_class_resolver_dictionary)

__spec_copy__ = sys.modules[__name__].__spec__
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do we need to explicitly copy the spec and then pass it to deprecate_attributes ? Can't we just do:

sys.modules[__name__] = _compat.deprecate_attributes(
    sys.modules[__name__],
    {
        'Bristlecone': ('v0.15', 'Bristlecone will no longer be supported.'),
        'Foxtail': ('v0.15', 'Foxtail will no longer be supported.'),
    },
)

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

for some reason this update clobbers the spec entry in sys.modules I'm not a python wizard, but this worked well enough. So it is needed.

sys.modules[__name__] = _compat.deprecate_attributes(
sys.modules[__name__],
{
'Bristlecone': ('v0.15', 'Bristlecone will no longer be supported.'),
'Foxtail': ('v0.15', 'Foxtail will no longer be supported.'),
},
)
sys.modules[__name__].__spec__ = __spec_copy__
14 changes: 10 additions & 4 deletions cirq-google/cirq_google/api/v1/programs_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,15 @@ def assert_proto_dict_convert(gate: cirq.Gate, proto: operations_pb2.Operation,


def test_protobuf_round_trip():
device = cg.Foxtail
qubits = cirq.GridQubit.rect(1, 5)
circuit = cirq.Circuit(
[cirq.X(q) ** 0.5 for q in device.qubits],
[cirq.CZ(q, q2) for q in [cirq.GridQubit(0, 0)] for q2 in device.neighbors_of(q)],
[cirq.X(q) ** 0.5 for q in qubits],
[
cirq.CZ(q, q2)
for q in [cirq.GridQubit(0, 0)]
for q, q2 in zip(qubits, qubits)
if q != q2
],
)

protos = list(programs.circuit_as_schedule_to_protos(circuit))
Expand All @@ -39,7 +44,8 @@ def test_protobuf_round_trip():


def test_protobuf_round_trip_device_deprecated():
device = cg.Foxtail
with cirq.testing.assert_deprecated('Foxtail', deadline='v0.15'):
device = cg.Foxtail
circuit = cirq.Circuit(
[cirq.X(q) ** 0.5 for q in device.qubits],
[cirq.CZ(q, q2) for q in [cirq.GridQubit(0, 0)] for q2 in device.neighbors_of(q)],
Expand Down
14 changes: 10 additions & 4 deletions cirq-google/cirq_google/devices/known_devices.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,12 @@
from typing import Any, Collection, Dict, Optional, Iterable, List, Set, Tuple

import cirq
from cirq import _compat
from cirq._doc import document
from cirq_google.api import v2
from cirq_google.api.v2 import device_pb2
from cirq_google.devices.serializable_device import SerializableDevice
from cirq_google.devices.xmon_device import XmonDevice
from cirq_google.devices.xmon_device import _XmonDeviceBase
from cirq_google.serialization import gate_sets, op_serializer, serializable_gate_set

_2_QUBIT_TARGET_SET = "2_qubit_targets"
Expand Down Expand Up @@ -188,7 +189,7 @@ def create_device_proto_for_qubits(
"""


class _NamedConstantXmonDevice(XmonDevice):
class _NamedConstantXmonDevice(_XmonDeviceBase):
def __init__(self, constant: str, **kwargs) -> None:
super().__init__(**kwargs)
self._repr = constant
Expand All @@ -198,9 +199,13 @@ def __repr__(self) -> str:

@classmethod
def _from_json_dict_(cls, constant: str, **kwargs):
if constant in ['cirq.google.Foxtail', Foxtail._repr]:
_compat._warn_or_error(
f'NamedConstantXmonDevice was used but is deprecated.\n'
f'It will be removed in cirq v0.15.\n'
)
if constant in ['cirq.google.Foxtail', 'cirq_google.Foxtail']:
return Foxtail
if constant in ['cirq.google.Bristlecone', Bristlecone._repr]:
if constant in ['cirq.google.Bristlecone', 'cirq_google.Bristlecone']:
return Bristlecone
raise ValueError(f'Unrecognized xmon device name: {constant!r}')

Expand Down Expand Up @@ -261,6 +266,7 @@ def _json_dict_(self) -> Dict[str, Any]:
exp_11_duration=cirq.Duration(nanos=50),
qubits=_parse_device(_BRISTLECONE_GRID)[0],
)

document(
Bristlecone,
f"""72 xmon qubit device.
Expand Down
35 changes: 19 additions & 16 deletions cirq-google/cirq_google/devices/known_devices_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,13 @@


def test_foxtail_qubits():
expected_qubits = []
for i in range(0, 2):
for j in range(0, 11):
expected_qubits.append(cirq.GridQubit(i, j))
assert set(expected_qubits) == cirq_google.Foxtail.qubits
with cirq.testing.assert_deprecated('Foxtail', deadline='v0.15'):
expected_qubits = []
for i in range(0, 2):
for j in range(0, 11):
expected_qubits.append(cirq.GridQubit(i, j))

assert set(expected_qubits) == cirq_google.Foxtail.qubits


def test_foxtail_device_proto():
Expand Down Expand Up @@ -462,17 +464,18 @@ def test_multiple_gate_sets():
)


def test_json_dict():
assert cirq_google.Foxtail._json_dict_() == {
'constant': 'cirq_google.Foxtail',
}

assert cirq_google.Bristlecone._json_dict_() == {
'constant': 'cirq_google.Bristlecone',
}

with pytest.raises(ValueError, match='xmon device name'):
known_devices._NamedConstantXmonDevice._from_json_dict_('the_unknown_fiddler')
def test_json_dict_deprecated():
with cirq.testing.assert_deprecated('Foxtail', deadline='v0.15', count=1):
assert cirq_google.Foxtail._json_dict_() == {
'constant': 'cirq_google.Foxtail',
}
with cirq.testing.assert_deprecated('Bristlecone', deadline='v0.15', count=1):
assert cirq_google.Bristlecone._json_dict_() == {
'constant': 'cirq_google.Bristlecone',
}
with cirq.testing.assert_deprecated('Constant', deadline='v0.15', count=1):
with pytest.raises(ValueError, match='xmon device name'):
known_devices._NamedConstantXmonDevice._from_json_dict_('the_unknown_fiddler')


@pytest.mark.parametrize('device', [cirq_google.Sycamore, cirq_google.Sycamore23])
Expand Down
9 changes: 8 additions & 1 deletion cirq-google/cirq_google/devices/xmon_device.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,15 @@
from typing import Any, cast, Iterable, List, Optional, Set, TYPE_CHECKING, FrozenSet

import cirq
from cirq import _compat
from cirq_google.optimizers import convert_to_xmon_gates

if TYPE_CHECKING:
import cirq


@cirq.value_equality
class XmonDevice(cirq.Device):
class _XmonDeviceBase(cirq.Device):
"""A device with qubits placed in a grid. Neighboring qubits can interact."""

def __init__(
Expand Down Expand Up @@ -213,3 +214,9 @@ def _verify_unique_measurement_keys(operations: Iterable[cirq.Operation]):
if key in seen:
raise ValueError(f'Measurement key {key} repeated')
seen.add(key)


@_compat.deprecated_class(deadline='v0.15', fix='XmonDevice will no longer be supported.')
class XmonDevice(_XmonDeviceBase):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
Loading