diff --git a/cirq/sim/density_matrix_simulator.py b/cirq/sim/density_matrix_simulator.py index 23764b60766..fc9bd568bc1 100644 --- a/cirq/sim/density_matrix_simulator.py +++ b/cirq/sim/density_matrix_simulator.py @@ -168,7 +168,9 @@ def _run( resolved_circuit = protocols.resolve_parameters(circuit, param_resolver) check_all_resolved(resolved_circuit) - if circuit.are_all_measurements_terminal(): + if circuit.are_all_measurements_terminal() and not any( + circuit.findall_operations(lambda op: isinstance(op, circuits.CircuitOperation)) + ): return self._run_sweep_sample(resolved_circuit, repetitions) return self._run_sweep_repeat(resolved_circuit, repetitions) diff --git a/cirq/sim/density_matrix_simulator_test.py b/cirq/sim/density_matrix_simulator_test.py index bff9afe726b..ae5999de0e5 100644 --- a/cirq/sim/density_matrix_simulator_test.py +++ b/cirq/sim/density_matrix_simulator_test.py @@ -1275,6 +1275,18 @@ def test_simulate_noise_with_terminal_measurements(): assert result1 == result2 +def test_simulate_noise_with_subcircuit_measurements(): + q = cirq.LineQubit(0) + circuit1 = cirq.Circuit(cirq.measure(q)) + circuit2 = cirq.Circuit(cirq.CircuitOperation(cirq.Circuit(cirq.measure(q)).freeze())) + + simulator = cirq.DensityMatrixSimulator(noise=cirq.X) + result1 = simulator.run(circuit1, repetitions=10) + result2 = simulator.run(circuit2, repetitions=10) + + assert result1 == result2 + + def test_density_matrix_copy(): sim = cirq.DensityMatrixSimulator()