Skip to content

Commit 72c0600

Browse files
committed
Fix format and coverage. Also optimize group pauli tests to make them finish quicker.
1 parent d7ec4a2 commit 72c0600

File tree

2 files changed

+31
-16
lines changed

2 files changed

+31
-16
lines changed

cirq-core/cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ def _normalize_input_paulis(
195195
circuits_to_pauli: Union[
196196
Dict[circuits.FrozenCircuit, list[ops.PauliString]],
197197
Dict[circuits.FrozenCircuit, list[list[ops.PauliString]]],
198-
]
198+
],
199199
) -> Dict[circuits.FrozenCircuit, list[list[ops.PauliString]]]:
200200
first_value = next(iter(circuits_to_pauli.values()))
201201
if (

cirq-core/cirq/contrib/paulistring/pauli_string_measurement_with_readout_mitigation_test.py

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,9 @@ def _generate_random_pauli_string(
5252

5353

5454
def _generate_qwc_paulis(
55-
input_pauli: cirq.PauliString, exclude_input_pauli: bool = False
55+
input_pauli: cirq.PauliString, num_output: int, exclude_input_pauli: bool = False
5656
) -> list[cirq.PauliString]:
57-
"""Generates all PauliStrings that are Qubit-Wise Commuting (QWC)
57+
"""Generates PauliStrings that are Qubit-Wise Commuting (QWC)
5858
with the input_pauli.
5959
6060
All operations in input_pauli must not be pauli I.
@@ -67,7 +67,7 @@ def _generate_qwc_paulis(
6767

6868
allowed_pauli_op = []
6969
if pauli_op == cirq.I:
70-
allowed_pauli_op = [cirq.I, cirq.X, cirq.Y, cirq.Z]
70+
allowed_pauli_op = [cirq.I, cirq.X, cirq.Y, cirq.Z] # pragma: no cover
7171
elif pauli_op == cirq.X:
7272
allowed_pauli_op = [cirq.I, cirq.X]
7373
elif pauli_op == cirq.Y:
@@ -86,12 +86,12 @@ def _generate_qwc_paulis(
8686

8787
qwc_pauli: cirq.PauliString = cirq.PauliString(pauli_dict)
8888
if exclude_input_pauli and qwc_pauli == input_pauli:
89-
continue
89+
continue # pragma: no cover
9090
if all(q == cirq.I for q in qwc_pauli):
9191
continue
9292
qwc_paulis.append(qwc_pauli)
9393

94-
return qwc_paulis
94+
return qwc_paulis if num_output > len(qwc_paulis) else random.sample(qwc_paulis, num_output)
9595

9696

9797
def _ideal_expectation_based_on_pauli_string(
@@ -209,10 +209,11 @@ def test_group_pauli_string_measurement_errors_no_noise_with_coefficient() -> No
209209
circuits_to_pauli: Dict[cirq.FrozenCircuit, list[list[cirq.PauliString]]] = {}
210210
circuits_to_pauli[circuit] = [
211211
_generate_qwc_paulis(
212-
_generate_random_pauli_string(qubits, enable_coeff=True, allow_pauli_i=False), True
212+
_generate_random_pauli_string(qubits, enable_coeff=True, allow_pauli_i=False), 100, True
213213
)
214214
for _ in range(3)
215215
]
216+
circuits_to_pauli[circuit].append([cirq.PauliString({q: cirq.X for q in qubits})])
216217

217218
circuits_with_pauli_expectations = measure_pauli_strings(
218219
circuits_to_pauli, sampler, 100, 100, 100, 100
@@ -309,7 +310,7 @@ def test_group_pauli_string_measurement_errors_with_noise() -> None:
309310
circuits_to_pauli: Dict[cirq.FrozenCircuit, list[list[cirq.PauliString]]] = {}
310311
circuits_to_pauli[circuit] = [
311312
_generate_qwc_paulis(
312-
_generate_random_pauli_string(qubits, enable_coeff=True, allow_pauli_i=False)
313+
_generate_random_pauli_string(qubits, enable_coeff=True, allow_pauli_i=False), 5
313314
)
314315
]
315316

@@ -446,9 +447,9 @@ def test_allow_group_pauli_measurement_without_readout_mitigation() -> None:
446447

447448
circuits_to_pauli: Dict[cirq.FrozenCircuit, list[list[cirq.PauliString]]] = {}
448449
circuits_to_pauli[circuit] = [
449-
_generate_qwc_paulis(_generate_random_pauli_string(qubits, True), True),
450-
_generate_qwc_paulis(_generate_random_pauli_string(qubits)),
451-
_generate_qwc_paulis(_generate_random_pauli_string(qubits)),
450+
_generate_qwc_paulis(_generate_random_pauli_string(qubits, True), 2, True),
451+
_generate_qwc_paulis(_generate_random_pauli_string(qubits), 4),
452+
_generate_qwc_paulis(_generate_random_pauli_string(qubits), 6),
452453
]
453454

454455
circuits_with_pauli_expectations = measure_pauli_strings(
@@ -547,25 +548,25 @@ def test_many_group_pauli_in_circuits_with_coefficient() -> None:
547548
circuits_to_pauli: Dict[cirq.FrozenCircuit, list[list[cirq.PauliString]]] = {}
548549
circuits_to_pauli[circuit_1] = [
549550
_generate_qwc_paulis(
550-
_generate_random_pauli_string(qubits_1, enable_coeff=True, allow_pauli_i=False)
551+
_generate_random_pauli_string(qubits_1, enable_coeff=True, allow_pauli_i=False), 4
551552
)
552553
]
553554
circuits_to_pauli[circuit_2] = [
554555
_generate_qwc_paulis(
555-
_generate_random_pauli_string(qubits_2, enable_coeff=True, allow_pauli_i=False)
556+
_generate_random_pauli_string(qubits_2, enable_coeff=True, allow_pauli_i=False), 5
556557
)
557558
]
558559
circuits_to_pauli[circuit_3] = [
559560
_generate_qwc_paulis(
560-
_generate_random_pauli_string(qubits_3, enable_coeff=True, allow_pauli_i=False)
561+
_generate_random_pauli_string(qubits_3, enable_coeff=True, allow_pauli_i=False), 6
561562
)
562563
]
563564

564565
sampler = NoisySingleQubitReadoutSampler(p0=0.03, p1=0.005, seed=1234)
565566
simulator = cirq.Simulator()
566567

567568
circuits_with_pauli_expectations = measure_pauli_strings(
568-
circuits_to_pauli, sampler, 800, 1000, 800, np.random.default_rng()
569+
circuits_to_pauli, sampler, 1000, 1000, 1000, np.random.default_rng()
569570
)
570571

571572
for circuit_with_pauli_expectations in circuits_with_pauli_expectations:
@@ -816,6 +817,20 @@ def test_group_paulis_are_not_qwc() -> None:
816817
)
817818

818819

820+
def test_empty_group_paulis_not_allowed() -> None:
821+
"""Test that the group paulis are empty"""
822+
qubits = cirq.LineQubit.range(5)
823+
824+
circuit = cirq.FrozenCircuit(_create_ghz(5, qubits))
825+
826+
circuits_to_pauli: Dict[cirq.FrozenCircuit, list[cirq.PauliString]] = {}
827+
circuits_to_pauli[circuit] = [[]] # type: ignore
828+
with pytest.raises(ValueError, match="Empty group of Pauli strings is not allowed"):
829+
measure_pauli_strings(
830+
circuits_to_pauli, cirq.Simulator(), 1000, 1000, 1000, np.random.default_rng()
831+
)
832+
833+
819834
def test_group_paulis_type_mismatch() -> None:
820835
"""Test that the group paulis type is not correct"""
821836
qubits_1 = cirq.LineQubit.range(3)
@@ -835,7 +850,7 @@ def test_group_paulis_type_mismatch() -> None:
835850
circuits_to_pauli: Dict[cirq.FrozenCircuit, list[list[cirq.PauliString]]] = {}
836851
circuits_to_pauli[circuit_1] = [
837852
_generate_qwc_paulis(
838-
_generate_random_pauli_string(qubits_1, enable_coeff=True, allow_pauli_i=False)
853+
_generate_random_pauli_string(qubits_1, enable_coeff=True, allow_pauli_i=False), 6
839854
)
840855
for _ in range(3)
841856
]

0 commit comments

Comments
 (0)