diff --git a/test/data_processing/base_data_processor_test.py b/test/data_processing/base_data_processor_test.py index d41c72e3fe..79472016f8 100644 --- a/test/data_processing/base_data_processor_test.py +++ b/test/data_processing/base_data_processor_test.py @@ -12,8 +12,15 @@ """Base class for data processor tests.""" +from test.fake_experiment import FakeExperiment + +from typing import Any, List + +from qiskit.result import Result from qiskit.test import QiskitTestCase from qiskit.qobj.common import QobjExperimentHeader +from qiskit.result.models import ExperimentResultData, ExperimentResult +from qiskit_experiments.framework import ExperimentData class BaseDataProcessorTest(QiskitTestCase): @@ -35,3 +42,37 @@ def setUp(self): memory_slots=2, metadata={"experiment_type": "fake_test_experiment"}, ) + + def create_experiment(self, iq_data: List[Any], single_shot: bool = False): + """Populate avg_iq_data to use it for testing. + + Args: + iq_data: A List of IQ data. + single_shot: Indicates if the data is single-shot or not. + """ + results = [] + if not single_shot: + for circ_data in iq_data: + res = ExperimentResult( + success=True, + meas_level=1, + meas_return="avg", + data=ExperimentResultData(memory=circ_data), + header=self.header, + shots=1024, + ) + results.append(res) + else: + res = ExperimentResult( + success=True, + meas_level=1, + meas_return="single", + data=ExperimentResultData(memory=iq_data), + header=self.header, + shots=1024, + ) + results.append(res) + + # pylint: disable=attribute-defined-outside-init + self.iq_experiment = ExperimentData(FakeExperiment()) + self.iq_experiment.add_data(Result(results=results, **self.base_result_args)) diff --git a/test/data_processing/test_nodes.py b/test/data_processing/test_nodes.py index 6f165bc32e..39783e3d62 100644 --- a/test/data_processing/test_nodes.py +++ b/test/data_processing/test_nodes.py @@ -14,22 +14,16 @@ # pylint: disable=unbalanced-tuple-unpacking -from test.fake_experiment import FakeExperiment - -from typing import Any, List import numpy as np -from qiskit.result.models import ExperimentResultData, ExperimentResult -from qiskit.result import Result from qiskit.test import QiskitTestCase -from qiskit_experiments.framework import ExperimentData from qiskit_experiments.data_processing.nodes import SVD, AverageData, MinMaxNormalize from qiskit_experiments.data_processing.data_processor import DataProcessor from . import BaseDataProcessorTest -class TestAveraging(QiskitTestCase): +class TestAveraging(BaseDataProcessorTest): """Test the averaging nodes.""" def test_simple(self): @@ -46,6 +40,37 @@ def test_simple(self): std = np.std([1, 3, 5]) self.assertTrue(np.allclose(node(datum)[1], np.array([std, std]) / np.sqrt(3))) + def test_iq_averaging(self): + """Test averaging of IQ-data.""" + + iq_data = [ + [[-6.20601501e14, -1.33257051e15], [-1.70921324e15, -4.05881657e15]], + [[-5.80546502e14, -1.33492509e15], [-1.65094637e15, -4.05926942e15]], + [[-4.04649069e14, -1.33191056e15], [-1.29680377e15, -4.03604815e15]], + [[-2.22203874e14, -1.30291309e15], [-8.57663429e14, -3.97784973e15]], + [[-2.92074029e13, -1.28578530e15], [-9.78824053e13, -3.92071056e15]], + [[1.98056981e14, -1.26883024e15], [3.77157017e14, -3.87460328e15]], + [[4.29955888e14, -1.25022995e15], [1.02340118e15, -3.79508679e15]], + [[6.38981344e14, -1.25084614e15], [1.68918514e15, -3.78961044e15]], + [[7.09988897e14, -1.21906634e15], [1.91914171e15, -3.73670664e15]], + [[7.63169115e14, -1.20797552e15], [2.03772603e15, -3.74653863e15]], + ] + + self.create_experiment(iq_data, single_shot=True) + + avg_iq = AverageData(axis=0) + + avg_datum, error = avg_iq(self.iq_experiment.data(0)["memory"]) + + expected_avg = np.array([[8.82943876e13, -1.27850527e15], [1.43410186e14, -3.89952402e15]]) + + expected_std = np.array( + [[5.07650185e14, 4.44664719e13], [1.40522641e15, 1.22326831e14]] + ) / np.sqrt(10) + + self.assertTrue(np.allclose(avg_datum, expected_avg)) + self.assertTrue(np.allclose(error, expected_std)) + class TestNormalize(QiskitTestCase): """Test the normalization node.""" @@ -69,40 +94,6 @@ def test_simple(self): class TestSVD(BaseDataProcessorTest): """Test the SVD nodes.""" - def create_experiment(self, iq_data: List[Any], single_shot: bool = False): - """Populate avg_iq_data to use it for testing. - - Args: - iq_data: A List of IQ data. - single_shot: Indicates if the data is single-shot or not. - """ - results = [] - if not single_shot: - for circ_data in iq_data: - res = ExperimentResult( - success=True, - meas_level=1, - meas_return="avg", - data=ExperimentResultData(memory=circ_data), - header=self.header, - shots=1024, - ) - results.append(res) - else: - res = ExperimentResult( - success=True, - meas_level=1, - meas_return="single", - data=ExperimentResultData(memory=iq_data), - header=self.header, - shots=1024, - ) - results.append(res) - - # pylint: disable=attribute-defined-outside-init - self.iq_experiment = ExperimentData(FakeExperiment()) - self.iq_experiment.add_data(Result(results=results, **self.base_result_args)) - def test_simple_data(self): """ A simple setting where the IQ data of qubit 0 is oriented along (1,1) and @@ -209,34 +200,3 @@ def test_train_svd_processor(self): processed, _ = processor(self.iq_experiment.data(0)) expected = np.array([-2, -2]) / np.sqrt(2) self.assertTrue(np.allclose(processed, expected)) - - def test_iq_averaging(self): - """Test averaging of IQ-data.""" - - iq_data = [ - [[-6.20601501e14, -1.33257051e15], [-1.70921324e15, -4.05881657e15]], - [[-5.80546502e14, -1.33492509e15], [-1.65094637e15, -4.05926942e15]], - [[-4.04649069e14, -1.33191056e15], [-1.29680377e15, -4.03604815e15]], - [[-2.22203874e14, -1.30291309e15], [-8.57663429e14, -3.97784973e15]], - [[-2.92074029e13, -1.28578530e15], [-9.78824053e13, -3.92071056e15]], - [[1.98056981e14, -1.26883024e15], [3.77157017e14, -3.87460328e15]], - [[4.29955888e14, -1.25022995e15], [1.02340118e15, -3.79508679e15]], - [[6.38981344e14, -1.25084614e15], [1.68918514e15, -3.78961044e15]], - [[7.09988897e14, -1.21906634e15], [1.91914171e15, -3.73670664e15]], - [[7.63169115e14, -1.20797552e15], [2.03772603e15, -3.74653863e15]], - ] - - self.create_experiment(iq_data, single_shot=True) - - avg_iq = AverageData(axis=0) - - avg_datum, error = avg_iq(self.iq_experiment.data(0)["memory"]) - - expected_avg = np.array([[8.82943876e13, -1.27850527e15], [1.43410186e14, -3.89952402e15]]) - - expected_std = np.array( - [[5.07650185e14, 4.44664719e13], [1.40522641e15, 1.22326831e14]] - ) / np.sqrt(10) - - self.assertTrue(np.allclose(avg_datum, expected_avg)) - self.assertTrue(np.allclose(error, expected_std))