Skip to content

Commit 729014b

Browse files
authored
Update tests to avoid empty ExperimentData warning (#1349)
Update fake backend to generate fake results for each circuit and update tests to run at least one circuit so that some results are generated. These changes avoid generating many instances of the recently added warning about running analysis on an empty experiment data object and also make the tests a little more realistic.
1 parent 441e549 commit 729014b

File tree

5 files changed

+62
-20
lines changed

5 files changed

+62
-20
lines changed

qiskit_experiments/test/fake_backend.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,25 @@ def target(self) -> Target:
5555
return self._target
5656

5757
def run(self, run_input, **options):
58+
if not isinstance(run_input, list):
59+
run_input = [run_input]
60+
results = [
61+
{
62+
"data": {"0": 100},
63+
"shots": 100,
64+
"success": True,
65+
"header": {"metadata": circ.metadata},
66+
"meas_level": 2,
67+
}
68+
for circ in run_input
69+
]
70+
5871
result = {
5972
"backend_name": "fake_backend",
6073
"backend_version": "0",
6174
"qobj_id": uuid.uuid4().hex,
6275
"job_id": uuid.uuid4().hex,
6376
"success": True,
64-
"results": [],
77+
"results": results,
6578
}
6679
return FakeJob(backend=self, result=Result.from_dict(result))

test/calibration/test_base_calibration_experiment.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ def test_update_calibration(self):
8787
new_value=ref_new_value,
8888
param_name="to_calibrate",
8989
sched_name="test",
90+
circuits=[QuantumCircuit(1)],
9091
)
9192
self.assertExperimentDone(exp.run(backend))
9293

@@ -131,6 +132,7 @@ def test_update_calibration_update_analysis(self):
131132
new_value=999999,
132133
param_name="to_calibrate",
133134
sched_name="test",
135+
circuits=[QuantumCircuit(1)],
134136
)
135137
exp.analysis.set_options(return_value=ref_new_value) # Update analysis option here
136138
self.assertExperimentDone(exp.run(backend))
@@ -176,6 +178,7 @@ def test_update_calibration_custom_analysis(self):
176178
new_value=99999,
177179
param_name="to_calibrate",
178180
sched_name="test",
181+
circuits=[QuantumCircuit(1)],
179182
)
180183

181184
user_analysis = DoNothingAnalysis()
@@ -231,13 +234,15 @@ def test_update_calibration_batch(self):
231234
new_value=ref_new_value1,
232235
param_name="to_calibrate1",
233236
sched_name="test",
237+
circuits=[QuantumCircuit(1)],
234238
)
235239
exp2 = MockCalExperiment(
236240
physical_qubits=(0,),
237241
calibrations=cals,
238242
new_value=ref_new_value2,
239243
param_name="to_calibrate2",
240244
sched_name="test",
245+
circuits=[QuantumCircuit(1)],
241246
)
242247
batch_exp = BatchExperiment([exp1, exp2], flatten_results=False, backend=backend)
243248
self.assertExperimentDone(batch_exp.run(backend))
@@ -301,13 +306,15 @@ def test_update_calibration_parallel(self):
301306
new_value=ref_new_value1,
302307
param_name="to_calibrate1",
303308
sched_name="test1",
309+
circuits=[QuantumCircuit(1)],
304310
)
305311
exp2 = MockCalExperiment(
306312
physical_qubits=(1,),
307313
calibrations=cals,
308314
new_value=ref_new_value2,
309315
param_name="to_calibrate2",
310316
sched_name="test2",
317+
circuits=[QuantumCircuit(1)],
311318
)
312319
batch_exp = ParallelExperiment([exp1, exp2], flatten_results=False, backend=backend)
313320
self.assertExperimentDone(batch_exp.run(backend))

test/fake_experiment.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
import numpy as np
1616
from matplotlib.figure import Figure as MatplotlibFigure
17+
from qiskit import QuantumCircuit
1718
from qiskit_experiments.framework import BaseExperiment, BaseAnalysis, Options, AnalysisResultData
1819

1920

@@ -61,4 +62,4 @@ def __init__(self, physical_qubits=None, backend=None, experiment_type=None):
6162

6263
def circuits(self):
6364
"""Fake circuits."""
64-
return []
65+
return [QuantumCircuit(len(self.physical_qubits))]

test/framework/test_composite.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ def test_parallel_options(self):
7070
self.assertEqual(par_exp.analysis.options, par_exp.analysis._default_options())
7171

