diff --git a/qiskit_experiments/framework/composite/composite_analysis.py b/qiskit_experiments/framework/composite/composite_analysis.py index 967573482e..fab57af662 100644 --- a/qiskit_experiments/framework/composite/composite_analysis.py +++ b/qiskit_experiments/framework/composite/composite_analysis.py @@ -14,6 +14,7 @@ """ from typing import List, Dict + import numpy as np from qiskit.result import marginal_counts from qiskit_experiments.framework import BaseAnalysis, ExperimentData diff --git a/releasenotes/notes/developer_add_success_check-5ddd1d56be29a329.yaml b/releasenotes/notes/developer_add_success_check-5ddd1d56be29a329.yaml new file mode 100644 index 0000000000..3d59c20488 --- /dev/null +++ b/releasenotes/notes/developer_add_success_check-5ddd1d56be29a329.yaml @@ -0,0 +1,10 @@ +--- +developer: + - | + :py:func:`assertExperimentDone` function has been added to + :py:class:`test.base.QiskitExperimentsTestCase`. This assertion will check + if all threads in the experiment data are successfuly completed. + This function calls `block_for_results` method and then checks if the experiment + status returns DONE after execution. It is `highly recommended` to use this test + right after each experiment execution to detect program malfunction, + which is paticulaly relavant to python multi-threading in multi-platform. diff --git a/test/base.py b/test/base.py index 1c567cfd52..b5fbd10daf 100644 --- a/test/base.py +++ b/test/base.py @@ -15,23 +15,40 @@ import dataclasses import json -from typing import Any, Callable, Optional import warnings +from typing import Any, Callable, Optional import numpy as np from qiskit.test import QiskitTestCase +from qiskit_experiments.calibration_management import Calibrations +from qiskit_experiments.database_service.db_experiment_data import ExperimentStatus from qiskit_experiments.framework import ( ExperimentDecoder, ExperimentEncoder, + ExperimentData, BaseExperiment, BaseAnalysis, ) -from qiskit_experiments.calibration_management import Calibrations class QiskitExperimentsTestCase(QiskitTestCase): """Qiskit Experiments specific extra functionality for test cases.""" + def assertExperimentDone(self, experiment_data: ExperimentData): + """Blocking execution of next line until all threads are completed then + checks if status returns Done. + + Args: + experiment_data: Experiment data to evaluate. + """ + experiment_data.block_for_results() + + self.assertEqual( + experiment_data.status(), + ExperimentStatus.DONE, + msg="All threads are executed but status is not DONE. " + experiment_data.errors(), + ) + def assertRoundTripSerializable(self, obj: Any, check_func: Optional[Callable] = None): """Assert that an object is round trip serializable. diff --git a/test/calibration/experiments/test_drag.py b/test/calibration/experiments/test_drag.py index 43ff08a0ae..884b45ab01 100644 --- a/test/calibration/experiments/test_drag.py +++ b/test/calibration/experiments/test_drag.py @@ -61,6 +61,7 @@ def test_end_to_end(self): drag = RoughDrag(1, self.x_plus) expdata = drag.run(backend) + self.assertExperimentDone(expdata) result = expdata.analysis_results(1) self.assertTrue(abs(result.value.value - backend.ideal_beta) < self.test_tol) @@ -73,6 +74,7 @@ def test_end_to_end(self): drag = RoughDrag(0, self.x_plus) drag.analysis.set_options(p0={"beta": 1.2}) exp_data = drag.run(backend) + self.assertExperimentDone(exp_data) result = exp_data.analysis_results(1) self.assertTrue(abs(result.value.value - backend.ideal_beta) < self.test_tol) @@ -85,6 +87,7 @@ def test_end_to_end(self): drag.set_run_options(shots=200) drag.analysis.set_options(p0={"beta": 1.8, "freq0": 0.08, "freq1": 0.16, "freq2": 0.32}) exp_data = drag.run(backend) + self.assertExperimentDone(exp_data) result = exp_data.analysis_results(1) meas_level = exp_data.metadata["job_metadata"][-1]["run_options"]["meas_level"] @@ -155,7 +158,8 @@ def test_update(self): prev_beta = self.cals.get_parameter_value("β", (0,), "x") self.assertEqual(prev_beta, 0) - RoughDragCal(qubit, self.cals, backend=self.backend).run().block_for_results() + expdata = RoughDragCal(qubit, self.cals, backend=self.backend).run() + self.assertExperimentDone(expdata) new_beta = self.cals.get_parameter_value("β", (0,), "x") self.assertTrue(abs(new_beta - self.backend.ideal_beta) < self.test_tol) diff --git a/test/calibration/experiments/test_fine_amplitude.py b/test/calibration/experiments/test_fine_amplitude.py index da17a83d9a..15690f27ea 100644 --- a/test/calibration/experiments/test_fine_amplitude.py +++ b/test/calibration/experiments/test_fine_amplitude.py @@ -51,6 +51,7 @@ def test_end_to_end_under_rotation(self, pi_ratio): backend = MockFineAmp(error, np.pi, "xp") expdata = amp_exp.run(backend) + self.assertExperimentDone(expdata) result = expdata.analysis_results(1) d_theta = result.value.value @@ -72,6 +73,7 @@ def test_end_to_end_over_rotation(self, pi_ratio): backend = MockFineAmp(error, np.pi, "xp") expdata = amp_exp.run(backend) + self.assertExperimentDone(expdata) result = expdata.analysis_results(1) d_theta = result.value.value @@ -215,6 +217,7 @@ def test_run_x_cal(self): # run the calibration experiment. This should update the amp parameter of x which we test. exp_data = amp_cal.run(self.backend) + self.assertExperimentDone(exp_data) d_theta = exp_data.analysis_results(1).value.value new_amp = init_amp * np.pi / (np.pi + d_theta) @@ -253,6 +256,7 @@ def test_run_sx_cal(self): # run the calibration experiment. This should update the amp parameter of x which we test. exp_data = amp_cal.run(MockFineAmp(-np.pi * 0.07, np.pi / 2, "sx")) + self.assertExperimentDone(exp_data) d_theta = exp_data.analysis_results(1).value.value new_amp = init_amp * (np.pi / 2) / (np.pi / 2 + d_theta) diff --git a/test/calibration/experiments/test_fine_drag.py b/test/calibration/experiments/test_fine_drag.py index 1b09b984bf..b552c022dc 100644 --- a/test/calibration/experiments/test_fine_drag.py +++ b/test/calibration/experiments/test_fine_drag.py @@ -66,6 +66,7 @@ def test_end_to_end(self): drag.set_experiment_options(schedule=self.schedule) drag.set_transpile_options(basis_gates=["rz", "Drag", "sx"]) exp_data = drag.run(FineDragTestBackend()) + self.assertExperimentDone(exp_data) self.assertEqual(exp_data.analysis_results(0).quality, "good") @@ -73,6 +74,7 @@ def test_end_to_end_no_schedule(self): """Test that we can run without a schedule.""" exp_data = FineXDrag(0).run(FineDragTestBackend()) + self.assertExperimentDone(exp_data) self.assertEqual(exp_data.analysis_results(0).quality, "good") @@ -127,6 +129,7 @@ def test_update_cals(self): # run the calibration experiment. This should update the beta parameter of x which we test. exp_data = drag_cal.run(self.backend) + self.assertExperimentDone(exp_data) d_theta = exp_data.analysis_results(1).value.value sigma = 40 target_angle = np.pi diff --git a/test/calibration/experiments/test_fine_frequency.py b/test/calibration/experiments/test_fine_frequency.py index 5e3c867fe4..ae2b5432aa 100644 --- a/test/calibration/experiments/test_fine_frequency.py +++ b/test/calibration/experiments/test_fine_frequency.py @@ -55,7 +55,8 @@ def test_end_to_end(self, freq_shift): freq_exp = FineFrequency(0, 160, backend) freq_exp.set_transpile_options(inst_map=self.inst_map) - expdata = freq_exp.run(shots=100).block_for_results() + expdata = freq_exp.run(shots=100) + self.assertExperimentDone(expdata) result = expdata.analysis_results(1) d_theta = result.value.value dt = backend.configuration().dt @@ -79,7 +80,8 @@ def test_calibration_version(self): self.assertAlmostEqual(freq_before, armonk_freq) - fine_freq.run().block_for_results() + expdata = fine_freq.run() + self.assertExperimentDone(expdata) freq_after = self.cals.get_parameter_value(self.cals.__drive_freq_parameter__, 0) diff --git a/test/calibration/experiments/test_rabi.py b/test/calibration/experiments/test_rabi.py index 024ce5c97d..cecc706a72 100644 --- a/test/calibration/experiments/test_rabi.py +++ b/test/calibration/experiments/test_rabi.py @@ -29,6 +29,7 @@ from qiskit_experiments.data_processing.data_processor import DataProcessor from qiskit_experiments.data_processing.nodes import Probability from qiskit_experiments.test.mock_iq_backend import RabiBackend +from qiskit_experiments.database_service.db_experiment_data import ExperimentStatus class TestRabiEndToEnd(QiskitExperimentsTestCase): @@ -54,6 +55,7 @@ def test_rabi_end_to_end(self): rabi = Rabi(self.qubit, self.sched) rabi.set_experiment_options(amplitudes=np.linspace(-0.95, 0.95, 21)) expdata = rabi.run(backend) + self.assertExperimentDone(expdata) result = expdata.analysis_results(0) self.assertEqual(result.quality, "good") @@ -64,6 +66,7 @@ def test_rabi_end_to_end(self): rabi = Rabi(self.qubit, self.sched) rabi.set_experiment_options(amplitudes=np.linspace(-0.95, 0.95, 21)) expdata = rabi.run(backend) + self.assertExperimentDone(expdata) result = expdata.analysis_results(0) self.assertEqual(result.quality, "good") self.assertTrue(abs(result.value.value[1] - backend.rabi_rate) < test_tol) @@ -73,6 +76,7 @@ def test_rabi_end_to_end(self): rabi = Rabi(self.qubit, self.sched) rabi.set_experiment_options(amplitudes=np.linspace(-0.95, 0.95, 101)) expdata = rabi.run(backend) + self.assertExperimentDone(expdata) result = expdata.analysis_results(0) self.assertEqual(result.quality, "good") self.assertTrue(abs(result.value.value[1] - backend.rabi_rate) < test_tol) @@ -91,6 +95,7 @@ def test_wrong_processor(self): data = rabi.run(backend) result = data.analysis_results() + self.assertEqual(data.status(), ExperimentStatus.ERROR) self.assertEqual(len(result), 0) def test_experiment_config(self): @@ -135,6 +140,7 @@ def test_ef_rabi_end_to_end(self): rabi = EFRabi(self.qubit, self.sched) rabi.set_experiment_options(amplitudes=np.linspace(-0.95, 0.95, 21)) expdata = rabi.run(backend) + self.assertExperimentDone(expdata) result = expdata.analysis_results(1) self.assertEqual(result.quality, "good") diff --git a/test/calibration/experiments/test_ramsey_xy.py b/test/calibration/experiments/test_ramsey_xy.py index 8685e43be4..efb536a9e1 100644 --- a/test/calibration/experiments/test_ramsey_xy.py +++ b/test/calibration/experiments/test_ramsey_xy.py @@ -44,6 +44,7 @@ def test_end_to_end(self): for freq_shift in [2e6, -3e6]: test_data = ramsey.run(MockRamseyXY(freq_shift=freq_shift)) + self.assertExperimentDone(test_data) meas_shift = test_data.analysis_results(1).value.value self.assertTrue((meas_shift - freq_shift) < abs(test_tol * freq_shift)) @@ -62,7 +63,8 @@ def test_update_calibrations(self): freq_shift = 4e6 osc_shift = 2e6 backend = MockRamseyXY(freq_shift=freq_shift + osc_shift) # oscillation with 6 MHz - FrequencyCal(0, self.cals, backend, osc_freq=osc_shift).run().block_for_results() + expdata = FrequencyCal(0, self.cals, backend, osc_freq=osc_shift).run() + self.assertExperimentDone(expdata) # Check that qubit frequency after running the cal is shifted by freq_shift, i.e. 4 MHz. f01 = self.cals.get_parameter_value(freq_name, 0) diff --git a/test/calibration/experiments/test_rough_amplitude.py b/test/calibration/experiments/test_rough_amplitude.py index 2316526b72..05b4289667 100644 --- a/test/calibration/experiments/test_rough_amplitude.py +++ b/test/calibration/experiments/test_rough_amplitude.py @@ -60,7 +60,8 @@ def test_update(self): self.assertTrue(np.allclose(self.cals.get_parameter_value("amp", 0, "sx"), 0.25)) rabi_ef = RoughXSXAmplitudeCal(0, self.cals) - rabi_ef.run(RabiBackend(amplitude_to_angle=np.pi * 1.5)).block_for_results() + expdata = rabi_ef.run(RabiBackend(amplitude_to_angle=np.pi * 1.5)) + self.assertExperimentDone(expdata) tol = 0.002 self.assertTrue(abs(self.cals.get_parameter_value("amp", 0, "x") - 0.333) < tol) @@ -135,7 +136,8 @@ def test_ef_update(self): self.assertTrue(np.allclose(self.cals.get_parameter_value("amp", 0, "sx12"), 0.2)) rabi_ef = EFRoughXSXAmplitudeCal(0, self.cals) - rabi_ef.run(RabiBackend(amplitude_to_angle=np.pi * 1.5)).block_for_results() + expdata = rabi_ef.run(RabiBackend(amplitude_to_angle=np.pi * 1.5)) + self.assertExperimentDone(expdata) tol = 0.002 self.assertTrue(abs(self.cals.get_parameter_value("amp", 0, "x12") - 0.333) < tol) diff --git a/test/calibration/experiments/test_rough_frequency.py b/test/calibration/experiments/test_rough_frequency.py index 8770459dc3..c2263333ba 100644 --- a/test/calibration/experiments/test_rough_frequency.py +++ b/test/calibration/experiments/test_rough_frequency.py @@ -60,7 +60,8 @@ def test_update_calibrations(self): frequencies = np.linspace(freq01 - 10.0e6, freq01 + 10.0e6, 21) - RoughFrequencyCal(0, cals, frequencies).run(backend).block_for_results() + expdata = RoughFrequencyCal(0, cals, frequencies).run(backend) + self.assertExperimentDone(expdata) # Check the updated frequency which should be shifted by 5MHz. post_freq = cals.get_parameter_value(cals.__drive_freq_parameter__, (0,)) diff --git a/test/calibration/test_update_library.py b/test/calibration/test_update_library.py index edf0b29fb1..fa9b2cd1e4 100644 --- a/test/calibration/test_update_library.py +++ b/test/calibration/test_update_library.py @@ -66,6 +66,7 @@ def test_frequency(self): spec = QubitSpectroscopy(qubit, frequencies) spec.set_run_options(meas_level=MeasLevel.CLASSIFIED) exp_data = spec.run(backend) + self.assertExperimentDone(exp_data) result = exp_data.analysis_results(1) value = result.value.value diff --git a/test/database_service/test_db_experiment_data.py b/test/database_service/test_db_experiment_data.py index 0372becc4b..b44426fa3c 100644 --- a/test/database_service/test_db_experiment_data.py +++ b/test/database_service/test_db_experiment_data.py @@ -129,9 +129,9 @@ def test_add_data_job(self): exp_data = DbExperimentData(backend=self.backend, experiment_type="qiskit_test") exp_data.add_jobs(a_job) - exp_data.block_for_results() + self.assertExperimentDone(exp_data) exp_data.add_jobs(jobs) - exp_data.block_for_results() + self.assertExperimentDone(exp_data) self.assertEqual(expected, [sdata["counts"] for sdata in exp_data.data()]) self.assertIn(a_job.job_id(), exp_data.job_ids) @@ -156,7 +156,7 @@ def _callback(_exp_data): exp_data = DbExperimentData(backend=self.backend, experiment_type="qiskit_test") exp_data.add_jobs(a_job) exp_data.add_analysis_callback(_callback) - exp_data.block_for_results() + self.assertExperimentDone(exp_data) self.assertTrue(called_back) def test_add_data_callback(self): @@ -189,7 +189,7 @@ def _callback(_exp_data): with self.subTest(data=data): exp_data.add_data(data) exp_data.add_analysis_callback(_callback) - exp_data.block_for_results() + self.assertExperimentDone(exp_data) self.assertEqual(len(subtests), called_back_count) @@ -211,7 +211,7 @@ def _callback(_exp_data, **kwargs): exp_data = DbExperimentData(backend=self.backend, experiment_type="qiskit_test") exp_data.add_jobs(a_job) exp_data.add_analysis_callback(_callback, foo=callback_kwargs) - exp_data.block_for_results() + self.assertExperimentDone(exp_data) self.assertTrue(called_back) def test_add_data_pending_post_processing(self): @@ -637,8 +637,7 @@ def test_status_done(self): exp_data = DbExperimentData(experiment_type="qiskit_test") exp_data.add_jobs(job) exp_data.add_jobs(job) - exp_data.add_analysis_callback(lambda *args, **kwargs: time.sleep(1)) - exp_data.block_for_results() + self.assertExperimentDone(exp_data) self.assertEqual(ExperimentStatus.DONE, exp_data.status()) def test_set_tags(self): @@ -667,7 +666,7 @@ def _job_result(): # Cleanup with self.assertLogs("qiskit_experiments", "WARNING"): event.set() - exp_data.block_for_results() + self.assertExperimentDone(exp_data) def test_cancel_analysis(self): """Test canceling experiment analysis.""" @@ -813,7 +812,7 @@ def _sleeper(*args, **kwargs): # pylint: disable=unused-argument exp_data = DbExperimentData(experiment_type="qiskit_test") exp_data.add_jobs(job) exp_data.add_analysis_callback(_sleeper) - exp_data.block_for_results() + self.assertExperimentDone(exp_data) self.assertEqual(2, sleep_count) def test_additional_attr(self): diff --git a/test/quantum_volume/test_qv.py b/test/quantum_volume/test_qv.py index 1e08abc76a..4209a1f8b9 100644 --- a/test/quantum_volume/test_qv.py +++ b/test/quantum_volume/test_qv.py @@ -105,8 +105,10 @@ def test_qv_sigma_decreasing(self): # set number of trials to a low number to make the test faster qv_exp.set_experiment_options(trials=2) expdata1 = qv_exp.run(backend) + self.assertExperimentDone(expdata1) result_data1 = expdata1.analysis_results(0) expdata2 = qv_exp.run(backend, analysis=None) + self.assertExperimentDone(expdata2) expdata2.add_data(expdata1.data()) qv_exp.analysis.run(expdata2) result_data2 = expdata2.analysis_results(0) diff --git a/test/randomized_benchmarking/test_rb.py b/test/randomized_benchmarking/test_rb.py index 7c186b5528..6f7f15374f 100644 --- a/test/randomized_benchmarking/test_rb.py +++ b/test/randomized_benchmarking/test_rb.py @@ -58,6 +58,7 @@ def test_rb_experiment(self, qubits: list): seed=exp_attributes["seed"], ) exp_data = rb_exp.run(backend) + self.assertExperimentDone(exp_data) exp = exp_data.experiment exp_circuits = rb_exp.circuits() self.validate_metadata(exp_circuits, exp_attributes) @@ -203,6 +204,7 @@ def test_interleaved_rb_experiment(self, interleaved_element: "Gate", qubits: li seed=exp_attributes["seed"], ) experiment_obj = rb_exp.run(backend) + self.assertExperimentDone(experiment_obj) exp_data = experiment_obj.experiment exp_circuits = rb_exp.circuits() self.validate_metadata(exp_circuits, exp_attributes) diff --git a/test/randomized_benchmarking/test_rb_analysis.py b/test/randomized_benchmarking/test_rb_analysis.py index 45b3b08b91..aecc3822cf 100644 --- a/test/randomized_benchmarking/test_rb_analysis.py +++ b/test/randomized_benchmarking/test_rb_analysis.py @@ -205,7 +205,8 @@ def _load_rb_data(self, rb_exp_data_file_name: str): ((0, 1), "cx"): 1, } rb_exp.analysis.set_options(gate_error_ratio=gate_error_ratio) - analysis_results = rb_exp.analysis.run(expdata1).block_for_results() + analysis_results = rb_exp.analysis.run(expdata1) + self.assertExperimentDone(analysis_results) return data, analysis_results @@ -260,7 +261,8 @@ def _load_rb_data(self, rb_exp_data_file_name: str): ((0, 1), "cx"): 1, } rb_exp.analysis.set_options(gate_error_ratio=gate_error_ratio) - analysis_results = rb_exp.analysis.run(expdata1).block_for_results() + analysis_results = rb_exp.analysis.run(expdata1) + self.assertExperimentDone(analysis_results) return data, analysis_results def test_interleaved_rb_analysis_test(self): diff --git a/test/test_composite.py b/test/test_composite.py index 42b352e452..8532007659 100644 --- a/test/test_composite.py +++ b/test/test_composite.py @@ -64,7 +64,8 @@ def test_parallel_options(self): self.assertEqual(par_exp.transpile_options, Options(optimization_level=0)) self.assertEqual(par_exp.analysis.options, Options()) - par_exp.run(FakeBackend()) + expdata = par_exp.run(FakeBackend()) + self.assertExperimentDone(expdata) def test_experiment_config(self): """Test converting to and from config works""" @@ -108,7 +109,8 @@ def setUp(self): exp3 = FakeExperiment([0, 1, 2, 3]) batch_exp = BatchExperiment([par_exp, exp3]) - self.rootdata = batch_exp.run(backend=self.backend).block_for_results() + self.rootdata = batch_exp.run(backend=self.backend) + self.assertExperimentDone(self.rootdata) self.assertEqual(len(self.rootdata.child_data()), 2) self.rootdata.share_level = self.share_level @@ -195,9 +197,8 @@ def test_nested_composite(self): exp4 = BatchExperiment([exp3, exp1]) exp5 = ParallelExperiment([exp4, FakeExperiment([4])]) nested_exp = BatchExperiment([exp5, exp3]) - expdata = nested_exp.run(FakeBackend()).block_for_results() - status = expdata.status() - self.assertEqual(status.name, "DONE") + expdata = nested_exp.run(FakeBackend()) + self.assertExperimentDone(expdata) def test_analysis_replace_results_true(self): """ @@ -206,15 +207,18 @@ def test_analysis_replace_results_true(self): exp1 = FakeExperiment([0, 2]) exp2 = FakeExperiment([1, 3]) par_exp = ParallelExperiment([exp1, exp2]) - data1 = par_exp.run(FakeBackend()).block_for_results() + data1 = par_exp.run(FakeBackend()) + self.assertExperimentDone(data1) # Additional data not part of composite experiment exp3 = FakeExperiment([0, 1]) - extra_data = exp3.run(FakeBackend()).block_for_results() + extra_data = exp3.run(FakeBackend()) + self.assertExperimentDone(extra_data) data1.add_child_data(extra_data) # Replace results - data2 = par_exp.analysis.run(data1, replace_results=True).block_for_results() + data2 = par_exp.analysis.run(data1, replace_results=True) + self.assertExperimentDone(data2) self.assertEqual(data1, data2) self.assertEqual(len(data1.child_data()), len(data2.child_data())) for sub1, sub2 in zip(data1.child_data(), data2.child_data()): @@ -227,15 +231,18 @@ def test_analysis_replace_results_false(self): exp1 = FakeExperiment([0, 2]) exp2 = FakeExperiment([1, 3]) par_exp = BatchExperiment([exp1, exp2]) - data1 = par_exp.run(FakeBackend()).block_for_results() + data1 = par_exp.run(FakeBackend()) + self.assertExperimentDone(data1) # Additional data not part of composite experiment exp3 = FakeExperiment([0, 1]) - extra_data = exp3.run(FakeBackend()).block_for_results() + extra_data = exp3.run(FakeBackend()) + self.assertExperimentDone(extra_data) data1.add_child_data(extra_data) # Replace results - data2 = par_exp.analysis.run(data1).block_for_results() + data2 = par_exp.analysis.run(data1, replace_results=False) + self.assertExperimentDone(data2) self.assertNotEqual(data1.experiment_id, data2.experiment_id) self.assertEqual(len(data1.child_data()), len(data2.child_data())) for sub1, sub2 in zip(data1.child_data(), data2.child_data()): @@ -248,7 +255,8 @@ def test_composite_tags(self): exp1 = FakeExperiment([0, 2]) exp2 = FakeExperiment([1, 3]) par_exp = BatchExperiment([exp1, exp2]) - expdata = par_exp.run(FakeBackend()).block_for_results() + expdata = par_exp.run(FakeBackend()) + self.assertExperimentDone(expdata) data1 = expdata.child_data(0) data2 = expdata.child_data(1) @@ -403,7 +411,8 @@ def circuits(self): par_exp = ParallelExperiment( [exp1, BatchExperiment([ParallelExperiment([exp2, exp3]), exp4])] ) - expdata = par_exp.run(Backend()).block_for_results() + expdata = par_exp.run(Backend()) + self.assertExperimentDone(expdata) self.assertEqual(len(expdata.data()), len(counts)) for circ_data, circ_counts in zip(expdata.data(), counts): diff --git a/test/test_cross_resonance_hamiltonian.py b/test/test_cross_resonance_hamiltonian.py index ebeed53dad..ab638f38a7 100644 --- a/test/test_cross_resonance_hamiltonian.py +++ b/test/test_cross_resonance_hamiltonian.py @@ -247,6 +247,7 @@ def test_integration(self, ix, iy, iz, zx, zy, zz): qubits=(0, 1), flat_top_widths=durations, sigma=sigma, risefall=2 ) exp_data = expr.run(backend, shots=2000) + self.assertExperimentDone(exp_data) self.assertEqual(exp_data.analysis_results(0).quality, "good") self.assertAlmostEqual(exp_data.analysis_results("omega_ix").value.value, ix, delta=2e4) diff --git a/test/test_framework.py b/test/test_framework.py index 488dd655a9..1b1f177ee0 100644 --- a/test/test_framework.py +++ b/test/test_framework.py @@ -43,6 +43,7 @@ def circuits(self): exp = Experiment([0]) expdata = exp.run(backend) + self.assertExperimentDone(expdata) job_ids = expdata.job_ids # Comptue expected number of jobs @@ -58,10 +59,10 @@ def test_analysis_replace_results_true(self): """Test running analysis with replace_results=True""" analysis = FakeAnalysis() expdata1 = analysis.run(ExperimentData(), seed=54321) - expdata1.block_for_results() + self.assertExperimentDone(expdata1) result_ids = [res.result_id for res in expdata1.analysis_results()] expdata2 = analysis.run(expdata1, replace_results=True, seed=12345) - expdata2.block_for_results() + self.assertExperimentDone(expdata2) self.assertEqual(expdata1, expdata2) self.assertEqual(expdata1.analysis_results(), expdata2.analysis_results()) @@ -71,9 +72,9 @@ def test_analysis_replace_results_false(self): """Test running analysis with replace_results=False""" analysis = FakeAnalysis() expdata1 = analysis.run(ExperimentData(), seed=54321) - expdata1.block_for_results() + self.assertExperimentDone(expdata1) expdata2 = analysis.run(expdata1, replace_results=False, seed=12345) - expdata2.block_for_results() + self.assertExperimentDone(expdata2) self.assertNotEqual(expdata1, expdata2) self.assertNotEqual(expdata1.experiment_id, expdata2.experiment_id) diff --git a/test/test_half_angle.py b/test/test_half_angle.py index 02c80a0cad..c445f21fb1 100644 --- a/test/test_half_angle.py +++ b/test/test_half_angle.py @@ -51,6 +51,7 @@ def test_end_to_end(self): for error in [-0.05, -0.02, 0.02, 0.05]: hac = HalfAngle(0) exp_data = hac.run(HalfAngleTestBackend(error)) + self.assertExperimentDone(exp_data) d_theta = exp_data.analysis_results(1).value.value self.assertTrue(abs(d_theta - error) < tol) diff --git a/test/test_qubit_spectroscopy.py b/test/test_qubit_spectroscopy.py index 1b7762c242..514f47258e 100644 --- a/test/test_qubit_spectroscopy.py +++ b/test/test_qubit_spectroscopy.py @@ -64,6 +64,7 @@ def test_spectroscopy_end2end_classified(self): spec = QubitSpectroscopy(qubit, frequencies) spec.set_run_options(meas_level=MeasLevel.CLASSIFIED) expdata = spec.run(backend) + self.assertExperimentDone(expdata) result = expdata.analysis_results(1) value = result.value.value @@ -76,6 +77,7 @@ def test_spectroscopy_end2end_classified(self): spec = QubitSpectroscopy(qubit, frequencies) spec.set_run_options(meas_level=MeasLevel.CLASSIFIED) expdata = spec.run(backend) + self.assertExperimentDone(expdata) result = expdata.analysis_results(1) value = result.value.value @@ -92,6 +94,7 @@ def test_spectroscopy_end2end_kerneled(self): spec = QubitSpectroscopy(qubit, frequencies) expdata = spec.run(backend) + self.assertExperimentDone(expdata) result = expdata.analysis_results(1) value = result.value.value @@ -103,6 +106,7 @@ def test_spectroscopy_end2end_kerneled(self): spec = QubitSpectroscopy(qubit, frequencies) expdata = spec.run(backend) + self.assertExperimentDone(expdata) result = expdata.analysis_results(1) value = result.value.value @@ -111,6 +115,7 @@ def test_spectroscopy_end2end_kerneled(self): spec.set_run_options(meas_return="avg") expdata = spec.run(backend) + self.assertExperimentDone(expdata) result = expdata.analysis_results(1) value = result.value.value @@ -131,6 +136,7 @@ def test_spectroscopy12_end2end_classified(self): spec.backend = backend spec.set_run_options(meas_level=MeasLevel.CLASSIFIED) expdata = spec.run(backend) + self.assertExperimentDone(expdata) result = expdata.analysis_results(1) value = result.value.value diff --git a/test/test_readout_angle.py b/test/test_readout_angle.py index 3f75f3fb65..eb9fe03114 100644 --- a/test/test_readout_angle.py +++ b/test/test_readout_angle.py @@ -13,9 +13,9 @@ Test readout angle experiment """ +from test.base import QiskitExperimentsTestCase import numpy as np -from qiskit.test import QiskitTestCase from qiskit_experiments.library import ReadoutAngle from qiskit_experiments.test.mock_iq_backend import MockIQBackend @@ -29,7 +29,7 @@ def _compute_probability(self, circuit): return 1 - circuit.metadata["xval"] -class TestReadoutAngle(QiskitTestCase): +class TestReadoutAngle(QiskitExperimentsTestCase): """ Test the readout angle experiment """ @@ -40,12 +40,14 @@ def test_readout_angle_end2end(self): """ backend = ReadoutAngleBackend(iq_cluster_centers=(5.0, 5.0, -3.0, 3.0)) exp = ReadoutAngle(0) - expdata = exp.run(backend, shots=100000).block_for_results() + expdata = exp.run(backend, shots=100000) + self.assertExperimentDone(expdata) res = expdata.analysis_results(0) self.assertAlmostEqual(res.value % (2 * np.pi), np.pi / 2, places=2) backend = ReadoutAngleBackend(iq_cluster_centers=(5.0, 5.0, 0, -3.0)) exp = ReadoutAngle(0) - expdata = exp.run(backend, shots=100000).block_for_results() + expdata = exp.run(backend, shots=100000) + self.assertExperimentDone(expdata) res = expdata.analysis_results(0) self.assertAlmostEqual(res.value % (2 * np.pi), 15 * np.pi / 8, places=2) diff --git a/test/test_t1.py b/test/test_t1.py index e2f19611c3..2dc7e8711a 100644 --- a/test/test_t1.py +++ b/test/test_t1.py @@ -44,6 +44,7 @@ def test_t1_end2end(self): exp = T1(0, delays) exp.analysis.set_options(p0={"amp": 1, "tau": t1, "base": 0}) exp_data = exp.run(backend, shots=10000) + self.assertExperimentDone(exp_data) res = exp_data.analysis_results("T1") fitval = res.value self.assertEqual(res.quality, "good") @@ -68,7 +69,8 @@ def test_t1_parallel(self): exp0 = T1(0, delays) exp2 = T1(2, delays) par_exp = ParallelExperiment([exp0, exp2]) - res = par_exp.run(T1Backend([t1[0], None, t1[1]])).block_for_results() + res = par_exp.run(T1Backend([t1[0], None, t1[1]])) + self.assertExperimentDone(res) for i in range(2): sub_res = res.child_data(i).analysis_results("T1") @@ -99,7 +101,8 @@ def test_t1_parallel_different_analysis_options(self): exp1.analysis.set_options(p0={"tau": 1000000}) par_exp = ParallelExperiment([exp0, exp1]) - res = par_exp.run(T1Backend([t1, t1])).block_for_results() + res = par_exp.run(T1Backend([t1, t1])) + self.assertExperimentDone(res) sub_res = [] for i in range(2): diff --git a/test/test_t2ramsey.py b/test/test_t2ramsey.py index 92ffaefff2..fce66aeeed 100644 --- a/test/test_t2ramsey.py +++ b/test/test_t2ramsey.py @@ -65,7 +65,7 @@ def test_t2ramsey_run_end2end(self): for user_p0 in [default_p0, dict()]: exp.analysis.set_options(p0=user_p0) expdata = exp.run(backend=backend, shots=2000) - expdata.block_for_results() # Wait for job/analysis to finish. + self.assertExperimentDone(expdata) result = expdata.analysis_results("T2star") self.assertAlmostEqual( result.value.value, @@ -104,7 +104,8 @@ def test_t2ramsey_parallel(self): } backend = T2RamseyBackend(p0) - expdata = par_exp.run(backend=backend, shots=1000).block_for_results() + expdata = par_exp.run(backend=backend, shots=1000) + self.assertExperimentDone(expdata) for i in range(2): res_t2star = expdata.child_data(i).analysis_results("T2star") @@ -161,6 +162,7 @@ def test_t2ramsey_concat_2_experiments(self): # run circuits expdata0 = exp0.run(backend=backend, shots=1000) + self.assertExperimentDone(expdata0) res_t2star_0 = expdata0.analysis_results("T2star") # second experiment @@ -168,6 +170,7 @@ def test_t2ramsey_concat_2_experiments(self): exp1 = T2Ramsey(qubit, delays1) exp1.analysis.set_options(p0=default_p0) expdata1 = exp1.run(backend=backend, analysis=None, shots=1000) + self.assertExperimentDone(expdata1) expdata1.add_data(expdata0.data()) exp1.analysis.run(expdata1) diff --git a/test/test_tomography.py b/test/test_tomography.py index 93f1db3c53..6e7929d94e 100644 --- a/test/test_tomography.py +++ b/test/test_tomography.py @@ -52,6 +52,7 @@ def test_full_qst(self, num_qubits, fitter): if fitter: qstexp.analysis.set_options(fitter=fitter) expdata = qstexp.run(backend) + self.assertExperimentDone(expdata) results = expdata.analysis_results() # Check state is density matrix @@ -77,6 +78,7 @@ def test_qst_teleport(self): backend = AerSimulator(seed_simulator=9000) exp = StateTomography(teleport_circuit(), measurement_qubits=[2]) expdata = exp.run(backend) + self.assertExperimentDone(expdata) results = expdata.analysis_results() # Check result @@ -167,6 +169,7 @@ def test_full_exp_measurement_qubits(self, meas_qubits): backend = AerSimulator(seed_simulator=9000) exp = StateTomography(circ, measurement_qubits=meas_qubits) expdata = exp.run(backend) + self.assertExperimentDone(expdata) results = expdata.analysis_results() # Check result @@ -208,7 +211,8 @@ def test_batch_exp(self): # Run batch experiments backend = AerSimulator(seed_simulator=9000) batch_exp = BatchExperiment(exps) - batch_data = batch_exp.run(backend).block_for_results() + batch_data = batch_exp.run(backend) + self.assertExperimentDone(batch_data) # Check target fidelity of component experiments f_threshold = 0.95 @@ -246,7 +250,8 @@ def test_parallel_exp(self): # Run batch experiments backend = AerSimulator(seed_simulator=9000) par_exp = ParallelExperiment(exps) - par_data = par_exp.run(backend).block_for_results() + par_data = par_exp.run(backend) + self.assertExperimentDone(par_data) # Check target fidelity of component experiments f_threshold = 0.95 @@ -298,6 +303,7 @@ def test_full_qpt(self, num_qubits, fitter): if fitter: qstexp.analysis.set_options(fitter=fitter) expdata = qstexp.run(backend) + self.assertExperimentDone(expdata) results = expdata.analysis_results() # Check state is density matrix @@ -371,6 +377,7 @@ def test_full_exp_meas_prep_qubits(self, qubits): backend = AerSimulator(seed_simulator=9000) exp = ProcessTomography(circ, measurement_qubits=qubits, preparation_qubits=qubits) expdata = exp.run(backend) + self.assertExperimentDone(expdata) results = expdata.analysis_results() # Check result @@ -397,6 +404,7 @@ def test_qpt_teleport(self): backend = AerSimulator(seed_simulator=9000) exp = ProcessTomography(teleport_circuit(), measurement_qubits=[2], preparation_qubits=[0]) expdata = exp.run(backend, shots=10000) + self.assertExperimentDone(expdata) results = expdata.analysis_results() # Check result @@ -431,7 +439,8 @@ def test_batch_exp_with_measurement_qubits(self): # Run batch experiments backend = AerSimulator(seed_simulator=9000) batch_exp = BatchExperiment(exps) - batch_data = batch_exp.run(backend).block_for_results() + batch_data = batch_exp.run(backend) + self.assertExperimentDone(batch_data) # Check target fidelity of component experiments f_threshold = 0.95 @@ -467,7 +476,8 @@ def test_parallel_exp(self): # Run batch experiments backend = AerSimulator(seed_simulator=9000) par_exp = ParallelExperiment(exps) - par_data = par_exp.run(backend).block_for_results() + par_data = par_exp.run(backend) + self.assertExperimentDone(par_data) # Check target fidelity of component experiments f_threshold = 0.95