Skip to content

Commit ccd85e5

Browse files
authored
Deprecate classes and paramters in contrib (quantumlib#5684)
* Deprecate classes and paramters in contrib - Deprecates parameters in contrib - Removes MergeNQubits and StrategyExecutor in favor of transformers
1 parent a35eac5 commit ccd85e5

File tree

7 files changed

+36
-118
lines changed

7 files changed

+36
-118
lines changed

cirq/contrib/acquaintance/__init__.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
from cirq.contrib.acquaintance.executor import (
2222
AcquaintanceOperation,
2323
GreedyExecutionStrategy,
24-
StrategyExecutor,
2524
StrategyExecutorTransformer,
2625
)
2726

cirq/contrib/acquaintance/executor.py

Lines changed: 4 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
import abc
1818
from collections import defaultdict
1919

20-
from cirq import circuits, devices, ops, protocols, transformers, _compat
20+
from cirq import circuits, devices, ops, protocols, transformers
2121

2222
from cirq.contrib.acquaintance.gates import AcquaintanceOpportunityGate
2323
from cirq.contrib.acquaintance.permutation import (
@@ -34,10 +34,10 @@
3434

3535

3636
class ExecutionStrategy(metaclass=abc.ABCMeta):
37-
"""Tells StrategyExecutor how to execute an acquaintance strategy.
37+
"""Tells `StrategyExecutorTransormer` how to execute an acquaintance strategy.
3838
39-
An execution strategy tells StrategyExecutor how to execute an
40-
acquaintance strategy, i.e. what gates to implement at the available
39+
An execution strategy tells `StrategyExecutorTransformer` how to execute
40+
an acquaintance strategy, i.e. what gates to implement at the available
4141
acquaintance opportunities."""
4242

4343
keep_acquaintance = False
@@ -78,45 +78,6 @@ def __call__(self, *args, **kwargs):
7878
return strategy.mapping
7979

8080

81-
@_compat.deprecated_class(
82-
deadline='v1.0', fix='Use cirq.contrib.acquaintance.StrategyExecutorTransformer'
83-
)
84-
class StrategyExecutor(circuits.PointOptimizer):
85-
"""Executes an acquaintance strategy."""
86-
87-
def __init__(self, execution_strategy: ExecutionStrategy) -> None:
88-
super().__init__()
89-
self.execution_strategy = execution_strategy
90-
self.mapping = execution_strategy.initial_mapping.copy()
91-
92-
def __call__(self, strategy: 'cirq.Circuit'):
93-
expose_acquaintance_gates(strategy)
94-
super().optimize_circuit(strategy)
95-
return self.mapping.copy()
96-
97-
def optimization_at(
98-
self, circuit: 'cirq.Circuit', index: int, op: 'cirq.Operation'
99-
) -> Optional['cirq.PointOptimizationSummary']:
100-
if isinstance(op.gate, AcquaintanceOpportunityGate):
101-
logical_indices = tuple(self.mapping[q] for q in op.qubits)
102-
logical_operations = self.execution_strategy.get_operations(logical_indices, op.qubits)
103-
clear_span = int(not self.execution_strategy.keep_acquaintance)
104-
105-
return circuits.PointOptimizationSummary(
106-
clear_span=clear_span, clear_qubits=op.qubits, new_operations=logical_operations
107-
)
108-
109-
if isinstance(op, ops.GateOperation) and isinstance(op.gate, PermutationGate):
110-
op.gate.update_mapping(self.mapping, op.qubits)
111-
return None
112-
113-
raise TypeError(
114-
'Can only execute a strategy consisting of gates that '
115-
'are instances of AcquaintanceOpportunityGate or '
116-
'PermutationGate.'
117-
)
118-
119-
12081
@transformers.transformer
12182
class StrategyExecutorTransformer:
12283
"""Executes an acquaintance strategy."""

cirq/contrib/acquaintance/executor_test.py

Lines changed: 5 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,7 @@ def _circuit_diagram_info_(self, args: cirq.CircuitDiagramInfoArgs):
3636
return self._wire_symbols
3737

3838

39-
@pytest.mark.parametrize(
40-
'StrategyType, is_deprecated',
41-
[[cca.StrategyExecutor, True], [cca.StrategyExecutorTransformer, False]],
42-
)
43-
def test_executor_explicit(StrategyType, is_deprecated):
39+
def test_executor_explicit():
4440
num_qubits = 8
4541
qubits = cirq.LineQubit.range(num_qubits)
4642
circuit = cca.complete_acquaintance_strategy(qubits, 2)
@@ -53,19 +49,9 @@ def test_executor_explicit(StrategyType, is_deprecated):
5349
initial_mapping = {q: i for i, q in enumerate(sorted(qubits))}
5450
execution_strategy = cca.GreedyExecutionStrategy(gates, initial_mapping)
5551

56-
if is_deprecated:
57-
with cirq.testing.assert_deprecated(
58-
"Use cirq.contrib.acquaintance.StrategyExecutorTransformer", deadline='v1.0'
59-
):
60-
executor = StrategyType(execution_strategy)
61-
with pytest.raises(TypeError):
62-
op = cirq.X(qubits[0])
63-
bad_strategy = cirq.Circuit(op)
64-
executor.optimization_at(bad_strategy, 0, op)
65-
else:
66-
with pytest.raises(ValueError):
67-
executor = StrategyType(None)
68-
executor = StrategyType(execution_strategy)
52+
with pytest.raises(ValueError):
53+
executor = cca.StrategyExecutorTransformer(None)
54+
executor = cca.StrategyExecutorTransformer(execution_strategy)
6955

7056
with pytest.raises(NotImplementedError):
7157
bad_gates = {(0,): ExampleGate(['0']), (0, 1): ExampleGate(['0', '1'])}
@@ -75,10 +61,7 @@ def test_executor_explicit(StrategyType, is_deprecated):
7561
bad_strategy = cirq.Circuit(cirq.X(qubits[0]))
7662
executor(bad_strategy)
7763

78-
if is_deprecated:
79-
executor(circuit)
80-
else:
81-
circuit = executor(circuit)
64+
circuit = executor(circuit)
8265
expected_text_diagram = """
8366
0: ───0───1───╲0╱─────────────────1───3───╲0╱─────────────────3───5───╲0╱─────────────────5───7───╲0╱─────────────────
8467
│ │ │ │ │ │ │ │ │ │ │ │

cirq/contrib/paulistring/recombine_test.py

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
14-
import pytest
1514

1615
import cirq
1716
from cirq.contrib.paulistring import (
@@ -28,7 +27,6 @@ def _assert_no_multi_qubit_pauli_strings(circuit: cirq.Circuit) -> None:
2827

2928

3029
def test_move_non_clifford_into_clifford():
31-
cg = pytest.importorskip("cirq_google")
3230
q0, q1, q2 = cirq.LineQubit.range(3)
3331
c_orig = cirq.testing.nonoptimal_toffoli_circuit(q0, q1, q2)
3432

@@ -43,11 +41,9 @@ def test_move_non_clifford_into_clifford():
4341
_assert_no_multi_qubit_pauli_strings(c_recombined1)
4442
_assert_no_multi_qubit_pauli_strings(c_recombined2)
4543

46-
with cirq.testing.assert_deprecated(
47-
'Use cirq.optimize_for_target_gateset', deadline='v0.16', count=None
48-
):
49-
baseline_len = len(cg.optimized_for_xmon(c_orig))
50-
opt_len1 = len(cg.optimized_for_xmon(c_recombined1))
51-
opt_len2 = len(cg.optimized_for_xmon(c_recombined2))
52-
assert opt_len1 <= baseline_len
53-
assert opt_len2 <= baseline_len
44+
gateset = cirq.CZTargetGateset()
45+
baseline_len = len(cirq.optimize_for_target_gateset(c_orig, gateset=gateset))
46+
opt_len1 = len(cirq.optimize_for_target_gateset(c_recombined1, gateset=gateset))
47+
opt_len2 = len(cirq.optimize_for_target_gateset(c_recombined2, gateset=gateset))
48+
assert opt_len1 <= baseline_len
49+
assert opt_len2 <= baseline_len

cirq/contrib/quimb/__init__.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,7 @@
1212
circuit_to_density_matrix_tensors,
1313
)
1414

15-
from cirq.contrib.quimb.grid_circuits import (
16-
simplify_expectation_value_circuit,
17-
MergeNQubitGates,
18-
get_grid_moments,
19-
)
15+
from cirq.contrib.quimb.grid_circuits import simplify_expectation_value_circuit, get_grid_moments
2016

2117
from cirq.contrib.quimb.mps_simulator import (
2218
MPSOptions,

cirq/contrib/quimb/grid_circuits.py

Lines changed: 15 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,18 @@
1-
# pylint: disable=wrong-or-nonexistent-copyright-notice
2-
from typing import Optional, Iterator
1+
# Copyright 2022 The Cirq Developers
2+
#
3+
# Licensed under the Apache License, Version 2.0 (the "License");
4+
# you may not use this file except in compliance with the License.
5+
# You may obtain a copy of the License at
6+
#
7+
# https://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS,
11+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
# See the License for the specific language governing permissions and
13+
# limitations under the License.
14+
15+
from typing import Iterator
316

417
import networkx as nx
518

@@ -89,37 +102,6 @@ def _interaction(
89102
)
90103

91104

92-
@cirq._compat.deprecated_class(deadline='v0.16', fix="Use cirq.merge_k_qubit_unitaries")
93-
class MergeNQubitGates(cirq.PointOptimizer):
94-
"""Optimizes runs of adjacent unitary n-qubit operations."""
95-
96-
def __init__(self, *, n_qubits: int):
97-
super().__init__()
98-
self.n_qubits = n_qubits
99-
100-
def optimization_at(
101-
self, circuit: cirq.Circuit, index: int, op: cirq.Operation
102-
) -> Optional[cirq.PointOptimizationSummary]:
103-
if len(op.qubits) != self.n_qubits:
104-
return None
105-
106-
frontier = {q: index for q in op.qubits}
107-
op_list = circuit.findall_operations_until_blocked(
108-
frontier, is_blocker=lambda next_op: next_op.qubits != op.qubits
109-
)
110-
if len(op_list) <= 1:
111-
return None
112-
operations = [op for idx, op in op_list]
113-
indices = [idx for idx, op in op_list]
114-
matrix = cirq.linalg.dot(*(cirq.unitary(op) for op in operations[::-1]))
115-
116-
return cirq.PointOptimizationSummary(
117-
clear_span=max(indices) + 1 - index,
118-
clear_qubits=op.qubits,
119-
new_operations=[cirq.MatrixGate(matrix).on(*op.qubits)],
120-
)
121-
122-
123105
def simplify_expectation_value_circuit(circuit_sand: cirq.Circuit):
124106
"""For low weight operators on low-degree circuits, we can simplify
125107
the circuit representation of an expectation value.

cirq/contrib/quimb/mps_simulator_test.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -469,15 +469,16 @@ def test_state_copy():
469469

470470

471471
def test_simulation_state_initializer():
472+
expected_classical_data = cirq.ClassicalDataDictionaryStore(
473+
_records={cirq.MeasurementKey('test'): [(4,)]}
474+
)
472475
s = ccq.mps_simulator.MPSState(
473476
qubits=(cirq.LineQubit(0),),
474477
prng=np.random.RandomState(0),
475-
classical_data=cirq.ClassicalDataDictionaryStore(
476-
_records={cirq.MeasurementKey('test'): [(4,)]}
477-
),
478+
classical_data=expected_classical_data,
478479
)
479480
assert s.qubits == (cirq.LineQubit(0),)
480-
assert s.log_of_measurement_results == {'test': [4]}
481+
assert s.classical_data == expected_classical_data
481482

482483

483484
def test_act_on_gate():

0 commit comments

Comments
 (0)