From 2e8a55c96d6f0723b1d5c1d19d258ca887532403 Mon Sep 17 00:00:00 2001 From: Doug Strain Date: Tue, 12 Jul 2022 06:28:05 -0700 Subject: [PATCH 1/6] Remove circuits.CircuitDag This class has moved to contrib. Removed CircuitDag and Unique from the old location and have removed them from the global namespace. Users can still access cirq.contrib.CircuitDag. --- cirq-core/cirq/__init__.py | 2 - cirq-core/cirq/circuits/__init__.py | 1 - cirq-core/cirq/circuits/circuit_dag.py | 206 ------------- cirq-core/cirq/circuits/circuit_dag_test.py | 279 ------------------ .../cirq/protocols/json_test_data/spec.py | 2 - 5 files changed, 490 deletions(-) delete mode 100644 cirq-core/cirq/circuits/circuit_dag.py delete mode 100644 cirq-core/cirq/circuits/circuit_dag_test.py diff --git a/cirq-core/cirq/__init__.py b/cirq-core/cirq/__init__.py index 7f2fe05ebc5..69fdd36862d 100644 --- a/cirq-core/cirq/__init__.py +++ b/cirq-core/cirq/__init__.py @@ -65,8 +65,6 @@ AbstractCircuit, Alignment, Circuit, - CircuitDag, - CircuitOperation, FrozenCircuit, InsertStrategy, Moment, diff --git a/cirq-core/cirq/circuits/__init__.py b/cirq-core/cirq/circuits/__init__.py index 66f136b82d0..5f342104b5f 100644 --- a/cirq-core/cirq/circuits/__init__.py +++ b/cirq-core/cirq/circuits/__init__.py @@ -19,7 +19,6 @@ from cirq.circuits.qasm_output import QasmOutput from cirq.circuits.circuit import AbstractCircuit, Alignment, Circuit -from cirq.circuits.circuit_dag import CircuitDag, Unique from cirq.circuits.circuit_operation import CircuitOperation from cirq.circuits.frozen_circuit import FrozenCircuit from cirq.circuits.insert_strategy import InsertStrategy diff --git a/cirq-core/cirq/circuits/circuit_dag.py b/cirq-core/cirq/circuits/circuit_dag.py deleted file mode 100644 index 3f5eae5063f..00000000000 --- a/cirq-core/cirq/circuits/circuit_dag.py +++ /dev/null @@ -1,206 +0,0 @@ -# Copyright 2018 The Cirq Developers -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -from typing import Any, Callable, Dict, Generic, Iterator, TypeVar, cast, TYPE_CHECKING - -import functools -import networkx - -from cirq import _compat, ops -from cirq.circuits import circuit - -if TYPE_CHECKING: - import cirq - -T = TypeVar('T') - - -@_compat.deprecated_class(deadline='v0.16', fix='Use cirq contrib.Unique instead.') -@functools.total_ordering -class Unique(Generic[T]): - """A wrapper for a value that doesn't compare equal to other instances. - - For example: 5 == 5 but Unique(5) != Unique(5). - - Unique is used by CircuitDag to wrap operations because nodes in a graph - are considered the same node if they compare equal to each other. For - example, `X(q0)` in one moment of a circuit, and `X(q0)` in another moment - of the circuit are wrapped by `cirq.Unique(X(q0))` so they are distinct - nodes in the graph. - """ - - def __init__(self, val: T) -> None: - self.val = val - - def __repr__(self) -> str: - return f'cirq.Unique({id(self)}, {self.val!r})' - - def __lt__(self, other): - if not isinstance(other, type(self)): - return NotImplemented - return id(self) < id(other) - - -def _disjoint_qubits(op1: 'cirq.Operation', op2: 'cirq.Operation') -> bool: - """Returns true only if the operations have qubits in common.""" - return not set(op1.qubits) & set(op2.qubits) - - -@_compat.deprecated_class(deadline='v0.16', fix='Use cirq contrib.CircuitDag instead.') -class CircuitDag(networkx.DiGraph): - """A representation of a Circuit as a directed acyclic graph. - - Nodes of the graph are instances of Unique containing each operation of a - circuit. - - Edges of the graph are tuples of nodes. Each edge specifies a required - application order between two operations. The first must be applied before - the second. - - The graph is maximalist (transitive completion). - """ - - disjoint_qubits = staticmethod(_disjoint_qubits) - - def __init__( - self, - can_reorder: Callable[['cirq.Operation', 'cirq.Operation'], bool] = _disjoint_qubits, - incoming_graph_data: Any = None, - ) -> None: - """Initializes a CircuitDag. - - Args: - can_reorder: A predicate that determines if two operations may be - reordered. Graph edges are created for pairs of operations - where this returns False. - - The default predicate allows reordering only when the operations - don't share common qubits. - incoming_graph_data: Data in initialize the graph. This can be any - value supported by networkx.DiGraph() e.g. an edge list or - another graph. - device: Hardware that the circuit should be able to run on. - """ - super().__init__(incoming_graph_data) - self.can_reorder = can_reorder - - @staticmethod - def make_node(op: 'cirq.Operation') -> Unique: - return Unique(op) - - @staticmethod - def from_circuit( - circuit: circuit.Circuit, - can_reorder: Callable[['cirq.Operation', 'cirq.Operation'], bool] = _disjoint_qubits, - ) -> 'CircuitDag': - return CircuitDag.from_ops(circuit.all_operations(), can_reorder=can_reorder) - - @staticmethod - def from_ops( - *operations: 'cirq.OP_TREE', - can_reorder: Callable[['cirq.Operation', 'cirq.Operation'], bool] = _disjoint_qubits, - ) -> 'CircuitDag': - dag = CircuitDag(can_reorder=can_reorder) - for op in ops.flatten_op_tree(operations): - dag.append(cast(ops.Operation, op)) - return dag - - def append(self, op: 'cirq.Operation') -> None: - new_node = self.make_node(op) - for node in list(self.nodes()): - if not self.can_reorder(node.val, op): - self.add_edge(node, new_node) - for pred in self.pred[node]: - self.add_edge(pred, new_node) - self.add_node(new_node) - - def __eq__(self, other): - if not isinstance(other, type(self)): - return NotImplemented - g1 = self.copy() - g2 = other.copy() - for node, attr in g1.nodes(data=True): - attr['val'] = node.val - for node, attr in g2.nodes(data=True): - attr['val'] = node.val - - def node_match(attr1: Dict[Any, Any], attr2: Dict[Any, Any]) -> bool: - return attr1['val'] == attr2['val'] - - return networkx.is_isomorphic(g1, g2, node_match=node_match) - - def __ne__(self, other): - return not self == other - - __hash__ = None # type: ignore - - def ordered_nodes(self) -> Iterator[Unique['cirq.Operation']]: - if not self.nodes(): - return - g = self.copy() - - def get_root_node(some_node: Unique['cirq.Operation']) -> Unique['cirq.Operation']: - pred = g.pred - while pred[some_node]: - some_node = next(iter(pred[some_node])) - return some_node - - def get_first_node() -> Unique['cirq.Operation']: - return get_root_node(next(iter(g.nodes()))) - - def get_next_node(succ: networkx.classes.coreviews.AtlasView) -> Unique['cirq.Operation']: - if succ: - return get_root_node(next(iter(succ))) - - return get_first_node() - - node = get_first_node() - while True: - yield node - succ = g.succ[node] - g.remove_node(node) - - if not g.nodes(): - return - - node = get_next_node(succ) - - def all_operations(self) -> Iterator['cirq.Operation']: - return (node.val for node in self.ordered_nodes()) - - def all_qubits(self): - return frozenset(q for node in self.nodes for q in node.val.qubits) - - def to_circuit(self) -> circuit.Circuit: - return circuit.Circuit(self.all_operations(), strategy=circuit.InsertStrategy.EARLIEST) - - def findall_nodes_until_blocked( - self, is_blocker: Callable[['cirq.Operation'], bool] - ) -> Iterator[Unique['cirq.Operation']]: - """Finds all nodes before blocking ones. - - Args: - is_blocker: The predicate that indicates whether or not an - operation is blocking. - """ - remaining_dag = self.copy() - - for node in self.ordered_nodes(): - if node not in remaining_dag: - continue - if is_blocker(node.val): - successors = list(remaining_dag.succ[node]) - remaining_dag.remove_nodes_from(successors) - remaining_dag.remove_node(node) - continue - yield node diff --git a/cirq-core/cirq/circuits/circuit_dag_test.py b/cirq-core/cirq/circuits/circuit_dag_test.py deleted file mode 100644 index 1ac88ef5d88..00000000000 --- a/cirq-core/cirq/circuits/circuit_dag_test.py +++ /dev/null @@ -1,279 +0,0 @@ -# Copyright 2018 The Cirq Developers -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import itertools -import random - -import pytest -import networkx - -import cirq - - -class FakeDevice(cirq.Device): - pass - - -def test_wrapper_eq(): - q0, q1 = cirq.LineQubit.range(2) - eq = cirq.testing.EqualsTester() - - with cirq.testing.assert_deprecated('Use cirq contrib.Unique', deadline='v0.16', count=4): - eq.add_equality_group(cirq.CircuitDag.make_node(cirq.X(q0))) - eq.add_equality_group(cirq.CircuitDag.make_node(cirq.X(q0))) - eq.add_equality_group(cirq.CircuitDag.make_node(cirq.Y(q0))) - eq.add_equality_group(cirq.CircuitDag.make_node(cirq.X(q1))) - - -def test_wrapper_cmp(): - with cirq.testing.assert_deprecated('Use cirq contrib.Unique', deadline='v0.16', count=2): - u0 = cirq.Unique(0) - u1 = cirq.Unique(1) - # The ordering of Unique instances is unpredictable - u0, u1 = (u1, u0) if u1 < u0 else (u0, u1) - assert u0 == u0 - assert u0 != u1 - assert u0 < u1 - assert u1 > u0 - assert u0 <= u0 - assert u0 <= u1 - assert u0 >= u0 - assert u1 >= u0 - - -def test_wrapper_cmp_failure(): - with cirq.testing.assert_deprecated('Use cirq contrib.Unique', deadline='v0.16', count=2): - with pytest.raises(TypeError): - _ = object() < cirq.Unique(1) - with pytest.raises(TypeError): - _ = cirq.Unique(1) < object() - - -def test_wrapper_repr(): - q0 = cirq.LineQubit(0) - - with cirq.testing.assert_deprecated('Use cirq contrib.Unique', deadline='v0.16'): - node = cirq.CircuitDag.make_node(cirq.X(q0)) - assert repr(node) == 'cirq.Unique(' + str(id(node)) + ', cirq.X(cirq.LineQubit(0)))' - - -def test_init(): - with cirq.testing.assert_deprecated('Use cirq contrib.CircuitDag', deadline='v0.16', count=1): - dag = cirq.CircuitDag() - assert networkx.dag.is_directed_acyclic_graph(dag) - assert list(dag.nodes()) == [] - assert list(dag.edges()) == [] - - -def test_append(): - q0 = cirq.LineQubit(0) - with cirq.testing.assert_deprecated( - 'Use cirq contrib.CircuitDag', deadline='v0.16', count=None - ): - dag = cirq.CircuitDag() - dag.append(cirq.X(q0)) - dag.append(cirq.Y(q0)) - assert networkx.dag.is_directed_acyclic_graph(dag) - assert len(dag.nodes()) == 2 - assert [(n1.val, n2.val) for n1, n2 in dag.edges()] == [(cirq.X(q0), cirq.Y(q0))] - - -def test_two_identical_ops(): - q0 = cirq.LineQubit(0) - with cirq.testing.assert_deprecated( - 'Use cirq contrib.CircuitDag', deadline='v0.16', count=None - ): - dag = cirq.CircuitDag() - dag.append(cirq.X(q0)) - dag.append(cirq.Y(q0)) - dag.append(cirq.X(q0)) - assert networkx.dag.is_directed_acyclic_graph(dag) - assert len(dag.nodes()) == 3 - assert set((n1.val, n2.val) for n1, n2 in dag.edges()) == { - (cirq.X(q0), cirq.Y(q0)), - (cirq.X(q0), cirq.X(q0)), - (cirq.Y(q0), cirq.X(q0)), - } - - -def test_from_ops(): - q0 = cirq.LineQubit(0) - with cirq.testing.assert_deprecated( - 'Use cirq contrib.CircuitDag', deadline='v0.16', count=None - ): - dag = cirq.CircuitDag.from_ops(cirq.X(q0), cirq.Y(q0)) - assert networkx.dag.is_directed_acyclic_graph(dag) - assert len(dag.nodes()) == 2 - assert [(n1.val, n2.val) for n1, n2 in dag.edges()] == [(cirq.X(q0), cirq.Y(q0))] - - -def test_from_circuit(): - q0 = cirq.LineQubit(0) - circuit = cirq.Circuit(cirq.X(q0), cirq.Y(q0)) - with cirq.testing.assert_deprecated( - 'Use cirq contrib.CircuitDag', deadline='v0.16', count=None - ): - dag = cirq.CircuitDag.from_circuit(circuit) - assert networkx.dag.is_directed_acyclic_graph(dag) - assert len(dag.nodes()) == 2 - assert [(n1.val, n2.val) for n1, n2 in dag.edges()] == [(cirq.X(q0), cirq.Y(q0))] - assert sorted(circuit.all_qubits()) == sorted(dag.all_qubits()) - - -def test_to_empty_circuit(): - circuit = cirq.Circuit() - with cirq.testing.assert_deprecated('Use cirq contrib.CircuitDag', deadline='v0.16'): - dag = cirq.CircuitDag.from_circuit(circuit) - assert networkx.dag.is_directed_acyclic_graph(dag) - assert circuit == dag.to_circuit() - - -def test_to_circuit(): - q0 = cirq.LineQubit(0) - circuit = cirq.Circuit(cirq.X(q0), cirq.Y(q0)) - with cirq.testing.assert_deprecated( - 'Use cirq contrib.CircuitDag', deadline='v0.16', count=None - ): - dag = cirq.CircuitDag.from_circuit(circuit) - - assert networkx.dag.is_directed_acyclic_graph(dag) - # Only one possible output circuit for this simple case - assert circuit == dag.to_circuit() - - cirq.testing.assert_allclose_up_to_global_phase( - circuit.unitary(), dag.to_circuit().unitary(), atol=1e-7 - ) - - -def test_equality(): - q0, q1 = cirq.LineQubit.range(2) - circuit1 = cirq.Circuit( - cirq.X(q0), cirq.Y(q0), cirq.Z(q1), cirq.CZ(q0, q1), cirq.X(q1), cirq.Y(q1), cirq.Z(q0) - ) - circuit2 = cirq.Circuit( - cirq.Z(q1), cirq.X(q0), cirq.Y(q0), cirq.CZ(q0, q1), cirq.Z(q0), cirq.X(q1), cirq.Y(q1) - ) - circuit3 = cirq.Circuit( - cirq.X(q0), - cirq.Y(q0), - cirq.Z(q1), - cirq.CZ(q0, q1), - cirq.X(q1), - cirq.Y(q1), - cirq.Z(q0) ** 0.5, - ) - circuit4 = cirq.Circuit( - cirq.X(q0), cirq.Y(q0), cirq.Z(q1), cirq.CZ(q0, q1), cirq.X(q1), cirq.Y(q1) - ) - - eq = cirq.testing.EqualsTester() - with cirq.testing.assert_deprecated( - 'Use cirq contrib.CircuitDag', deadline='v0.16', count=None - ): - eq.make_equality_group( - lambda: cirq.CircuitDag.from_circuit(circuit1), - lambda: cirq.CircuitDag.from_circuit(circuit2), - ) - eq.add_equality_group(cirq.CircuitDag.from_circuit(circuit3)) - eq.add_equality_group(cirq.CircuitDag.from_circuit(circuit4)) - - -def test_larger_circuit(): - with cirq.testing.assert_deprecated( - 'Use cirq contrib.CircuitDag', deadline='v0.16', count=None - ): - q0, q1, q2, q3 = [ - cirq.GridQubit(0, 5), - cirq.GridQubit(1, 5), - cirq.GridQubit(2, 5), - cirq.GridQubit(3, 5), - ] - # This circuit does not have CZ gates on adjacent qubits because the order - # dag.to_circuit() would append them is non-deterministic. - circuit = cirq.Circuit( - cirq.X(q0), - cirq.CZ(q1, q2), - cirq.CZ(q0, q1), - cirq.Y(q0), - cirq.Z(q0), - cirq.CZ(q1, q2), - cirq.X(q0), - cirq.Y(q0), - cirq.CZ(q0, q1), - cirq.T(q3), - strategy=cirq.InsertStrategy.EARLIEST, - ) - - dag = cirq.CircuitDag.from_circuit(circuit) - - assert networkx.dag.is_directed_acyclic_graph(dag) - # Operation order within a moment is non-deterministic - # but text diagrams still look the same. - desired = """ -(0, 5): ───X───@───Y───Z───X───Y───@─── - │ │ -(1, 5): ───@───@───@───────────────@─── - │ │ -(2, 5): ───@───────@─────────────────── - -(3, 5): ───T─────────────────────────── -""" - cirq.testing.assert_has_diagram(circuit, desired) - cirq.testing.assert_has_diagram(dag.to_circuit(), desired) - - cirq.testing.assert_allclose_up_to_global_phase( - circuit.unitary(), dag.to_circuit().unitary(), atol=1e-7 - ) - - -@pytest.mark.parametrize('circuit', [cirq.testing.random_circuit(10, 10, 0.5) for _ in range(3)]) -def test_is_maximalist(circuit): - # This creates a number of Unique classes so the count is not consistent. - with cirq.testing.assert_deprecated( - 'Use cirq contrib.CircuitDag', deadline='v0.16', count=None - ): - dag = cirq.CircuitDag.from_circuit(circuit) - transitive_closure = networkx.dag.transitive_closure(dag) - assert cirq.CircuitDag(incoming_graph_data=transitive_closure) == dag - assert not any( - dag.has_edge(b, a) for a, b in itertools.combinations(dag.ordered_nodes(), 2) - ) - - -def _get_circuits_and_is_blockers(): - qubits = cirq.LineQubit.range(10) - circuits = [cirq.testing.random_circuit(qubits, 10, 0.5) for _ in range(1)] - edges = [ - set(qubit_pair) for qubit_pair in itertools.combinations(qubits, 2) if random.random() > 0.5 - ] - not_on_edge = lambda op: len(op.qubits) > 1 and set(op.qubits) not in edges - is_blockers = [lambda op: False, not_on_edge] - return itertools.product(circuits, is_blockers) - - -@pytest.mark.parametrize('circuit, is_blocker', _get_circuits_and_is_blockers()) -def test_findall_nodes_until_blocked(circuit, is_blocker): - # This creates a number of Unique classes so the count is not consistent. - with cirq.testing.assert_deprecated( - 'Use cirq contrib.CircuitDag', deadline='v0.16', count=None - ): - dag = cirq.CircuitDag.from_circuit(circuit) - all_nodes = list(dag.ordered_nodes()) - found_nodes = list(dag.findall_nodes_until_blocked(is_blocker)) - assert not any(dag.has_edge(b, a) for a, b in itertools.combinations(found_nodes, 2)) - - blocking_nodes = set(node for node in all_nodes if is_blocker(node.val)) - blocked_nodes = blocking_nodes.union(*(dag.succ[node] for node in blocking_nodes)) - expected_nodes = set(all_nodes) - blocked_nodes - assert sorted(found_nodes) == sorted(expected_nodes) diff --git a/cirq-core/cirq/protocols/json_test_data/spec.py b/cirq-core/cirq/protocols/json_test_data/spec.py index 644a73d563a..eb1581301c9 100644 --- a/cirq-core/cirq/protocols/json_test_data/spec.py +++ b/cirq-core/cirq/protocols/json_test_data/spec.py @@ -26,7 +26,6 @@ not_yet_serializable=[ 'Alignment', 'AxisAngleDecomposition', - 'CircuitDag', 'CircuitDiagramInfo', 'CircuitDiagramInfoArgs', 'CircuitSampleJob', @@ -163,7 +162,6 @@ 'NoiseModelFromNoiseProperties', 'Simulator', 'StabilizerSampler', - 'Unique', 'DEFAULT_RESOLVERS', ], deprecated={}, From 7dcb5575a219afe3254a1fb9e2df4e9d03e967be Mon Sep 17 00:00:00 2001 From: Doug Strain Date: Tue, 12 Jul 2022 06:42:29 -0700 Subject: [PATCH 2/6] Put CircuitOperation back, nothing to see here. --- cirq-core/cirq/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cirq-core/cirq/__init__.py b/cirq-core/cirq/__init__.py index 69fdd36862d..e93619732fe 100644 --- a/cirq-core/cirq/__init__.py +++ b/cirq-core/cirq/__init__.py @@ -65,6 +65,7 @@ AbstractCircuit, Alignment, Circuit, + CircuitOperation, FrozenCircuit, InsertStrategy, Moment, @@ -72,7 +73,6 @@ PointOptimizer, QasmOutput, TextDiagramDrawer, - Unique, ) from cirq.devices import ( From 7059bd2ccaffb1a982993cd0c4324c7e62976c27 Mon Sep 17 00:00:00 2001 From: Doug Strain Date: Tue, 12 Jul 2022 06:48:23 -0700 Subject: [PATCH 3/6] Fix type heck. --- cirq-core/cirq/contrib/acquaintance/topological_sort.py | 1 + 1 file changed, 1 insertion(+) diff --git a/cirq-core/cirq/contrib/acquaintance/topological_sort.py b/cirq-core/cirq/contrib/acquaintance/topological_sort.py index f892dd8b4c3..0da59538916 100644 --- a/cirq-core/cirq/contrib/acquaintance/topological_sort.py +++ b/cirq-core/cirq/contrib/acquaintance/topological_sort.py @@ -19,6 +19,7 @@ import networkx from cirq import ops +from cirq.contrib.circuitdag import CircuitDag if TYPE_CHECKING: import cirq From 79262276d50d9669b5db98e0be68fde2d1845f60 Mon Sep 17 00:00:00 2001 From: Doug Strain Date: Tue, 12 Jul 2022 06:55:35 -0700 Subject: [PATCH 4/6] Fix type check for real this time. --- cirq-core/cirq/contrib/acquaintance/topological_sort.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cirq-core/cirq/contrib/acquaintance/topological_sort.py b/cirq-core/cirq/contrib/acquaintance/topological_sort.py index 0da59538916..5defe1e7798 100644 --- a/cirq-core/cirq/contrib/acquaintance/topological_sort.py +++ b/cirq-core/cirq/contrib/acquaintance/topological_sort.py @@ -19,14 +19,13 @@ import networkx from cirq import ops -from cirq.contrib.circuitdag import CircuitDag if TYPE_CHECKING: import cirq def is_topologically_sorted( - dag: 'cirq.CircuitDag', + dag: 'cirq.contrib.CircuitDag', operations: 'cirq.OP_TREE', equals: Callable[[ops.Operation, ops.Operation], bool] = operator.eq, ) -> bool: From 22ecc345cb3a3114e2825d8e4adafffbbb09fd6d Mon Sep 17 00:00:00 2001 From: Doug Strain Date: Tue, 12 Jul 2022 10:25:30 -0700 Subject: [PATCH 5/6] Remove deprecated calls in examples/bcs_mean_field - This example was calling optimize_for_xmon - Use optimze_for_target_gateset instead. --- examples/bcs_mean_field.py | 7 +++---- examples/examples_test.py | 6 +----- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/examples/bcs_mean_field.py b/examples/bcs_mean_field.py index 227dfbe1e7e..6fd3031bef2 100644 --- a/examples/bcs_mean_field.py +++ b/examples/bcs_mean_field.py @@ -136,7 +136,6 @@ import numpy as np import scipy.optimize import cirq -import cirq_google def main(): @@ -166,7 +165,7 @@ def main(): bog_circuit = cirq.Circuit( bogoliubov_trans(upper_qubits[i], lower_qubits[i], bog_theta[i]) for i in range(n_site) ) - bog_circuit = cirq_google.optimized_for_xmon(bog_circuit) + bog_circuit = cirq.optimize_for_target_gateset(bog_circuit, gateset=cirq.CZTargetGateset) print('Circuit for the Bogoliubov transformation:') print(bog_circuit.to_text_diagram(transpose=True), '\n') @@ -175,7 +174,7 @@ def main(): fourier_circuit_spin_up = cirq.Circuit( fermi_fourier_trans_inverse_4(upper_qubits), strategy=cirq.InsertStrategy.EARLIEST ) - fourier_circuit_spin_up = cirq_google.optimized_for_xmon(fourier_circuit_spin_up) + fourier_circuit_spin_up = cirq.optimize_for_target_gateset(fourier_circuit_spin_up, gateset=cirq.CZTargetGateset) print(fourier_circuit_spin_up.to_text_diagram(transpose=True), '\n') # The inverse fermionic Fourier transformation on the spin-down states @@ -183,7 +182,7 @@ def main(): fourier_circuit_spin_down = cirq.Circuit( fermi_fourier_trans_inverse_conjugate_4(lower_qubits), strategy=cirq.InsertStrategy.EARLIEST ) - fourier_circuit_spin_down = cirq_google.optimized_for_xmon(fourier_circuit_spin_down) + fourier_circuit_spin_down = cirq.optimize_for_target_gateset(fourier_circuit_spin_down, gateset=cirq.CZTargetGateset) print(fourier_circuit_spin_down.to_text_diagram(transpose=True)) diff --git a/examples/examples_test.py b/examples/examples_test.py index 015ceb57a35..5f18a103360 100644 --- a/examples/examples_test.py +++ b/examples/examples_test.py @@ -69,11 +69,7 @@ def test_example_runs_quantum_fourier_transform(): def test_example_runs_bcs_mean_field(): - pytest.importorskip("cirq_google") - with cirq.testing.assert_deprecated( - 'Use cirq.optimize_for_target_gateset', deadline='v0.16', count=None - ): - examples.bcs_mean_field.main() + examples.bcs_mean_field.main() def test_example_runs_grover(): From 2f29dc0facd58058893ad8e9911e7b31db79512c Mon Sep 17 00:00:00 2001 From: Doug Strain Date: Tue, 12 Jul 2022 10:42:08 -0700 Subject: [PATCH 6/6] Fix type error --- examples/bcs_mean_field.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/examples/bcs_mean_field.py b/examples/bcs_mean_field.py index 6fd3031bef2..f6afa64fd82 100644 --- a/examples/bcs_mean_field.py +++ b/examples/bcs_mean_field.py @@ -165,7 +165,7 @@ def main(): bog_circuit = cirq.Circuit( bogoliubov_trans(upper_qubits[i], lower_qubits[i], bog_theta[i]) for i in range(n_site) ) - bog_circuit = cirq.optimize_for_target_gateset(bog_circuit, gateset=cirq.CZTargetGateset) + bog_circuit = cirq.optimize_for_target_gateset(bog_circuit, gateset=cirq.CZTargetGateset()) print('Circuit for the Bogoliubov transformation:') print(bog_circuit.to_text_diagram(transpose=True), '\n') @@ -174,7 +174,9 @@ def main(): fourier_circuit_spin_up = cirq.Circuit( fermi_fourier_trans_inverse_4(upper_qubits), strategy=cirq.InsertStrategy.EARLIEST ) - fourier_circuit_spin_up = cirq.optimize_for_target_gateset(fourier_circuit_spin_up, gateset=cirq.CZTargetGateset) + fourier_circuit_spin_up = cirq.optimize_for_target_gateset( + fourier_circuit_spin_up, gateset=cirq.CZTargetGateset() + ) print(fourier_circuit_spin_up.to_text_diagram(transpose=True), '\n') # The inverse fermionic Fourier transformation on the spin-down states @@ -182,7 +184,9 @@ def main(): fourier_circuit_spin_down = cirq.Circuit( fermi_fourier_trans_inverse_conjugate_4(lower_qubits), strategy=cirq.InsertStrategy.EARLIEST ) - fourier_circuit_spin_down = cirq.optimize_for_target_gateset(fourier_circuit_spin_down, gateset=cirq.CZTargetGateset) + fourier_circuit_spin_down = cirq.optimize_for_target_gateset( + fourier_circuit_spin_down, gateset=cirq.CZTargetGateset() + ) print(fourier_circuit_spin_down.to_text_diagram(transpose=True))