7272
with self.assertWarns(UserWarning):
73-
expdata = par_exp.run(FakeBackend())
73+
expdata = par_exp.run(FakeBackend(num_qubits=3))
7474
self.assertExperimentDone(expdata)
7575

7676
def test_flatten_results_nested(self):
@@ -92,7 +92,7 @@ def test_flatten_results_nested(self):
9292
],
9393
flatten_results=True,
9494
)
95-
expdata = comp_exp.run(FakeBackend())
95+
expdata = comp_exp.run(FakeBackend(num_qubits=4))
9696
self.assertExperimentDone(expdata)
9797
# Check no child data was saved
9898
self.assertEqual(len(expdata.child_data()), 0)
@@ -112,7 +112,7 @@ def test_flatten_results_partial(self):
112112
],
113113
flatten_results=False,
114114
)
115-
expdata = comp_exp.run(FakeBackend())
115+
expdata = comp_exp.run(FakeBackend(num_qubits=4))
116116
self.assertExperimentDone(expdata)
117117
# Check out experiment wasn't flattened
118118
self.assertEqual(len(expdata.child_data()), 2)
@@ -176,7 +176,7 @@ class TestCompositeExperimentData(QiskitExperimentsTestCase):
176176
def setUp(self):
177177
super().setUp()
178178

179-
self.backend = FakeBackend()
179+
self.backend = FakeBackend(num_qubits=4)
180180
self.share_level = "public"
181181

182182
exp1 = FakeExperiment([0, 2])
@@ -302,7 +302,7 @@ def test_nested_composite(self):
302302
exp4 = BatchExperiment([exp3, exp1], flatten_results=False)
303303
exp5 = ParallelExperiment([exp4, FakeExperiment([4])], flatten_results=False)
304304
nested_exp = BatchExperiment([exp5, exp3], flatten_results=False)
305-
expdata = nested_exp.run(FakeBackend())
305+
expdata = nested_exp.run(FakeBackend(num_qubits=4))
306306
self.assertExperimentDone(expdata)
307307

308308
def test_analysis_replace_results_true(self):
@@ -312,12 +312,12 @@ def test_analysis_replace_results_true(self):
312312
exp1 = FakeExperiment([0, 2])
313313
exp2 = FakeExperiment([1, 3])
314314
par_exp = ParallelExperiment([exp1, exp2], flatten_results=False)
315-
data1 = par_exp.run(FakeBackend())
315+
data1 = par_exp.run(FakeBackend(num_qubits=4))
316316
self.assertExperimentDone(data1)
317317

318318
# Additional data not part of composite experiment
319319
exp3 = FakeExperiment([0, 1])
320-
extra_data = exp3.run(FakeBackend())
320+
extra_data = exp3.run(FakeBackend(num_qubits=2))
321321
self.assertExperimentDone(extra_data)
322322
data1.add_child_data(extra_data)
323323

@@ -336,12 +336,12 @@ def test_analysis_replace_results_false(self):
336336
exp1 = FakeExperiment([0, 2])
337337
exp2 = FakeExperiment([1, 3])
338338
par_exp = BatchExperiment([exp1, exp2], flatten_results=False)
339-
data1 = par_exp.run(FakeBackend())
339+
data1 = par_exp.run(FakeBackend(num_qubits=4))
340340
self.assertExperimentDone(data1)
341341

342342
# Additional data not part of composite experiment
343343
exp3 = FakeExperiment([0, 1])
344-
extra_data = exp3.run(FakeBackend())
344+
extra_data = exp3.run(FakeBackend(num_qubits=2))
345345
self.assertExperimentDone(extra_data)
346346
data1.add_child_data(extra_data)
347347

@@ -360,7 +360,7 @@ def test_composite_tags(self):
360360
exp1 = FakeExperiment([0, 2])
361361
exp2 = FakeExperiment([1, 3])
362362
par_exp = BatchExperiment([exp1, exp2], flatten_results=False)
363-
expdata = par_exp.run(FakeBackend())
363+
expdata = par_exp.run(FakeBackend(num_qubits=4))
364364
self.assertExperimentDone(expdata)
365365
data1 = expdata.child_data(0)
366366
data2 = expdata.child_data(1)
@@ -390,7 +390,7 @@ def test_composite_figures(self):
390390
exp1.analysis.set_options(add_figures=True)
391391
exp2.analysis.set_options(add_figures=True)
392392
par_exp = BatchExperiment([exp1, exp2], flatten_results=False)
393-
expdata = par_exp.run(FakeBackend())
393+
expdata = par_exp.run(FakeBackend(num_qubits=4))
394394
self.assertExperimentDone(expdata)
395395
expdata.service = IBMExperimentService(local=True, local_save=False)
396396
expdata.auto_save = True
@@ -405,7 +405,7 @@ def test_composite_auto_save(self):
405405
exp1 = FakeExperiment([0, 2])
406406
exp2 = FakeExperiment([1, 3])
407407
par_exp = BatchExperiment([exp1, exp2], flatten_results=False)
408-
expdata = par_exp.run(FakeBackend())
408+
expdata = par_exp.run(FakeBackend(num_qubits=4))
409409
expdata.service = service
410410
self.assertExperimentDone(expdata)
411411
expdata.auto_save = True

