Describe the issue
circuit.insert uses a helper method _group_into_moment_compatible to group operations that can be placed in the same moment, before attempting to insert them.
_group_into_moment_compatible doesn't check measurement and control keys, and so two possibly incompatible operations can be placed in the same moment.
Note that this happens only if strategy EARLIEST is used with an insertion index less than the number of moments. If the operations are always appended at the end of the circuit, then _PlacementCache is used, which checks for measurement and control keys.
Other helper methods for circuit.insert also check measurement and control keys (example).
It seems to me circuit.insert is inconsistent and I would like to understand what needs to be checked:
- can two operations that measure qubits and have the same measurement key be in the same moment? For example,
cirq.measure(q0, key="k") and cirq.measure(q1, key="k").
- can two operations that use the same key for measurement and control be in the same moment? For example,
cirq.measure(q0, key="k") followed by cirq.X(q1).with_classical_controls("k").
See also this comment by @daxfohl that mentioned that multiple measurements to the same key in the same moment was a requirement from the HW team.
Adding @ikd-sci and @chriseclectic for feedback if the current behavior is needed in some situations.
Explain how to reproduce the bug or problem
import cirq
q0, q1 = cirq.LineQubit.range(2)
c = cirq.Circuit(cirq.X(q0), cirq.X(q1))
ops_to_insert = [cirq.measure(q0, key="k"), cirq.X(q1).with_classical_controls("k")]
c.insert(0, ops_to_insert, strategy=cirq.InsertStrategy.EARLIEST)
print(repr(c))
Output:
cirq.Circuit([
cirq.Moment(
cirq.measure(cirq.LineQubit(0), key=cirq.MeasurementKey(name='k')),
cirq.ClassicallyControlledOperation(cirq.X(cirq.LineQubit(1)), [cirq.KeyCondition(cirq.MeasurementKey(name='k'))]),
),
cirq.Moment(
cirq.X(cirq.LineQubit(0)),
cirq.X(cirq.LineQubit(1)),
),
])
Tell us the version of Cirq where this happens
1.7.0.dev0
Describe the issue
circuit.insertuses a helper method_group_into_moment_compatibleto group operations that can be placed in the same moment, before attempting to insert them._group_into_moment_compatibledoesn't check measurement and control keys, and so two possibly incompatible operations can be placed in the same moment.Note that this happens only if strategy
EARLIESTis used with an insertion index less than the number of moments. If the operations are always appended at the end of the circuit, then _PlacementCache is used, which checks for measurement and control keys.Other helper methods for
circuit.insertalso check measurement and control keys (example).It seems to me
circuit.insertis inconsistent and I would like to understand what needs to be checked:cirq.measure(q0, key="k")andcirq.measure(q1, key="k").cirq.measure(q0, key="k")followed bycirq.X(q1).with_classical_controls("k").See also this comment by @daxfohl that mentioned that multiple measurements to the same key in the same moment was a requirement from the HW team.
Adding @ikd-sci and @chriseclectic for feedback if the current behavior is needed in some situations.
Explain how to reproduce the bug or problem
Output:
Tell us the version of Cirq where this happens
1.7.0.dev0