From 3543a90cde0d907516b339264d8ba8c1c90d1ceb Mon Sep 17 00:00:00 2001 From: Michael Broughton Date: Thu, 19 May 2022 14:47:09 -0700 Subject: [PATCH 1/3] Remove decompose_operation deprecation from device. --- cirq-core/cirq/devices/device.py | 10 ---- cirq-core/cirq/devices/device_test.py | 10 ---- cirq-core/cirq/ion/ion_device.py | 6 --- cirq-core/cirq/ion/ion_device_test.py | 18 -------- .../neutral_atoms/neutral_atom_devices.py | 7 --- .../neutral_atom_devices_test.py | 7 --- cirq-core/cirq/testing/devices.py | 5 -- .../cirq_google/devices/xmon_device.py | 14 ------ .../cirq_google/devices/xmon_device_test.py | 8 ---- cirq-ionq/cirq_ionq/ionq_devices.py | 6 --- cirq-ionq/cirq_ionq/ionq_devices_test.py | 46 ------------------- cirq-pasqal/cirq_pasqal/pasqal_device.py | 18 -------- cirq-pasqal/cirq_pasqal/pasqal_device_test.py | 38 --------------- docs/tutorials/educators/ion_device.ipynb | 2 +- 14 files changed, 1 insertion(+), 194 deletions(-) diff --git a/cirq-core/cirq/devices/device.py b/cirq-core/cirq/devices/device.py index 9e970acae16..2173ca5f32f 100644 --- a/cirq-core/cirq/devices/device.py +++ b/cirq-core/cirq/devices/device.py @@ -24,16 +24,6 @@ class Device(metaclass=abc.ABCMeta): """Hardware constraints for validating circuits.""" - @_compat.deprecated(deadline='v0.15', fix='Devices will no longer decompose operations.') - def decompose_operation(self, operation: 'cirq.Operation') -> 'cirq.OP_TREE': - """Returns a device-valid decomposition for the given operation. - - This method is used when adding operations into circuits with a device - specified, to avoid spurious failures due to e.g. using a Hadamard gate - that must be decomposed into native gates. - """ - return operation - @property def metadata(self) -> Optional['DeviceMetadata']: """Returns the associated Metadata with the device if applicable. diff --git a/cirq-core/cirq/devices/device_test.py b/cirq-core/cirq/devices/device_test.py index bb676910811..9b61b9b9c23 100644 --- a/cirq-core/cirq/devices/device_test.py +++ b/cirq-core/cirq/devices/device_test.py @@ -3,16 +3,6 @@ import cirq -def test_decompose_operation_deprecated(): - q0 = cirq.GridQubit(0, 0) - - class RawDevice(cirq.Device): - pass - - with cirq.testing.assert_deprecated('decompose', deadline='v0.15'): - RawDevice().decompose_operation(cirq.H(q0)) - - def test_device_metadata(): class RawDevice(cirq.Device): pass diff --git a/cirq-core/cirq/ion/ion_device.py b/cirq-core/cirq/ion/ion_device.py index e767066cabf..4f3349329b1 100644 --- a/cirq-core/cirq/ion/ion_device.py +++ b/cirq-core/cirq/ion/ion_device.py @@ -82,12 +82,6 @@ def metadata(self) -> devices.DeviceMetadata: def qubit_set(self) -> FrozenSet['cirq.LineQubit']: return self.qubits - @_compat.deprecated( - fix='Use cirq.ConvertToIonGates() instead to decompose operations.', deadline='v0.15' - ) - def decompose_operation(self, operation: ops.Operation) -> ops.OP_TREE: - return convert_to_ion_gates.ConvertToIonGates().convert_one(operation) - def decompose_circuit(self, circuit: circuits.Circuit) -> circuits.Circuit: return convert_to_ion_gates.ConvertToIonGates().convert_circuit(circuit) diff --git a/cirq-core/cirq/ion/ion_device_test.py b/cirq-core/cirq/ion/ion_device_test.py index 551ef70202e..6c0b2aa5d19 100644 --- a/cirq-core/cirq/ion/ion_device_test.py +++ b/cirq-core/cirq/ion/ion_device_test.py @@ -89,24 +89,6 @@ def test_init_timedelta(): _ = d.duration_of(cirq.testing.SingleQubitGate().on(q0)) -def test_decomposition_deprecated(): - d = ion_device(3) - q0 = cirq.LineQubit(0) - q1 = cirq.LineQubit(1) - with cirq.testing.assert_deprecated('ConvertToIonGates', deadline='v0.15'): - assert d.decompose_operation(cirq.H(q0)) == [ - cirq.rx(np.pi * 1.0).on(cirq.LineQubit(0)), - cirq.ry(np.pi * -0.5).on(cirq.LineQubit(0)), - ] - circuit = cirq.Circuit() - circuit.append([cirq.X(q0), cirq.CNOT(q0, q1)]) - ion_circuit = d.decompose_circuit(circuit) - d.validate_circuit(ion_circuit) - cirq.testing.assert_circuits_with_terminal_measurements_are_equivalent( - circuit, ion_circuit, atol=1e-6 - ) - - def test_repr(): d = ion_device(3) diff --git a/cirq-core/cirq/neutral_atoms/neutral_atom_devices.py b/cirq-core/cirq/neutral_atoms/neutral_atom_devices.py index c3ea55e0798..8a8b7583c6c 100644 --- a/cirq-core/cirq/neutral_atoms/neutral_atom_devices.py +++ b/cirq-core/cirq/neutral_atoms/neutral_atom_devices.py @@ -113,13 +113,6 @@ def qubit_set(self) -> FrozenSet['cirq.GridQubit']: def qubit_list(self): return [qubit for qubit in self.qubits] - @_compat.deprecated( - fix='Use cirq.ConvertToNeutralAtomGates() instead to decompose operations.', - deadline='v0.15', - ) - def decompose_operation(self, operation: ops.Operation) -> ops.OP_TREE: - return ConvertToNeutralAtomGates().convert(operation) - def duration_of(self, operation: ops.Operation): """Provides the duration of the given operation on this device. diff --git a/cirq-core/cirq/neutral_atoms/neutral_atom_devices_test.py b/cirq-core/cirq/neutral_atoms/neutral_atom_devices_test.py index 9e7d4f5aa53..57be1aae01b 100644 --- a/cirq-core/cirq/neutral_atoms/neutral_atom_devices_test.py +++ b/cirq-core/cirq/neutral_atoms/neutral_atom_devices_test.py @@ -112,13 +112,6 @@ def test_init_errors(): ) -def test_decompose_error_deprecated(): - d = square_device(2, 2, holes=[cirq.GridQubit(1, 1)]) - with cirq.testing.assert_deprecated('ConvertToNeutralAtomGates', deadline='v0.15', count=2): - for op in d.decompose_operation((cirq.CCZ**1.5).on(*(d.qubit_list()))): - d.validate_operation(op) - - def test_validate_gate_errors(): d = square_device(1, 1) diff --git a/cirq-core/cirq/testing/devices.py b/cirq-core/cirq/testing/devices.py index 6c0a8b15c7d..87454a71946 100644 --- a/cirq-core/cirq/testing/devices.py +++ b/cirq-core/cirq/testing/devices.py @@ -66,10 +66,5 @@ def validate_operation(self, operation: ops.Operation) -> None: if not cast(devices.GridQubit, p).is_adjacent(q): raise ValueError(f'Non-local interaction: {operation!r}.') - def decompose_operation(self, operation: 'ops.Operation') -> 'ops.OP_TREE': - if isinstance(operation.gate, self.auto_decompose_gates): - return protocols.decompose(operation) - return operation - def __repr__(self): return self._repr diff --git a/cirq-google/cirq_google/devices/xmon_device.py b/cirq-google/cirq_google/devices/xmon_device.py index 857d552afe3..6abea5aec2e 100644 --- a/cirq-google/cirq_google/devices/xmon_device.py +++ b/cirq-google/cirq_google/devices/xmon_device.py @@ -68,20 +68,6 @@ def metadata(self) -> cirq.GridDeviceMetadata: def qubit_set(self) -> FrozenSet[cirq.GridQubit]: return self.qubits - @_compat.deprecated( - deadline='v0.15', - fix='XmonDevice.decompose_operation is deprecated. ' - 'Please use cirq.optimize_for_target_gateset() and cirq.CZTargetGateset.', - ) - def decompose_operation(self, operation: cirq.Operation) -> cirq.OP_TREE: - if operation.gate is not None and self.is_supported_gate(operation.gate): - return operation - return [ - cirq.optimize_for_target_gateset( - cirq.Circuit(operation), gateset=cirq.CZTargetGateset(allow_partial_czs=True) - ).all_operations() - ] - def neighbors_of(self, qubit: cirq.GridQubit): """Returns the qubits that the given qubit can interact with.""" possibles = [ diff --git a/cirq-google/cirq_google/devices/xmon_device_test.py b/cirq-google/cirq_google/devices/xmon_device_test.py index 7f8575fe44a..1db65b1bb17 100644 --- a/cirq-google/cirq_google/devices/xmon_device_test.py +++ b/cirq-google/cirq_google/devices/xmon_device_test.py @@ -190,14 +190,6 @@ def test_validate_measurement_non_adjacent_qubits_ok(): ) -@mock.patch.dict(os.environ, clear='CIRQ_TESTING') -def test_decompose_operation_deprecated(): - d = square_device(3, 3) - - with cirq.testing.assert_deprecated('decompose', deadline='v0.15'): - _ = d.decompose_operation(cirq.H(cirq.GridQubit(1, 1))) - - @mock.patch.dict(os.environ, clear='CIRQ_TESTING') def test_validate_operation_existing_qubits(): d = square_device(3, 3, holes=[cirq.GridQubit(1, 1)]) diff --git a/cirq-ionq/cirq_ionq/ionq_devices.py b/cirq-ionq/cirq_ionq/ionq_devices.py index c2fdd2a56f5..5a549076940 100644 --- a/cirq-ionq/cirq_ionq/ionq_devices.py +++ b/cirq-ionq/cirq_ionq/ionq_devices.py @@ -90,12 +90,6 @@ def validate_operation(self, operation: cirq.Operation): def is_api_gate(self, operation: cirq.Operation) -> bool: return operation in _VALID_GATES - @_compat.deprecated( - fix='Use cirq_ionq.decompose_to_device operation instead.', deadline='v0.15' - ) - def decompose_operation(self, operation: cirq.Operation) -> cirq.OP_TREE: - return decompose_to_device(operation) - def decompose_to_device(operation: cirq.Operation, atol: float = 1e-8) -> cirq.OP_TREE: """Decompose operation to ionq native operations. diff --git a/cirq-ionq/cirq_ionq/ionq_devices_test.py b/cirq-ionq/cirq_ionq/ionq_devices_test.py index a829f7911ad..fc119c1b74a 100644 --- a/cirq-ionq/cirq_ionq/ionq_devices_test.py +++ b/cirq-ionq/cirq_ionq/ionq_devices_test.py @@ -120,15 +120,6 @@ def test_validate_circuit_valid(): device.validate_circuit(circuit) -@pytest.mark.parametrize('gate', VALID_GATES) -def test_decompose_leaves_supported_alone_deprecated(gate): - qubits = cirq.LineQubit.range(gate.num_qubits()) - device = ionq.IonQAPIDevice(qubits=qubits) - operation = gate(*qubits) - with cirq.testing.assert_deprecated('decompose_to_device', deadline='v0.15'): - assert device.decompose_operation(operation) == operation - - @pytest.mark.parametrize('gate', VALID_GATES) def test_decompose_leaves_supported_alone(gate): qubits = cirq.LineQubit.range(gate.num_qubits()) @@ -139,20 +130,6 @@ def test_decompose_leaves_supported_alone(gate): VALID_DECOMPOSED_GATES = cirq.Gateset(cirq.XPowGate, cirq.ZPowGate, cirq.CNOT) -def test_decompose_single_qubit_matrix_gate_deprecated(): - q = cirq.LineQubit(0) - device = ionq.IonQAPIDevice(qubits=[q]) - for _ in range(100): - gate = cirq.MatrixGate(cirq.testing.random_unitary(2)) - circuit = cirq.Circuit(gate(q)) - with cirq.testing.assert_deprecated('decompose_to_device', deadline='v0.15'): - decomposed_circuit = cirq.Circuit(*device.decompose_operation(gate(q))) - cirq.testing.assert_circuits_with_terminal_measurements_are_equivalent( - circuit, decomposed_circuit, atol=1e-8 - ) - assert VALID_DECOMPOSED_GATES.validate(decomposed_circuit) - - def test_decompose_single_qubit_matrix_gate(): q = cirq.LineQubit(0) for _ in range(100): @@ -165,20 +142,6 @@ def test_decompose_single_qubit_matrix_gate(): assert VALID_DECOMPOSED_GATES.validate(decomposed_circuit) -def test_decompose_two_qubit_matrix_gate_deprecated(): - q0, q1 = cirq.LineQubit.range(2) - device = ionq.IonQAPIDevice(qubits=[q0, q1]) - for _ in range(10): - gate = cirq.MatrixGate(cirq.testing.random_unitary(4)) - circuit = cirq.Circuit(gate(q0, q1)) - with cirq.testing.assert_deprecated('decompose_to_device', deadline='v0.15'): - decomposed_circuit = cirq.Circuit(*device.decompose_operation(gate(q0, q1))) - cirq.testing.assert_circuits_with_terminal_measurements_are_equivalent( - circuit, decomposed_circuit, atol=1e-8 - ) - assert VALID_DECOMPOSED_GATES.validate(decomposed_circuit) - - def test_decompose_two_qubit_matrix_gate(): q0, q1 = cirq.LineQubit.range(2) for _ in range(10): @@ -191,15 +154,6 @@ def test_decompose_two_qubit_matrix_gate(): assert VALID_DECOMPOSED_GATES.validate(decomposed_circuit) -def test_decompose_unsupported_gate_deprecated(): - q0, q1, q2 = cirq.LineQubit.range(3) - device = ionq.IonQAPIDevice(qubits=[q0, q1, q2]) - op = cirq.CCZ(q0, q1, q2) - with pytest.raises(ValueError, match='not supported'): - with cirq.testing.assert_deprecated('decompose_to_device', deadline='v0.15'): - _ = device.decompose_operation(op) - - def test_decompose_unsupported_gate(): q0, q1, q2 = cirq.LineQubit.range(3) op = cirq.CCZ(q0, q1, q2) diff --git a/cirq-pasqal/cirq_pasqal/pasqal_device.py b/cirq-pasqal/cirq_pasqal/pasqal_device.py index bc80799a5b9..84109f6720d 100644 --- a/cirq-pasqal/cirq_pasqal/pasqal_device.py +++ b/cirq-pasqal/cirq_pasqal/pasqal_device.py @@ -102,24 +102,6 @@ def qubit_set(self) -> FrozenSet[cirq.Qid]: def qubit_list(self): return [qubit for qubit in self.qubits] - @_compat.deprecated( - fix='Use PasqalConverter() to decompose operation instead.', deadline='v0.15' - ) - def decompose_operation(self, operation: cirq.Operation) -> 'cirq.OP_TREE': - - decomposition = [operation] - - if not isinstance(operation, cirq.GateOperation): - raise TypeError(f"{operation!r} is not a gate operation.") - - # Try to decompose the operation into elementary device operations - if not self.is_pasqal_device_op(operation): - decomposition = PasqalConverter().pasqal_convert( - operation, keep=self.is_pasqal_device_op - ) - - return decomposition - def is_pasqal_device_op(self, op: cirq.Operation) -> bool: if not isinstance(op, cirq.Operation): raise ValueError('Got unknown operation:', op) diff --git a/cirq-pasqal/cirq_pasqal/pasqal_device_test.py b/cirq-pasqal/cirq_pasqal/pasqal_device_test.py index f5b70b055a7..43b78178a0e 100644 --- a/cirq-pasqal/cirq_pasqal/pasqal_device_test.py +++ b/cirq-pasqal/cirq_pasqal/pasqal_device_test.py @@ -98,44 +98,6 @@ def test_is_pasqal_device_op(): assert not d2.is_pasqal_device_op(op1(TwoDQubit(0, 0), TwoDQubit(0, 1))) -def test_decompose_operation_deprecated(): - d = generic_device(3) - with cirq.testing.assert_deprecated('decompose', deadline='v0.15', count=2): - for op in d.decompose_operation((cirq.CCZ**1.5).on(*(d.qubit_list()))): - d.validate_operation(op) - - p_qubits = [cirq.LineQubit(3), cirq.LineQubit(4)] - d = PasqalVirtualDevice(1.0, p_qubits) - op = (cirq.ops.CNOT).on(*(d.qubit_list())) ** 2 - - with cirq.testing.assert_deprecated('decompose', deadline='v0.15', count=2): - assert d.decompose_operation(op) == [] - - -def test_pasqal_converter_deprecated(): - q = cirq.NamedQubit.range(2, prefix='q') - g = cirq.testing.TwoQubitGate() - - class FakeOperation(cirq.ops.GateOperation): - def __init__(self, gate, qubits): - self._gate = gate - self._qubits = qubits - - @property - def qubits(self): - return self._qubits - - def with_qubits(self, *new_qubits): - return FakeOperation(self._gate, new_qubits) - - op = FakeOperation(g, q).with_qubits(*q) - d = PasqalDevice(q) - - with pytest.raises(TypeError, match="Don't know how to work with"): - with cirq.testing.assert_deprecated('decompose', deadline='v0.15', count=2): - d.decompose_operation(op) - - def test_validate_operation_errors(): d = generic_device(3) diff --git a/docs/tutorials/educators/ion_device.ipynb b/docs/tutorials/educators/ion_device.ipynb index fade9af15b9..86f6ff7ba6b 100644 --- a/docs/tutorials/educators/ion_device.ipynb +++ b/docs/tutorials/educators/ion_device.ipynb @@ -322,7 +322,7 @@ "op = cirq.CNOT(ion_device.at(0), ion_device.at(1))\n", "\n", "# Decompose it for the IonDevice.\n", - "ion_device_ops = ion_device.decompose_operation(op)\n", + "ion_device_ops = cirq.ConvertToIonGates().decompose_operation(op)\n", "\n", "# Print the sequence of operations to implement a CNOT.\n", "print(\"Sequence of IonDevice operations for a CNOT:\\n\")\n", From e79fd52c56d40fd87d7e8d63d6360a34cc7e49e0 Mon Sep 17 00:00:00 2001 From: Michael Broughton Date: Fri, 20 May 2022 10:18:44 -0700 Subject: [PATCH 2/3] lint fix. --- cirq-core/cirq/ion/ion_device_test.py | 1 - cirq-core/cirq/neutral_atoms/neutral_atom_devices.py | 1 - cirq-core/cirq/testing/devices.py | 2 +- docs/tutorials/educators/ion_device.ipynb | 2 +- 4 files changed, 2 insertions(+), 4 deletions(-) diff --git a/cirq-core/cirq/ion/ion_device_test.py b/cirq-core/cirq/ion/ion_device_test.py index 6c0b2aa5d19..2031a63da7d 100644 --- a/cirq-core/cirq/ion/ion_device_test.py +++ b/cirq-core/cirq/ion/ion_device_test.py @@ -14,7 +14,6 @@ from datetime import timedelta -import numpy as np import pytest import cirq diff --git a/cirq-core/cirq/neutral_atoms/neutral_atom_devices.py b/cirq-core/cirq/neutral_atoms/neutral_atom_devices.py index 8a8b7583c6c..1915e5b01e1 100644 --- a/cirq-core/cirq/neutral_atoms/neutral_atom_devices.py +++ b/cirq-core/cirq/neutral_atoms/neutral_atom_devices.py @@ -20,7 +20,6 @@ from cirq.devices.grid_qubit import GridQubit from cirq.ops import raw_types from cirq.value import Duration -from cirq.neutral_atoms.convert_to_neutral_atom_gates import ConvertToNeutralAtomGates from cirq.neutral_atoms.neutral_atom_gateset import NeutralAtomGateset if TYPE_CHECKING: diff --git a/cirq-core/cirq/testing/devices.py b/cirq-core/cirq/testing/devices.py index 87454a71946..673abf18e14 100644 --- a/cirq-core/cirq/testing/devices.py +++ b/cirq-core/cirq/testing/devices.py @@ -14,7 +14,7 @@ """Provides test devices that can validate circuits.""" from typing import Tuple, AbstractSet, cast -from cirq import devices, ops, protocols +from cirq import devices, ops class ValidatingTestDevice(devices.Device): diff --git a/docs/tutorials/educators/ion_device.ipynb b/docs/tutorials/educators/ion_device.ipynb index 86f6ff7ba6b..784cc9660a9 100644 --- a/docs/tutorials/educators/ion_device.ipynb +++ b/docs/tutorials/educators/ion_device.ipynb @@ -322,7 +322,7 @@ "op = cirq.CNOT(ion_device.at(0), ion_device.at(1))\n", "\n", "# Decompose it for the IonDevice.\n", - "ion_device_ops = cirq.ConvertToIonGates().decompose_operation(op)\n", + "ion_device_ops = cirq.ConvertToIonGates().convert_one(op)\n", "\n", "# Print the sequence of operations to implement a CNOT.\n", "print(\"Sequence of IonDevice operations for a CNOT:\\n\")\n", From 806086b6c1ce90336c469e416662e7e5e1bb74d5 Mon Sep 17 00:00:00 2001 From: Michael Broughton Date: Fri, 20 May 2022 12:05:02 -0700 Subject: [PATCH 3/3] missed lint fix? --- cirq-core/cirq/devices/device.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cirq-core/cirq/devices/device.py b/cirq-core/cirq/devices/device.py index 2173ca5f32f..5cba936b476 100644 --- a/cirq-core/cirq/devices/device.py +++ b/cirq-core/cirq/devices/device.py @@ -15,7 +15,7 @@ import abc from typing import TYPE_CHECKING, Optional, FrozenSet, Iterable import networkx as nx -from cirq import _compat, value +from cirq import value if TYPE_CHECKING: import cirq