Skip to content

Commit

Permalink
Modify PointOptimizer to handle multiple modified gates acting on the…
Browse files Browse the repository at this point in the history
… same qubit in a moment (#3016)

To fix #2990
  • Loading branch information
tanujkhattar committed Jul 17, 2020
1 parent 12a2a9a commit 8ccca1b
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 1 deletion.
14 changes: 13 additions & 1 deletion cirq/circuits/optimization_pass.py
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,18 @@ def optimize_circuit(self, circuit: Circuit):
[e for e in range(i, i + opt.clear_span)])
new_operations = self.post_clean_up(
cast(Tuple[ops.Operation], opt.new_operations))
circuit.insert_at_frontier(new_operations, i, frontier)

flat_new_operations = tuple(ops.flatten_to_ops(new_operations))

new_qubits = set()
for flat_op in flat_new_operations:
for q in flat_op.qubits:
new_qubits.add(q)

if not new_qubits.issubset(set(opt.clear_qubits)):
raise ValueError(
'New operations in PointOptimizer should not act on new'
' qubits.')

circuit.insert_at_frontier(flat_new_operations, i, frontier)
i += 1
18 changes: 18 additions & 0 deletions cirq/circuits/optimization_pass_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.

import pytest
import cirq
from cirq import PointOptimizer, PointOptimizationSummary
from cirq.testing import EqualsTester
Expand Down Expand Up @@ -142,6 +143,23 @@ def clean_up(operations):
assert actual_text_diagram == expected_text_diagram


def test_point_optimizer_raises_on_gates_changing_qubits():

class EverythingIs42(cirq.PointOptimizer):
"""Changes all single qubit operations to act on LineQubit(42)"""

def optimization_at(self, circuit, index, op):
if len(op.qubits) == 1:
new_op = op.gate(cirq.LineQubit(42))
return cirq.PointOptimizationSummary(clear_span=1,
clear_qubits=op.qubits,
new_operations=new_op)

c = cirq.Circuit(cirq.X(cirq.LineQubit(0)), cirq.X(cirq.LineQubit(1)))
with pytest.raises(ValueError, match='new qubits'):
EverythingIs42().optimize_circuit(c)


def test_repr():
assert repr(cirq.PointOptimizationSummary(clear_span=0, clear_qubits=[
], new_operations=[])) == 'cirq.PointOptimizationSummary(0, (), ())'

0 comments on commit 8ccca1b

Please sign in to comment.