From dfba3e30a530bc8670c420f22edc4ddb9de985b6 Mon Sep 17 00:00:00 2001 From: Helena Zhang Date: Sat, 15 Apr 2023 21:56:46 -0400 Subject: [PATCH 1/3] updated discriminator and added test --- .../multi_state_discrimination_analysis.py | 2 +- .../multi_state_discrimination.py | 2 +- ...ix-discriminator-exp-ff698816cea63099.yaml | 5 +++ .../test_multi_state_discrimination.py | 42 +++++++++++++++++-- 4 files changed, 46 insertions(+), 5 deletions(-) create mode 100644 releasenotes/notes/fix-discriminator-exp-ff698816cea63099.yaml 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..4b1a46d786 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,7 +45,7 @@ def wrapper(*args, **kwargs): @ddt -class TestMultiStateDiscrimination(QiskitExperimentsTestCase): +class TestMultiStateDiscrimination(BaseDataProcessorTest): """Tests of the multi state discrimination experiment.""" def setUp(self): @@ -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,36 @@ 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( + meas_level=1, meas_return="single" + ).block_for_results() + qda = SkQDA.from_config(discriminator_data.analysis_results("discriminator_config").value) + discriminatornode = DiscriminatorNode(discriminators=qda) + + iq_data = [ + # Circuit no. 1, 5 shots, 3 qubits + [ + [[0.8, -1.0], [0.1, 0.3], [-0.3, 0.4]], + [[0.2, -1.0], [-0.5, 0.3], [-0.2, 0.4]], + [[-0.8, -1.0], [-0.1, 0.3], [-0.3, 0.4]], + [[-0.5, -1.0], [-0.2, 0.3], [-0.9, 0.4]], + [[-0.8, -1.0], [0.2, 0.3], [0.3, 0.4]], + ], + # Circuit no. 2, 5 shots, 3 qubits + [ + [[-0.3, -1.0], [0.1, 0.3], [0.9, 0.4]], + [[0.8, -1.0], [0.9, 0.3], [0.3, 0.4]], + [[-0.7, -1.0], [0.1, 0.3], [0.1, 0.4]], + [[-0.8, -1.0], [0.7, 0.3], [0.3, 0.4]], + [[-0.8, -1.0], [-0.1, 0.3], [0.2, 0.4]], + ], + ] + + self.create_experiment_data(iq_data, single_shot=True) + fake_data = np.asarray([datum["memory"] for datum in self.iq_experiment.data()]) + discriminatornode(fake_data) From 5a6ddb3a6b46481302c16e9e17b405eb7267814f Mon Sep 17 00:00:00 2001 From: Helena Zhang Date: Sat, 15 Apr 2023 22:27:50 -0400 Subject: [PATCH 2/3] updated test with mock data --- .../test_multi_state_discrimination.py | 29 +++++++------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/test/library/characterization/test_multi_state_discrimination.py b/test/library/characterization/test_multi_state_discrimination.py index 4b1a46d786..c98c61502e 100644 --- a/test/library/characterization/test_multi_state_discrimination.py +++ b/test/library/characterization/test_multi_state_discrimination.py @@ -52,7 +52,7 @@ def setUp(self): """Setup test variables.""" super().setUp() - self.backend = SingleTransmonTestBackend(noise=False) + self.backend = SingleTransmonTestBackend(noise=False, lambda_2=0, seed=0) # Build x12 schedule self.qubit = 0 @@ -112,31 +112,24 @@ def test_discrimination_analysis(self, n_states): 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( - meas_level=1, meas_return="single" - ).block_for_results() + discriminator_data = discriminator.run().block_for_results() qda = SkQDA.from_config(discriminator_data.analysis_results("discriminator_config").value) discriminatornode = DiscriminatorNode(discriminators=qda) iq_data = [ - # Circuit no. 1, 5 shots, 3 qubits [ - [[0.8, -1.0], [0.1, 0.3], [-0.3, 0.4]], - [[0.2, -1.0], [-0.5, 0.3], [-0.2, 0.4]], - [[-0.8, -1.0], [-0.1, 0.3], [-0.3, 0.4]], - [[-0.5, -1.0], [-0.2, 0.3], [-0.9, 0.4]], - [[-0.8, -1.0], [0.2, 0.3], [0.3, 0.4]], + [[0.8, -1.0], [0.1, 0.5], [-0.3, 0.4]], + [[-0.2, 0.4], [0.2, -1.0], [-0.5, 0.3]], ], - # Circuit no. 2, 5 shots, 3 qubits [ - [[-0.3, -1.0], [0.1, 0.3], [0.9, 0.4]], - [[0.8, -1.0], [0.9, 0.3], [0.3, 0.4]], - [[-0.7, -1.0], [0.1, 0.3], [0.1, 0.4]], - [[-0.8, -1.0], [0.7, 0.3], [0.3, 0.4]], - [[-0.8, -1.0], [-0.1, 0.3], [0.2, 0.4]], + [[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(iq_data, single_shot=True) + 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()]) - discriminatornode(fake_data) + classified = discriminatornode(fake_data) + expected = [["110", "101"], ["000", "111"]] + + self.assertListEqual(classified.tolist(), expected) From b9ea7b0926b6fb3b9918a2c40840675559ecd8ee Mon Sep 17 00:00:00 2001 From: Helena Zhang Date: Sat, 15 Apr 2023 22:29:40 -0400 Subject: [PATCH 3/3] fix test --- .../library/characterization/test_multi_state_discrimination.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/library/characterization/test_multi_state_discrimination.py b/test/library/characterization/test_multi_state_discrimination.py index c98c61502e..ff9709d544 100644 --- a/test/library/characterization/test_multi_state_discrimination.py +++ b/test/library/characterization/test_multi_state_discrimination.py @@ -52,7 +52,7 @@ def setUp(self): """Setup test variables.""" super().setUp() - self.backend = SingleTransmonTestBackend(noise=False, lambda_2=0, seed=0) + self.backend = SingleTransmonTestBackend(noise=False, seed=0) # Build x12 schedule self.qubit = 0