diff --git a/pybind_interface/pybind_main.cpp b/pybind_interface/pybind_main.cpp index 74fa3a313..94d7cefa3 100644 --- a/pybind_interface/pybind_main.cpp +++ b/pybind_interface/pybind_main.cpp @@ -795,7 +795,10 @@ class SimulatorHelper { for (const auto& opsum_qubit_count_pair : opsums_and_qubit_counts) { const auto& opsum = std::get<0>(opsum_qubit_count_pair); const auto& opsum_qubits = std::get<1>(opsum_qubit_count_pair); - if (opsum_qubits <= 6) { + if (opsum_qubits == 0) { + // This represents an identity, which always has EV=1. + results.push_back(std::complex(1.0, 0.0)); + } else if (opsum_qubits <= 6) { results.push_back(ExpectationValue(opsum, simulator, state)); } else { Fuser::Parameter params; diff --git a/qsimcirq_tests/qsimcirq_test.py b/qsimcirq_tests/qsimcirq_test.py index 8a92537f3..26e4f7d8e 100644 --- a/qsimcirq_tests/qsimcirq_test.py +++ b/qsimcirq_tests/qsimcirq_test.py @@ -523,18 +523,19 @@ def test_expectation_values(mode: str): ] psum1 = cirq.Z(a) + 3 * cirq.X(b) psum2 = cirq.X(a) - 3 * cirq.Z(b) + psum3 = cirq.I(a) if mode == "noisy": circuit.append(NoiseTrigger().on(a)) qsim_simulator = qsimcirq.QSimSimulator() qsim_result = qsim_simulator.simulate_expectation_values_sweep( - circuit, [psum1, psum2], params + circuit, [psum1, psum2, psum3], params ) cirq_simulator = cirq.Simulator() cirq_result = cirq_simulator.simulate_expectation_values_sweep( - circuit, [psum1, psum2], params + circuit, [psum1, psum2, psum3], params ) assert cirq.approx_eq(qsim_result, cirq_result, atol=1e-6)