Skip to content

insertion_sort_transformer causes "Measurement key missing" with classical control #7472

Open
@YaegakiY

Description

@YaegakiY

Describe the issue

Using insertion_sort_transformer on a circuit that contains a CircuitOperation controlled by a measurement key results in a ValueError. The error disappears when using defer_measurements, or if the transformer is not applied.

Explain how to reproduce the bug or problem

To reproduce:

import cirq
from cirq.transformers import *

q = cirq.LineQubit.range(3)
circuit = cirq.Circuit()


sub_circuit = cirq.Circuit() 

sub_circuit.append(cirq.X(q[0]).controlled_by(q[1]))

sub_op = cirq.CircuitOperation(sub_circuit.freeze()) 
circuit.append(cirq.measure(q[2], key="c"))
circuit.append(sub_op.with_classical_controls("c")) 

circuit.append(cirq.measure(q, key="m"))

# circuit = defer_measurements(circuit)

circuit = insertion_sort_transformer(circuit)
simulator = cirq.Simulator() 
result = simulator.run(circuit, repetitions=500) 
print(result.histogram(key='m'))

Traceback (most recent call last):
File "C:\Users\temp_test.py", line 22, in
result = simulator.run(circuit, repetitions=500)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\venv\Lib\site-packages\cirq\work\sampler.py", line 68, in run
return self.run_sweep(program, param_resolver, repetitions)[0]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\venv\Lib\site-packages\cirq\sim\simulator.py", line 59, in run_sweep
return list(self.run_sweep_iter(program, params, repetitions))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\venv\Lib\site-packages\cirq\sim\simulator.py", line 90, in run_sweep_iter
records = self._run(
^^^^^^^^^^
File "C:\Users\venv\Lib\site-packages\cirq\sim\simulator_base.py", line 249, in _run
for step_result in self._core_iterator(
^^^^^^^^^^^^^^^^^^^^
File "C:\Users\venv\Lib\site-packages\cirq\sim\simulator_base.py", line 209, in _core_iterator
protocols.act_on(op, sim_state)
File "C:\Users\venv\Lib\site-packages\cirq\protocols\act_on_protocol.py", line 143, in act_on
result = action_act_on(sim_state) if is_op else action_act_on(sim_state, qubits)
^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\venv\Lib\site-packages\cirq\ops\classically_controlled_operation.py", line 205, in act_on
if all(c.resolve(sim_state.classical_data) for c in self._conditions):
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\venv\Lib\site-packages\cirq\ops\classically_controlled_operation.py", line 205, in
if all(c.resolve(sim_state.classical_data) for c in self._conditions):
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\venv\Lib\site-packages\cirq\value\condition.py", line 110, in resolve
raise ValueError(f'Measurement key {self.key} missing when testing classical control')
ValueError: Measurement key c missing when testing classical control

Tell us the version of Cirq where this happens

1.6.0.dev20250702012506

Metadata

Metadata

Assignees

No one assigned

    Labels

    area/transformerskind/bug-reportSomething doesn't seem to work.triage/discussNeeds decision / discussion, bring these up during Cirq Cynque

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions