diff --git a/qiskit_experiments/library/characterization/analysis/multi_state_discrimination_analysis.py b/qiskit_experiments/library/characterization/analysis/multi_state_discrimination_analysis.py index e58a5b4b31..0c621df2af 100644 --- a/qiskit_experiments/library/characterization/analysis/multi_state_discrimination_analysis.py +++ b/qiskit_experiments/library/characterization/analysis/multi_state_discrimination_analysis.py @@ -117,7 +117,7 @@ def _run_analysis( for i in range(n_states): counts = [0] * n_states for point in predicted_data[i]: - counts[point] += 1 + counts[int(point)] += 1 for j in range(n_states): if j != i: prob_wrong += counts[j] / num_shots diff --git a/qiskit_experiments/library/characterization/multi_state_discrimination.py b/qiskit_experiments/library/characterization/multi_state_discrimination.py index f4e2689f7b..36a5a01b5f 100644 --- a/qiskit_experiments/library/characterization/multi_state_discrimination.py +++ b/qiskit_experiments/library/characterization/multi_state_discrimination.py @@ -143,7 +143,7 @@ def circuits(self) -> List[QuantumCircuit]: ) # label the circuit - circuit.metadata = {"label": level} + circuit.metadata = {"label": str(level)} circuit.measure_all() circuits.append(circuit) diff --git a/releasenotes/notes/fix-discriminator-exp-ff698816cea63099.yaml b/releasenotes/notes/fix-discriminator-exp-ff698816cea63099.yaml new file mode 100644 index 0000000000..eba1b9ef51 --- /dev/null +++ b/releasenotes/notes/fix-discriminator-exp-ff698816cea63099.yaml @@ -0,0 +1,5 @@ +--- +fixes: + - | + Fixed a bug where :class:`.MultiStateDiscrimination` outputted integer state labels rather than the + string labels expected by the :class:`.DiscriminatorNode`. diff --git a/test/library/characterization/test_multi_state_discrimination.py b/test/library/characterization/test_multi_state_discrimination.py index 508299cd75..ff9709d544 100644 --- a/test/library/characterization/test_multi_state_discrimination.py +++ b/test/library/characterization/test_multi_state_discrimination.py @@ -12,8 +12,9 @@ """Test the multi state discrimination experiments.""" from functools import wraps -from test.base import QiskitExperimentsTestCase +from test.data_processing import BaseDataProcessorTest from unittest import SkipTest +import numpy as np from ddt import ddt, data @@ -22,6 +23,8 @@ from qiskit_experiments.library import MultiStateDiscrimination from qiskit_experiments.test.pulse_backend import SingleTransmonTestBackend +from qiskit_experiments.data_processing import SkQDA +from qiskit_experiments.data_processing.nodes import DiscriminatorNode from qiskit_experiments.warnings import HAS_SKLEARN @@ -42,14 +45,14 @@ def wrapper(*args, **kwargs): @ddt -class TestMultiStateDiscrimination(QiskitExperimentsTestCase): +class TestMultiStateDiscrimination(BaseDataProcessorTest): """Tests of the multi state discrimination experiment.""" def setUp(self): """Setup test variables.""" super().setUp() - self.backend = SingleTransmonTestBackend(noise=False) + self.backend = SingleTransmonTestBackend(noise=False, seed=0) # Build x12 schedule self.qubit = 0 @@ -83,7 +86,7 @@ def test_circuit_generation(self, n_states): self.assertEqual(len(exp.circuits()), n_states) # check the metadata - self.assertEqual(exp.circuits()[-1].metadata["label"], n_states - 1) + self.assertEqual(exp.circuits()[-1].metadata["label"], str(n_states - 1)) @data(2, 3) @requires_sklearn @@ -104,3 +107,29 @@ def test_discrimination_analysis(self, n_states): "classes_" ] self.assertEqual(len(discrim_lbls), n_states) + + @requires_sklearn + def test_discriminator_data_processing(self): + """Test that the discriminator experiment works with the discriminator node.""" + discriminator = MultiStateDiscrimination([self.qubit], n_states=2, backend=self.backend) + discriminator_data = discriminator.run().block_for_results() + qda = SkQDA.from_config(discriminator_data.analysis_results("discriminator_config").value) + discriminatornode = DiscriminatorNode(discriminators=qda) + + iq_data = [ + [ + [[0.8, -1.0], [0.1, 0.5], [-0.3, 0.4]], + [[-0.2, 0.4], [0.2, -1.0], [-0.5, 0.3]], + ], + [ + [[0, -1.0], [0.1, -0.5], [0.9, 0]], + [[-0.8, -0.5], [-0.1, 0.5], [0.2, 1.5]], + ], + ] + + self.create_experiment_data(np.array(iq_data) * 1e16, single_shot=True) + fake_data = np.asarray([datum["memory"] for datum in self.iq_experiment.data()]) + classified = discriminatornode(fake_data) + expected = [["110", "101"], ["000", "111"]] + + self.assertListEqual(classified.tolist(), expected)