From 121db7452381c4b8c3b64ff289b98f431524a076 Mon Sep 17 00:00:00 2001 From: Kerry Zhou <51468793+KerryZhou1024@users.noreply.github.com> Date: Wed, 9 Jul 2025 16:00:31 -0500 Subject: [PATCH 1/3] Change use of measurements to records in tomography + fix formatting --- .../experiments/qubit_characterizations.py | 18 +++++++++++------ .../qubit_characterizations_test.py | 20 ++++++++++++------- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/cirq-core/cirq/experiments/qubit_characterizations.py b/cirq-core/cirq/experiments/qubit_characterizations.py index 5dbc22e9a6e..8f97dbbae4b 100644 --- a/cirq-core/cirq/experiments/qubit_characterizations.py +++ b/cirq-core/cirq/experiments/qubit_characterizations.py @@ -527,18 +527,24 @@ def single_qubit_state_tomography( Returns: A TomographyResult object that stores and plots the density matrix. """ - circuit_z = circuit + circuits.Circuit(ops.measure(qubit, key='z')) + keys = protocols.measurement_key_names(circuit) + tomo_key = "tomo_key" + while tomo_key in keys: + tomo_key = f"tomo_key{uuid.uuid4().hex}" + + circuit_z = circuit + circuit.Circuit(ops.measure(qubit, key=tomo_key)) + results = sampler.run(circuit_z, repetitions=repetitions) - rho_11 = np.mean(results.measurements['z']) + rho_11 = np.mean(results.records[tomo_key][:, -1, :]) rho_00 = 1.0 - rho_11 - circuit_x = circuits.Circuit(circuit, ops.X(qubit) ** 0.5, ops.measure(qubit, key='z')) + circuit_x = circuits.Circuit(circuit, ops.X(qubit) ** 0.5, ops.measure(qubit, key=tomo_key)) results = sampler.run(circuit_x, repetitions=repetitions) - rho_01_im = np.mean(results.measurements['z']) - 0.5 + rho_01_im = np.mean(results.records[tomo_key][:, -1, :]) - 0.5 - circuit_y = circuits.Circuit(circuit, ops.Y(qubit) ** -0.5, ops.measure(qubit, key='z')) + circuit_y = circuits.Circuit(circuit, ops.Y(qubit) ** -0.5, ops.measure(qubit, key=tomo_key)) results = sampler.run(circuit_y, repetitions=repetitions) - rho_01_re = 0.5 - np.mean(results.measurements['z']) + rho_01_re = 0.5 - np.mean(results.records[tomo_key][:, -1, :]) rho_01 = rho_01_re + 1j * rho_01_im rho_10 = np.conj(rho_01) diff --git a/cirq-core/cirq/experiments/qubit_characterizations_test.py b/cirq-core/cirq/experiments/qubit_characterizations_test.py index 6e792c16477..8904638c49b 100644 --- a/cirq-core/cirq/experiments/qubit_characterizations_test.py +++ b/cirq-core/cirq/experiments/qubit_characterizations_test.py @@ -152,24 +152,30 @@ def test_two_qubit_randomized_benchmarking(): def test_single_qubit_state_tomography(): # Check that the density matrices of the output states of X/2, Y/2 and # H + Y gates closely match the ideal cases. + # Checks that unique tomography keys are generated simulator = sim.Simulator() - qubit = GridQubit(0, 0) + q_0 = GridQubit(0, 0) + q_1 = GridQubit(0, 1) - circuit_1 = circuits.Circuit(ops.X(qubit) ** 0.5) - circuit_2 = circuits.Circuit(ops.Y(qubit) ** 0.5) - circuit_3 = circuits.Circuit(ops.H(qubit), ops.Y(qubit)) + circuit_1 = circuits.Circuit(ops.X(q_0) ** 0.5) + circuit_2 = circuits.Circuit(ops.Y(q_0) ** 0.5) + circuit_3 = circuits.Circuit(ops.H(q_0), ops.Y(q_0)) + circuit_4 = circuits.Circuit(ops.H(q_0), ops.Y(q_0), cirq.measure(q_1, key='z')) - act_rho_1 = single_qubit_state_tomography(simulator, qubit, circuit_1, 1000).data - act_rho_2 = single_qubit_state_tomography(simulator, qubit, circuit_2, 1000).data - act_rho_3 = single_qubit_state_tomography(simulator, qubit, circuit_3, 1000).data + act_rho_1 = single_qubit_state_tomography(simulator, q_0, circuit_1, 1000).data + act_rho_2 = single_qubit_state_tomography(simulator, q_0, circuit_2, 1000).data + act_rho_3 = single_qubit_state_tomography(simulator, q_0, circuit_3, 1000).data + act_rho_4 = single_qubit_state_tomography(simulator, q_0, circuit_4, 1000).data tar_rho_1 = np.array([[0.5, 0.5j], [-0.5j, 0.5]]) tar_rho_2 = np.array([[0.5, 0.5], [0.5, 0.5]]) tar_rho_3 = np.array([[0.5, -0.5], [-0.5, 0.5]]) + tar_rho_4 = np.array([[0.5, -0.5], [-0.5, 0.5]]) np.testing.assert_almost_equal(act_rho_1, tar_rho_1, decimal=1) np.testing.assert_almost_equal(act_rho_2, tar_rho_2, decimal=1) np.testing.assert_almost_equal(act_rho_3, tar_rho_3, decimal=1) + np.testing.assert_almost_equal(act_rho_4, tar_rho_4, decimal=1) def test_two_qubit_state_tomography(): From e8b9c9fe302d314e8b7772386e6670664463319b Mon Sep 17 00:00:00 2001 From: Kerry Zhou <51468793+KerryZhou1024@users.noreply.github.com> Date: Wed, 9 Jul 2025 17:25:15 -0500 Subject: [PATCH 2/3] Typo fix + import uuid --- cirq-core/cirq/experiments/qubit_characterizations.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cirq-core/cirq/experiments/qubit_characterizations.py b/cirq-core/cirq/experiments/qubit_characterizations.py index 4a10bfa2a7e..b33eb83184a 100644 --- a/cirq-core/cirq/experiments/qubit_characterizations.py +++ b/cirq-core/cirq/experiments/qubit_characterizations.py @@ -17,6 +17,7 @@ import dataclasses import functools import itertools +import uuid from typing import Any, cast, Iterator, Mapping, Sequence, TYPE_CHECKING import attrs @@ -636,7 +637,7 @@ def single_qubit_state_tomography( while tomo_key in keys: tomo_key = f"tomo_key{uuid.uuid4().hex}" - circuit_z = circuit + circuit.Circuit(ops.measure(qubit, key=tomo_key)) + circuit_z = circuit + circuits.Circuit(ops.measure(qubit, key=tomo_key)) results = sampler.run(circuit_z, repetitions=repetitions) rho_11 = np.mean(results.records[tomo_key][:, -1, :]) From 25bdebeb763a903fe4d20ab23af89a4b4df52194 Mon Sep 17 00:00:00 2001 From: Kerry Zhou <51468793+KerryZhou1024@users.noreply.github.com> Date: Thu, 10 Jul 2025 10:15:10 -0500 Subject: [PATCH 3/3] Add a circuit with 'tomo_key' to test key collision handling to fix coverage issues --- cirq-core/cirq/experiments/qubit_characterizations_test.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cirq-core/cirq/experiments/qubit_characterizations_test.py b/cirq-core/cirq/experiments/qubit_characterizations_test.py index 4975c1f3742..d14245e433c 100644 --- a/cirq-core/cirq/experiments/qubit_characterizations_test.py +++ b/cirq-core/cirq/experiments/qubit_characterizations_test.py @@ -166,21 +166,25 @@ def test_single_qubit_state_tomography(): circuit_2 = circuits.Circuit(ops.Y(q_0) ** 0.5) circuit_3 = circuits.Circuit(ops.H(q_0), ops.Y(q_0)) circuit_4 = circuits.Circuit(ops.H(q_0), ops.Y(q_0), cirq.measure(q_1, key='z')) + circuit_5 = circuits.Circuit(ops.H(q_0), ops.Y(q_0), cirq.measure(q_1, key='tomo_key')) act_rho_1 = single_qubit_state_tomography(simulator, q_0, circuit_1, 1000).data act_rho_2 = single_qubit_state_tomography(simulator, q_0, circuit_2, 1000).data act_rho_3 = single_qubit_state_tomography(simulator, q_0, circuit_3, 1000).data act_rho_4 = single_qubit_state_tomography(simulator, q_0, circuit_4, 1000).data + act_rho_5 = single_qubit_state_tomography(simulator, q_0, circuit_5, 1000).data tar_rho_1 = np.array([[0.5, 0.5j], [-0.5j, 0.5]]) tar_rho_2 = np.array([[0.5, 0.5], [0.5, 0.5]]) tar_rho_3 = np.array([[0.5, -0.5], [-0.5, 0.5]]) tar_rho_4 = np.array([[0.5, -0.5], [-0.5, 0.5]]) + tar_rho_5 = np.array([[0.5, -0.5], [-0.5, 0.5]]) np.testing.assert_almost_equal(act_rho_1, tar_rho_1, decimal=1) np.testing.assert_almost_equal(act_rho_2, tar_rho_2, decimal=1) np.testing.assert_almost_equal(act_rho_3, tar_rho_3, decimal=1) np.testing.assert_almost_equal(act_rho_4, tar_rho_4, decimal=1) + np.testing.assert_almost_equal(act_rho_5, tar_rho_5, decimal=1) def test_two_qubit_state_tomography():