diff --git a/qiskit/result/utils.py b/qiskit/result/utils.py index 9ed04c139a40..0ff6cd7e5f4f 100644 --- a/qiskit/result/utils.py +++ b/qiskit/result/utils.py @@ -80,7 +80,7 @@ def marginal_counts( ) # same convention as for the counts bit_strings = [_hex_to_bin(s) for s in experiment_result.data.memory] marginal_bit_strings = [ - "".join([s[-idx - 1] for idx in sorted_indices if idx < len(s)]) + "".join([s[-idx - 1] for idx in sorted_indices if idx < len(s)]) or "0" for s in bit_strings ] experiment_result.data.memory = [_bin_to_hex(s) for s in marginal_bit_strings] diff --git a/releasenotes/notes/fix-marginal_counts-zero-memory-0f6710d6923c8ad7.yaml b/releasenotes/notes/fix-marginal_counts-zero-memory-0f6710d6923c8ad7.yaml new file mode 100644 index 000000000000..cc2154bce675 --- /dev/null +++ b/releasenotes/notes/fix-marginal_counts-zero-memory-0f6710d6923c8ad7.yaml @@ -0,0 +1,7 @@ +--- +fixes: + - | + :func:`.marginal_counts` will now succeed when asked to marginalise memory + with an ``indices`` parameter containing non-zero elements. Previously, + shots whose hexadecimal result representation was sufficiently small could + raise a ``ValueError``. See `#8044 `__. diff --git a/test/python/result/test_result.py b/test/python/result/test_result.py index 3127e77b30ca..192277a70587 100644 --- a/test/python/result/test_result.py +++ b/test/python/result/test_result.py @@ -222,6 +222,16 @@ def test_marginal_counts_result_memory(self): marginal_memory = marginal_result.results[0].data.memory self.assertEqual(marginal_memory, [hex(ii % 2) for ii in range(8)]) + def test_marginal_counts_result_memory_nonzero_indices(self): + """Test that a Result object containing memory marginalizes correctly.""" + result = self.generate_qiskit_result() + index = 2 + marginal_result = marginal_counts(result, indices=[index]) + marginal_memory = marginal_result.results[0].data.memory + mask = 1 << index + expected = [hex((ii & mask) >> index) for ii in range(8)] + self.assertEqual(marginal_memory, expected) + def test_marginal_counts_result_memory_indices_None(self): """Test that a Result object containing memory marginalizes correctly.""" result = self.generate_qiskit_result()