Skip to content

Commit 8750e8c

Browse files
authored
Refactor drop_negligible into an OptimizationPass using batch_remove (#695)
1 parent 2e62aa0 commit 8750e8c

File tree

2 files changed

+15
-23
lines changed

2 files changed

+15
-23
lines changed

cirq/circuits/drop_negligible.py

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,17 @@
1414

1515
"""An optimization pass that removes operations with tiny effects."""
1616

17-
from typing import Optional
17+
from typing import TYPE_CHECKING
1818

1919
from cirq import ops, extension
2020
from cirq.circuits import optimization_pass, circuit as _circuit
2121

22+
if TYPE_CHECKING:
23+
# pylint: disable=unused-import
24+
from typing import List, Tuple
2225

23-
class DropNegligible(optimization_pass.PointOptimizer):
26+
27+
class DropNegligible(optimization_pass.OptimizationPass):
2428
"""An optimization pass that removes operations with tiny effects."""
2529

2630
def __init__(self,
@@ -29,18 +33,12 @@ def __init__(self,
2933
self.tolerance = tolerance
3034
self.extensions = extensions or extension.Extensions()
3135

32-
def optimization_at(
33-
self,
34-
circuit: _circuit.Circuit,
35-
index: int,
36-
op: ops.Operation
37-
) -> Optional[optimization_pass.PointOptimizationSummary]:
38-
39-
bounded = self.extensions.try_cast(ops.BoundedEffect, op)
40-
if bounded is None or bounded.trace_distance_bound() > self.tolerance:
41-
return None
42-
43-
return optimization_pass.PointOptimizationSummary(
44-
clear_span=1,
45-
new_operations=(),
46-
clear_qubits=op.qubits)
36+
def optimize_circuit(self, circuit: _circuit.Circuit) -> None:
37+
deletions = [] # type: List[Tuple[int, ops.Operation]]
38+
for moment_index, moment in enumerate(circuit):
39+
for op in moment.operations:
40+
bounded = self.extensions.try_cast(ops.BoundedEffect, op)
41+
if (bounded is not None and
42+
bounded.trace_distance_bound() <= self.tolerance):
43+
deletions.append((moment_index, op))
44+
circuit.batch_remove(deletions)

cirq/circuits/drop_negligible_test.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ def test_leaves_big():
2727
drop = cirq.DropNegligible(0.001)
2828
a = cirq.NamedQubit('a')
2929
circuit = cirq.Circuit([cirq.Moment([cirq.Z(a)**0.1])])
30-
assert drop.optimization_at(circuit, 0, circuit.operation_at(a, 0)) is None
3130

3231
assert_optimizes(optimizer=drop,
3332
initial_circuit=circuit,
@@ -39,11 +38,6 @@ def test_clears_small():
3938
a = cirq.NamedQubit('a')
4039
circuit = cirq.Circuit([cirq.Moment([cirq.Z(a)**0.000001])])
4140

42-
assert (drop.optimization_at(circuit, 0, circuit.operation_at(a, 0)) ==
43-
cirq.PointOptimizationSummary(clear_span=1,
44-
clear_qubits=[a],
45-
new_operations=[]))
46-
4741
assert_optimizes(optimizer=drop,
4842
initial_circuit=circuit,
4943
expected_circuit=cirq.Circuit([cirq.Moment()]))

0 commit comments

Comments
 (0)