test/framework/test_framework.py

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,20 @@
3838
class TestFramework(QiskitExperimentsTestCase):
3939
"""Test Base Experiment"""
4040

41+
def fake_job_data(self):
42+
"""Generate fake job data for tests"""
43+
return {
44+
"job_id": "123",
45+
"metadata": {},
46+
"shots": 100,
47+
"meas_level": 2,
48+
"success": True,
49+
"data": {"0": 100},
50+
}
51+
4152
def test_metadata(self):
4253
"""Test the metadata of a basic experiment."""
43-
backend = FakeBackend()
54+
backend = FakeBackend(num_qubits=2)
4455
exp = FakeExperiment((0, 2))
4556
expdata = exp.run(backend)
4657
self.assertExperimentDone(expdata)
@@ -119,7 +130,9 @@ def circuits(self):
119130
def test_analysis_replace_results_true(self):
120131
"""Test running analysis with replace_results=True"""
121132
analysis = FakeAnalysis()
122-
expdata1 = analysis.run(ExperimentData(), seed=54321)
133+
expdata1 = ExperimentData()
134+
expdata1.add_data(self.fake_job_data())
135+
expdata1 = analysis.run(expdata1, seed=54321)
123136
self.assertExperimentDone(expdata1)
124137
result_ids = [res.result_id for res in expdata1.analysis_results()]
125138
expdata2 = analysis.run(expdata1, replace_results=True, seed=12345)
@@ -132,7 +145,9 @@ def test_analysis_replace_results_true(self):
132145
def test_analysis_replace_results_false(self):
133146
"""Test running analysis with replace_results=False"""
134147
analysis = FakeAnalysis()
135-
expdata1 = analysis.run(ExperimentData(), seed=54321)
148+
expdata1 = ExperimentData()
149+
expdata1.add_data(self.fake_job_data())
150+
expdata1 = analysis.run(expdata1, seed=54321)
136151
self.assertExperimentDone(expdata1)
137152
expdata2 = analysis.run(expdata1, replace_results=False, seed=12345)
138153
self.assertExperimentDone(expdata2)
@@ -172,7 +187,9 @@ def test_analysis_runtime_opts(self):
172187
run_opts = {"opt1": True, "opt2": True, "opt3": True}
173188
analysis = FakeAnalysis()
174189
analysis.set_options(**opts)
175-
analysis.run(ExperimentData(), **run_opts)
190+
expdata = ExperimentData()
191+
expdata.add_data(self.fake_job_data())
192+
analysis.run(expdata, **run_opts)
176193
# add also the default 'figure_names' option
177194
target_opts = opts.copy()
178195
target_opts["figure_names"] = None
@@ -190,7 +207,9 @@ def _run_analysis(self, experiment_data, **options):
190207

191208
analysis = FakeAnalysis()
192209
failed_analysis = FakeFailedAnalysis()
193-
expdata1 = analysis.run(ExperimentData(), seed=54321)
210+
expdata1 = ExperimentData()
211+
expdata1.add_data(self.fake_job_data())
212+
expdata1 = analysis.run(expdata1, seed=54321)
194213
self.assertExperimentDone(expdata1)
195214
expdata2 = failed_analysis.run(
196215
expdata1, replace_results=True, seed=12345
@@ -211,7 +230,9 @@ def _run_analysis(self, experiment_data, **options):
211230

212231
analysis = FakeAnalysis()
213232
failed_analysis = FakeFailedAnalysis()
214-
expdata1 = analysis.run(ExperimentData(), seed=54321)
233+
expdata1 = ExperimentData()
234+
expdata1.add_data(self.fake_job_data())
235+
expdata1 = analysis.run(expdata1, seed=54321)
215236
self.assertExperimentDone(expdata1)
216237
expdata2 = failed_analysis.run(expdata1, replace_results=False, seed=12345)
217238

0 commit comments

Comments
 (0)