From 2f2ab3ffd3ccab5cfaff99881b0c458b5add8183 Mon Sep 17 00:00:00 2001 From: Christopher Wood Date: Sat, 9 Oct 2021 12:14:15 -0400 Subject: [PATCH 1/2] Fix bug with ExperimentData.load `ExperimentData.load` returned an instanced of DbExperimentDataV1 instead of `ExperimentData`. This could lead to errors if analysis was run on this class. --- .../framework/experiment_data.py | 18 ++++++++++++++++++ .../fix-expdata-load-b7c6569bfbe67bec.yaml | 8 ++++++++ 2 files changed, 26 insertions(+) create mode 100644 releasenotes/notes/fix-expdata-load-b7c6569bfbe67bec.yaml diff --git a/qiskit_experiments/framework/experiment_data.py b/qiskit_experiments/framework/experiment_data.py index 0742e27cec..215779fefd 100644 --- a/qiskit_experiments/framework/experiment_data.py +++ b/qiskit_experiments/framework/experiment_data.py @@ -17,6 +17,7 @@ from datetime import datetime from qiskit_experiments.database_service import DbExperimentDataV1 +from qiskit_experiments.database_service.database_service import DatabaseServiceV1 LOG = logging.getLogger(__name__) @@ -62,6 +63,23 @@ def completion_times(self) -> Dict[str, datetime]: return job_times + @classmethod + def load(cls, experiment_id: str, service: DatabaseServiceV1) -> "ExperimentData": + """Load a saved experiment data from a database service. + + Args: + experiment_id: Experiment ID. + service: the database service. + + Returns: + The loaded experiment data. + """ + db_expdata = DbExperimentDataV1.load(experiment_id, service=service) + expdata = ExperimentData() + for attr, value in db_expdata.__dict__.items(): + setattr(expdata, attr, value) + return expdata + def _copy_metadata(self, new_instance: Optional["ExperimentData"] = None) -> "ExperimentData": """Make a copy of the experiment metadata. diff --git a/releasenotes/notes/fix-expdata-load-b7c6569bfbe67bec.yaml b/releasenotes/notes/fix-expdata-load-b7c6569bfbe67bec.yaml new file mode 100644 index 0000000000..4aa9251974 --- /dev/null +++ b/releasenotes/notes/fix-expdata-load-b7c6569bfbe67bec.yaml @@ -0,0 +1,8 @@ +--- +fixes: + - | + Fixes bug where the + :meth:`~qiskit_experiments.framework.ExperimentData.load` method of + :class:`~qiskit_experiments.framework.ExperimentData` would return a + :class:`~qiskit_experiments.database_service.DbExperimentDataV1` object + instead of a :class:`~qiskit_experiments.framework.ExperimentData` object. From 65e3be7b8e0724a14b72d94f266136c226026788 Mon Sep 17 00:00:00 2001 From: Christopher Wood Date: Tue, 19 Oct 2021 12:31:51 -0400 Subject: [PATCH 2/2] Update load following PR 364 --- .../composite/composite_experiment_data.py | 13 +++++-------- qiskit_experiments/framework/experiment_data.py | 7 +++---- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/qiskit_experiments/framework/composite/composite_experiment_data.py b/qiskit_experiments/framework/composite/composite_experiment_data.py index 7fe1064c40..8a789f076b 100644 --- a/qiskit_experiments/framework/composite/composite_experiment_data.py +++ b/qiskit_experiments/framework/composite/composite_experiment_data.py @@ -17,7 +17,7 @@ from qiskit.result import marginal_counts from qiskit.exceptions import QiskitError from qiskit_experiments.framework.experiment_data import ExperimentData -from qiskit_experiments.database_service import DbExperimentDataV1, DatabaseServiceV1 +from qiskit_experiments.database_service import DatabaseServiceV1 class CompositeExperimentData(ExperimentData): @@ -114,19 +114,16 @@ def save_metadata(self) -> None: @classmethod def load(cls, experiment_id: str, service: DatabaseServiceV1) -> "CompositeExperimentData": - expdata = DbExperimentDataV1.load(experiment_id, service) - components = [] + expdata = ExperimentData.load(experiment_id, service) + expdata.__class__ = CompositeExperimentData + expdata._components = [] for comp_id, comp_class in zip( expdata.metadata["component_ids"], expdata.metadata["component_classes"] ): load_class = globals()[comp_class] load_func = getattr(load_class, "load") loaded_comp = load_func(comp_id, service) - components.append(loaded_comp) - - expdata.__class__ = CompositeExperimentData - expdata._experiment = None - expdata._components = components + expdata._components.append(loaded_comp) return expdata diff --git a/qiskit_experiments/framework/experiment_data.py b/qiskit_experiments/framework/experiment_data.py index 215779fefd..eae48238bb 100644 --- a/qiskit_experiments/framework/experiment_data.py +++ b/qiskit_experiments/framework/experiment_data.py @@ -74,10 +74,9 @@ def load(cls, experiment_id: str, service: DatabaseServiceV1) -> "ExperimentData Returns: The loaded experiment data. """ - db_expdata = DbExperimentDataV1.load(experiment_id, service=service) - expdata = ExperimentData() - for attr, value in db_expdata.__dict__.items(): - setattr(expdata, attr, value) + expdata = DbExperimentDataV1.load(experiment_id, service) + expdata.__class__ = ExperimentData + expdata._experiment = None return expdata def _copy_metadata(self, new_instance: Optional["ExperimentData"] = None) -> "ExperimentData":