Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions test/data_processing/base_data_processor_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand All @@ -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))
104 changes: 32 additions & 72 deletions test/data_processing/test_nodes.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand All @@ -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."""
Expand All @@ -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
Expand Down Expand Up @@ -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))