diff --git a/qiskit_experiments/database_service/db_experiment_data.py b/qiskit_experiments/database_service/db_experiment_data.py index 513802d5ce..d0bb3046c1 100644 --- a/qiskit_experiments/database_service/db_experiment_data.py +++ b/qiskit_experiments/database_service/db_experiment_data.py @@ -24,6 +24,7 @@ import contextlib from collections import deque from datetime import datetime +import numpy as np from matplotlib import pyplot from qiskit.providers import Job, BaseJob, Backend, BaseBackend, Provider @@ -1218,7 +1219,7 @@ def tags(self, new_tags: List[str]) -> None: raise DbExperimentDataError( f"The `tags` field of {type(self).__name__} must be a list." ) - self._tags = new_tags + self._tags = np.unique(new_tags).tolist() if self.auto_save: self.save_metadata() @@ -1297,7 +1298,7 @@ def figure_names(self) -> List[str]: @property def share_level(self) -> str: - """Return the share level fo this experiment. + """Return the share level for this experiment Returns: Experiment share level. @@ -1306,7 +1307,8 @@ def share_level(self) -> str: @share_level.setter def share_level(self, new_level: str) -> None: - """Set the experiment share level. + """Set the experiment share level, + only to this experiment and not to its descendants. Args: new_level: New experiment share level. Valid share levels are provider- @@ -1348,7 +1350,7 @@ def service(self) -> Optional[DatabaseServiceV1]: @service.setter def service(self, service: DatabaseServiceV1) -> None: - """Set the service to be used for storing experiment data. + """Set the service to be used for storing experiment data Args: service: Service to be used. @@ -1359,7 +1361,8 @@ def service(self, service: DatabaseServiceV1) -> None: self._set_service(service) def _set_service(self, service: DatabaseServiceV1) -> None: - """Set the service to be used for storing experiment data. + """Set the service to be used for storing experiment data, + to this experiment only and not to its descendants Args: service: Service to be used. diff --git a/qiskit_experiments/framework/composite/composite_analysis.py b/qiskit_experiments/framework/composite/composite_analysis.py index 6841f6c19f..b37fbc04b3 100644 --- a/qiskit_experiments/framework/composite/composite_analysis.py +++ b/qiskit_experiments/framework/composite/composite_analysis.py @@ -39,7 +39,7 @@ class CompositeAnalysis(BaseAnalysis): composite :class:`ExperimentData`. When calling :meth:`run` on experiment data already containing - initalized component experiment child data, any previously stored + initialized component experiment child data, any previously stored circuit data will be cleared and replaced with the marginalized data reconstructed from the parent composite experiment data. """ diff --git a/qiskit_experiments/framework/experiment_data.py b/qiskit_experiments/framework/experiment_data.py index bfaa650a47..09b1ed6a8d 100644 --- a/qiskit_experiments/framework/experiment_data.py +++ b/qiskit_experiments/framework/experiment_data.py @@ -183,7 +183,8 @@ def _set_child_data(self, child_data: List[ExperimentData]): self.add_child_data(data) def _set_service(self, service: DatabaseService) -> None: - """Set the service to be used for storing experiment data. + """Set the service to be used for storing experiment data, + to this experiment itself and its descendants. Args: service: Service to be used. @@ -197,7 +198,8 @@ def _set_service(self, service: DatabaseService) -> None: @DbExperimentData.share_level.setter def share_level(self, new_level: str) -> None: - """Set the experiment share level. + """Set the experiment share level, + to this experiment itself and its descendants. Args: new_level: New experiment share level. Valid share levels are provider- @@ -227,6 +229,26 @@ def block_for_results(self, timeout: Optional[float] = None) -> ExperimentData: _, timeout = combined_timeout(subdata.block_for_results, timeout) return self + def add_tags_recursive(self, tags2add: List[str]) -> None: + """Add tags to this experiment itself and its descendants + + Args: + tags2add - the tags that will be added to the existing tags + """ + self.tags += tags2add + for data in self._child_data.values(): + data.add_tags_recursive(tags2add) + + def remove_tags_recursive(self, tags2remove: List[str]) -> None: + """Remove tags from this experiment itself and its descendants + + Args: + tags2remove - the tags that will be removed from the existing tags + """ + self.tags = [x for x in self.tags if x not in tags2remove] + for data in self._child_data.values(): + data.remove_tags_recursive(tags2remove) + def __repr__(self): out = ( f"