|
28 | 28 | from cirq.experiments.readout_confusion_matrix import TensoredConfusionMatrices
|
29 | 29 |
|
30 | 30 | if TYPE_CHECKING:
|
31 |
| - from cirq.experiments import SingleQubitReadoutCalibrationResult |
| 31 | + from cirq.experiments.single_qubit_readout_calibration import ( |
| 32 | + SingleQubitReadoutCalibrationResult, |
| 33 | + ) |
32 | 34 | from cirq.study import ResultDict
|
33 | 35 |
|
34 | 36 |
|
@@ -217,6 +219,11 @@ def _normalize_input_paulis(
|
217 | 219 | return cast(dict[circuits.FrozenCircuit, list[list[ops.PauliString]]], circuits_to_pauli)
|
218 | 220 |
|
219 | 221 |
|
| 222 | +def _extract_readout_qubits(pauli_strings: list[ops.PauliString]) -> list[ops.Qid]: |
| 223 | + """Extracts unique qubits from a list of QWC Pauli strings.""" |
| 224 | + return sorted(set(q for ps in pauli_strings for q in ps.qubits)) |
| 225 | + |
| 226 | + |
220 | 227 | def _pauli_strings_to_basis_change_ops(
|
221 | 228 | pauli_strings: list[ops.PauliString], qid_list: list[ops.Qid]
|
222 | 229 | ):
|
@@ -315,16 +322,38 @@ def _process_pauli_measurement_results(
|
315 | 322 | for pauli_group_index, circuit_result in enumerate(circuit_results):
|
316 | 323 | measurement_results = circuit_result.measurements["m"]
|
317 | 324 | pauli_strs = pauli_string_groups[pauli_group_index]
|
| 325 | + pauli_readout_qubits = _extract_readout_qubits(pauli_strs) |
| 326 | + |
| 327 | + calibration_result = ( |
| 328 | + calibration_results[tuple(pauli_readout_qubits)] |
| 329 | + if disable_readout_mitigation is False |
| 330 | + else None |
| 331 | + ) |
318 | 332 |
|
319 | 333 | for pauli_str in pauli_strs:
|
320 | 334 | qubits_sorted = sorted(pauli_str.qubits)
|
321 | 335 | qubit_indices = [qubits.index(q) for q in qubits_sorted]
|
322 | 336 |
|
323 |
| - confusion_matrices = ( |
324 |
| - _build_many_one_qubits_confusion_matrix(calibration_results[tuple(qubits_sorted)]) |
325 |
| - if disable_readout_mitigation is False |
326 |
| - else _build_many_one_qubits_empty_confusion_matrix(len(qubits_sorted)) |
327 |
| - ) |
| 337 | + if disable_readout_mitigation: |
| 338 | + pauli_str_calibration_result = None |
| 339 | + confusion_matrices = _build_many_one_qubits_empty_confusion_matrix( |
| 340 | + len(qubits_sorted) |
| 341 | + ) |
| 342 | + else: |
| 343 | + if calibration_result is None: |
| 344 | + # This case should be logically impossible if mitigation is on, |
| 345 | + # so we raise an error. |
| 346 | + raise ValueError( |
| 347 | + f"Readout mitigation is enabled, but no calibration result was " |
| 348 | + f"found for qubits {pauli_readout_qubits}." |
| 349 | + ) |
| 350 | + pauli_str_calibration_result = calibration_result.readout_result_for_qubits( |
| 351 | + qubits_sorted |
| 352 | + ) |
| 353 | + confusion_matrices = _build_many_one_qubits_confusion_matrix( |
| 354 | + pauli_str_calibration_result |
| 355 | + ) |
| 356 | + |
328 | 357 | tensored_cm = TensoredConfusionMatrices(
|
329 | 358 | confusion_matrices,
|
330 | 359 | [[q] for q in qubits_sorted],
|
@@ -356,11 +385,7 @@ def _process_pauli_measurement_results(
|
356 | 385 | mitigated_stddev=d_m_with_coefficient,
|
357 | 386 | unmitigated_expectation=unmitigated_value_with_coefficient,
|
358 | 387 | unmitigated_stddev=d_unmit_with_coefficient,
|
359 |
| - calibration_result=( |
360 |
| - calibration_results[tuple(qubits_sorted)] |
361 |
| - if disable_readout_mitigation is False |
362 |
| - else None |
363 |
| - ), |
| 388 | + calibration_result=pauli_str_calibration_result, |
364 | 389 | )
|
365 | 390 | )
|
366 | 391 |
|
@@ -428,8 +453,7 @@ def measure_pauli_strings(
|
428 | 453 | unique_qubit_tuples = set()
|
429 | 454 | for pauli_string_groups in normalized_circuits_to_pauli.values():
|
430 | 455 | for pauli_strings in pauli_string_groups:
|
431 |
| - for pauli_string in pauli_strings: |
432 |
| - unique_qubit_tuples.add(tuple(sorted(pauli_string.qubits))) |
| 456 | + unique_qubit_tuples.add(tuple(_extract_readout_qubits(pauli_strings))) |
433 | 457 | # qubits_list is a list of qubit tuples
|
434 | 458 | qubits_list = sorted(unique_qubit_tuples)
|
435 | 459 |
|
|
0 commit comments