diff --git a/cirq/sim/act_on_args_container.py b/cirq/sim/act_on_args_container.py index 8e3d04c952d..9af69a42830 100644 --- a/cirq/sim/act_on_args_container.py +++ b/cirq/sim/act_on_args_container.py @@ -118,8 +118,9 @@ def _act_on_fallback_( protocols.act_on(action, op_args, act_on_qubits, allow_decompose=allow_decompose) # Decouple any measurements or resets - if self.split_untangled_states and isinstance( - gate, (ops.MeasurementGate, ops.ResetChannel) + if self.split_untangled_states and ( + isinstance(gate, ops.ResetChannel) + or (isinstance(gate, ops.MeasurementGate) and not op_args.ignore_measurement_results) ): for q in qubits: q_args, op_args = op_args.factor((q,), validate=False) diff --git a/cirq/sim/density_matrix_simulator_test.py b/cirq/sim/density_matrix_simulator_test.py index a378c132bef..d372a9f1169 100644 --- a/cirq/sim/density_matrix_simulator_test.py +++ b/cirq/sim/density_matrix_simulator_test.py @@ -571,6 +571,28 @@ def test_reset_one_qubit_does_not_affect_partial_trace_of_other_qubits( np.testing.assert_almost_equal(result.final_density_matrix, expected) +def test_ignore_measurements_remains_entangled(): + q0, q1 = cirq.LineQubit.range(2) + simulator1 = cirq.DensityMatrixSimulator( + ignore_measurement_results=True, split_untangled_states=False + ) + simulator2 = cirq.DensityMatrixSimulator( + ignore_measurement_results=True, split_untangled_states=True + ) + circuit = cirq.Circuit( + cirq.H(q0), + cirq.CX(q0, q1), + cirq.measure(q0), + ) + result1 = simulator1.simulate(circuit) + result2 = simulator2.simulate(circuit) + np.testing.assert_almost_equal(result2.final_density_matrix, result1.final_density_matrix) + expected = np.zeros((4, 4)) + expected[0, 0] = 0.5 + expected[3, 3] = 0.5 + np.testing.assert_almost_equal(result2.final_density_matrix, expected) + + @pytest.mark.parametrize( 'dtype,circuit', itertools.product(