From a1cb7025473d34130069c4f11d19268c88e8d352 Mon Sep 17 00:00:00 2001 From: Pieter Eendebak Date: Thu, 17 Nov 2022 16:31:57 +0100 Subject: [PATCH 1/8] fix shots argument of local_readout_mitigator --- qiskit/result/mitigation/local_readout_mitigator.py | 4 ++-- qiskit/result/mitigation/utils.py | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/qiskit/result/mitigation/local_readout_mitigator.py b/qiskit/result/mitigation/local_readout_mitigator.py index 3d55ed0887ba..44c32ea49d9c 100644 --- a/qiskit/result/mitigation/local_readout_mitigator.py +++ b/qiskit/result/mitigation/local_readout_mitigator.py @@ -177,7 +177,7 @@ def quasi_probabilities( data: counts object qubits: qubits the count bitstrings correspond to. clbits: Optional, marginalize counts to just these bits. - shots: the number of shots. + shots: Argument is not used Returns: QuasiDistibution: A dictionary containing pairs of [output, mean] where "output" @@ -214,7 +214,7 @@ def quasi_probabilities( probs_dict[index] = probs_vec[index] quasi_dist = QuasiDistribution( - probs_dict, stddev_upper_bound=self.stddev_upper_bound(shots, qubits) + probs_dict, shots=shots, stddev_upper_bound=self.stddev_upper_bound(shots, qubits) ) return quasi_dist diff --git a/qiskit/result/mitigation/utils.py b/qiskit/result/mitigation/utils.py index 085ffebe0872..5500a200b56e 100644 --- a/qiskit/result/mitigation/utils.py +++ b/qiskit/result/mitigation/utils.py @@ -149,6 +149,7 @@ def counts_probability_vector( Returns: np.ndarray: a probability vector for all count outcomes. + int: Number of shots in the counts """ counts = marganalize_counts(counts, qubit_index, qubits, clbits) if qubits is not None: From c763c69611b79062ff2161a7c99310683b8201d0 Mon Sep 17 00:00:00 2001 From: Pieter Eendebak Date: Sun, 20 Nov 2022 21:30:06 +0100 Subject: [PATCH 2/8] fix correlated_readout_mitigator as well --- qiskit/result/mitigation/correlated_readout_mitigator.py | 9 ++++++--- qiskit/result/mitigation/local_readout_mitigator.py | 9 ++++++--- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/qiskit/result/mitigation/correlated_readout_mitigator.py b/qiskit/result/mitigation/correlated_readout_mitigator.py index a2d4fd359676..e2200d50f34e 100644 --- a/qiskit/result/mitigation/correlated_readout_mitigator.py +++ b/qiskit/result/mitigation/correlated_readout_mitigator.py @@ -133,7 +133,7 @@ def quasi_probabilities( data: Counts, qubits: Optional[List[int]] = None, clbits: Optional[List[int]] = None, - shots: Optional[bool] = False, + shots: Optional[int] = None, ) -> QuasiDistribution: """Compute mitigated quasi probabilities value. @@ -141,7 +141,8 @@ def quasi_probabilities( data: counts object qubits: qubits the count bitstrings correspond to. clbits: Optional, marginalize counts to just these bits. - shots: the number of shots. + shots: Optional, the total number of shots, if None shots will + be calculated as the sum of all counts. Returns: QuasiDistibution: A dictionary containing pairs of [output, mean] where "output" @@ -151,9 +152,11 @@ def quasi_probabilities( """ if qubits is None: qubits = self._qubits - probs_vec, shots = counts_probability_vector( + probs_vec, calculated_shots = counts_probability_vector( data, qubit_index=self._qubit_index, clbits=clbits, qubits=qubits ) + if shots is None: + shots = calculated_shots # Get qubit mitigation matrix and mitigate probs mit_mat = self.mitigation_matrix(qubits) diff --git a/qiskit/result/mitigation/local_readout_mitigator.py b/qiskit/result/mitigation/local_readout_mitigator.py index 44c32ea49d9c..ed7126143d96 100644 --- a/qiskit/result/mitigation/local_readout_mitigator.py +++ b/qiskit/result/mitigation/local_readout_mitigator.py @@ -169,7 +169,7 @@ def quasi_probabilities( data: Counts, qubits: Optional[List[int]] = None, clbits: Optional[List[int]] = None, - shots: Optional[bool] = False, + shots: Optional[int] = None, ) -> QuasiDistribution: """Compute mitigated quasi probabilities value. @@ -177,7 +177,8 @@ def quasi_probabilities( data: counts object qubits: qubits the count bitstrings correspond to. clbits: Optional, marginalize counts to just these bits. - shots: Argument is not used + shots: Optional, the total number of shots, if None shots will + be calculated as the sum of all counts. Returns: QuasiDistibution: A dictionary containing pairs of [output, mean] where "output" @@ -193,9 +194,11 @@ def quasi_probabilities( num_qubits = len(qubits) - probs_vec, shots = counts_probability_vector( + probs_vec, calculated_shots = counts_probability_vector( data, qubit_index=self._qubit_index, clbits=clbits, qubits=qubits ) + if shots is None: + shots = calculated_shots # Get qubit mitigation matrix and mitigate probs qubit_indices = [self._qubit_index[qubit] for qubit in qubits] From 6e9506c98e4da9a2a9c4a52bc827dbb8da80c1c3 Mon Sep 17 00:00:00 2001 From: Pieter Eendebak Date: Wed, 23 Nov 2022 11:45:13 +0100 Subject: [PATCH 3/8] add test --- test/python/result/test_mitigators.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/test/python/result/test_mitigators.py b/test/python/result/test_mitigators.py index ce40791ed3df..6714d382cde7 100644 --- a/test/python/result/test_mitigators.py +++ b/test/python/result/test_mitigators.py @@ -442,6 +442,16 @@ def test_expectation_value_endian(self): expval, _ = mitigator.expectation_value(counts, diagonal="IZ", qubits=[0, 1]) self.assertAlmostEqual(expval, -1.0, places=0) + def test_quasi_probabilities_shots_passing(self): + mitigator = LocalReadoutMitigator([np.array([[0.9, 0.1], [0.1, 0.9]])], qubits=[0]) + counts = Counts({"10": 3, "11": 24, "00": 74, "01": 923}) + quasi_dist = mitigator.quasi_probabilities(counts) + self.assertEqual(quasi_dist.shots, sum(counts.values())) + + # custom number of shots + quasi_dist = mitigator.quasi_probabilities(counts, shots=1025) + self.assertEqual(quasi_dist.shots, 1025) + class TestLocalReadoutMitigation(QiskitTestCase): """Tests specific to the local readout mitigator""" From 3affefb70bdf8f66c94b24fca5f0a7bb36c4c6d8 Mon Sep 17 00:00:00 2001 From: Pieter Eendebak Date: Wed, 23 Nov 2022 16:49:59 +0100 Subject: [PATCH 4/8] docstring --- test/python/result/test_mitigators.py | 1 + 1 file changed, 1 insertion(+) diff --git a/test/python/result/test_mitigators.py b/test/python/result/test_mitigators.py index 6714d382cde7..db9a69990806 100644 --- a/test/python/result/test_mitigators.py +++ b/test/python/result/test_mitigators.py @@ -443,6 +443,7 @@ def test_expectation_value_endian(self): self.assertAlmostEqual(expval, -1.0, places=0) def test_quasi_probabilities_shots_passing(self): + """ Test that the output of LocalReadoutMitigator.quasi_probabilities has the number of shots set""" mitigator = LocalReadoutMitigator([np.array([[0.9, 0.1], [0.1, 0.9]])], qubits=[0]) counts = Counts({"10": 3, "11": 24, "00": 74, "01": 923}) quasi_dist = mitigator.quasi_probabilities(counts) From 9207887ae00d039b5129b6858e9a605115c2c22a Mon Sep 17 00:00:00 2001 From: Pieter Eendebak Date: Wed, 23 Nov 2022 22:16:54 +0100 Subject: [PATCH 5/8] black --- test/python/result/test_mitigators.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/python/result/test_mitigators.py b/test/python/result/test_mitigators.py index db9a69990806..74fab5ed60fd 100644 --- a/test/python/result/test_mitigators.py +++ b/test/python/result/test_mitigators.py @@ -443,7 +443,7 @@ def test_expectation_value_endian(self): self.assertAlmostEqual(expval, -1.0, places=0) def test_quasi_probabilities_shots_passing(self): - """ Test that the output of LocalReadoutMitigator.quasi_probabilities has the number of shots set""" + """Test that the output of LocalReadoutMitigator.quasi_probabilities has the number of shots set""" mitigator = LocalReadoutMitigator([np.array([[0.9, 0.1], [0.1, 0.9]])], qubits=[0]) counts = Counts({"10": 3, "11": 24, "00": 74, "01": 923}) quasi_dist = mitigator.quasi_probabilities(counts) From d8cf603fd0cb30e5f8f4f2250ddce9dc94af123b Mon Sep 17 00:00:00 2001 From: Pieter Eendebak Date: Thu, 24 Nov 2022 15:52:26 +0100 Subject: [PATCH 6/8] lint --- test/python/result/test_mitigators.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/python/result/test_mitigators.py b/test/python/result/test_mitigators.py index 74fab5ed60fd..ab482833e2e2 100644 --- a/test/python/result/test_mitigators.py +++ b/test/python/result/test_mitigators.py @@ -443,7 +443,10 @@ def test_expectation_value_endian(self): self.assertAlmostEqual(expval, -1.0, places=0) def test_quasi_probabilities_shots_passing(self): - """Test that the output of LocalReadoutMitigator.quasi_probabilities has the number of shots set""" + """Test output of LocalReadoutMitigator.quasi_probabilities + + We require the number of shots to be set in the output. + """ mitigator = LocalReadoutMitigator([np.array([[0.9, 0.1], [0.1, 0.9]])], qubits=[0]) counts = Counts({"10": 3, "11": 24, "00": 74, "01": 923}) quasi_dist = mitigator.quasi_probabilities(counts) From ef63a1881ceecd90259500335b24f4a199ab07a4 Mon Sep 17 00:00:00 2001 From: Pieter Eendebak Date: Thu, 24 Nov 2022 23:25:11 +0100 Subject: [PATCH 7/8] add release notes --- ...ts_passing_local_readout_mitigator-603514a4e0d22dc5.yaml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 releasenotes/notes/fix_shots_passing_local_readout_mitigator-603514a4e0d22dc5.yaml diff --git a/releasenotes/notes/fix_shots_passing_local_readout_mitigator-603514a4e0d22dc5.yaml b/releasenotes/notes/fix_shots_passing_local_readout_mitigator-603514a4e0d22dc5.yaml new file mode 100644 index 000000000000..6468825ab789 --- /dev/null +++ b/releasenotes/notes/fix_shots_passing_local_readout_mitigator-603514a4e0d22dc5.yaml @@ -0,0 +1,6 @@ +--- +fixes: + - | + Fixed an issue with the :method:`LocalReadoutMitigator.quasi_probabilities` where + the ``shots`` argument was not used. It is now used to set the number of shots + in the return object. From 82ad28faa667acfacc3e9fd44df5a64c941c48d5 Mon Sep 17 00:00:00 2001 From: Jake Lishman Date: Thu, 24 Nov 2022 22:50:38 +0000 Subject: [PATCH 8/8] Fix up release note --- ..._shots_passing_local_readout_mitigator-603514a4e0d22dc5.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/releasenotes/notes/fix_shots_passing_local_readout_mitigator-603514a4e0d22dc5.yaml b/releasenotes/notes/fix_shots_passing_local_readout_mitigator-603514a4e0d22dc5.yaml index 6468825ab789..63aebaf5daf6 100644 --- a/releasenotes/notes/fix_shots_passing_local_readout_mitigator-603514a4e0d22dc5.yaml +++ b/releasenotes/notes/fix_shots_passing_local_readout_mitigator-603514a4e0d22dc5.yaml @@ -1,6 +1,6 @@ --- fixes: - | - Fixed an issue with the :method:`LocalReadoutMitigator.quasi_probabilities` where + Fixed an issue with the :meth:`.LocalReadoutMitigator.quasi_probabilities` method where the ``shots`` argument was not used. It is now used to set the number of shots in the return object.