@@ -52,9 +52,9 @@ def _generate_random_pauli_string(
5252
5353
5454def _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
9797def _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+
819834def 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