From ba3cd1a036b55f03f2d1617d4aebaa6564b5857b Mon Sep 17 00:00:00 2001 From: Orion Martin <40585662+95-martin-orion@users.noreply.github.com> Date: Tue, 27 Sep 2022 10:22:00 -0700 Subject: [PATCH 1/3] Catch identities in expectation value calcs --- pybind_interface/pybind_main.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pybind_interface/pybind_main.cpp b/pybind_interface/pybind_main.cpp index 74fa3a313..6630f3412 100644 --- a/pybind_interface/pybind_main.cpp +++ b/pybind_interface/pybind_main.cpp @@ -797,6 +797,9 @@ class SimulatorHelper { const auto& opsum_qubits = std::get<1>(opsum_qubit_count_pair); if (opsum_qubits <= 6) { results.push_back(ExpectationValue(opsum, simulator, state)); + } else if (opsum_qubits == 0) { + // This represents an identity, whose EV is always 1. + results.push_back(1); } else { Fuser::Parameter params; params.max_fused_size = max_fused_size; From 1b6938e7f26884f9ac71a5cded2a21d40fa576a0 Mon Sep 17 00:00:00 2001 From: Orion Martin <40585662+95-martin-orion@users.noreply.github.com> Date: Tue, 27 Sep 2022 10:24:43 -0700 Subject: [PATCH 2/3] Add test for identity EVs --- qsimcirq_tests/qsimcirq_test.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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) From d3c401780e3e63ac932ccc41df7a9f112dc3629d Mon Sep 17 00:00:00 2001 From: Orion Martin <40585662+95-martin-orion@users.noreply.github.com> Date: Tue, 27 Sep 2022 11:29:23 -0700 Subject: [PATCH 3/3] order matters --- pybind_interface/pybind_main.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pybind_interface/pybind_main.cpp b/pybind_interface/pybind_main.cpp index 6630f3412..94d7cefa3 100644 --- a/pybind_interface/pybind_main.cpp +++ b/pybind_interface/pybind_main.cpp @@ -795,11 +795,11 @@ 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 if (opsum_qubits == 0) { - // This represents an identity, whose EV is always 1. - results.push_back(1); } else { Fuser::Parameter params; params.max_fused_size = max_fused_size;