Source code for povm_toolbox.library.metadata.povm_metadata
# (C) Copyright IBM 2024.
#
# This code is licensed under the Apache License, Version 2.0. You may
# obtain a copy of this license in the LICENSE.txt file in the root directory
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
#
# Any modifications or derivative works of this code must retain this
# copyright notice, and modified files need to carry a notice indicating
# that they have been altered from the originals.
"""POVMMetadata."""
from __future__ import annotations
import dataclasses
from dataclasses import dataclass
import numpy as np
from qiskit.circuit import QuantumCircuit
from ..povm_implementation import POVMImplementation
[docs]
@dataclass
class POVMMetadata:
"""The bare metadata container for POVM sampling results."""
povm_implementation: POVMImplementation
"""The POVM implementation which produced the results to which this metadata belongs."""
composed_circuit: QuantumCircuit
"""The quantum circuit which produced the results to which this metadata belongs.
This circuit is the composition of the quantum circuit specified by a PUB and the
measurement circuit generated by the POVM implementation used. This is the quantum
circuit that is eventually sent to the internal :class:`.BaseSamplerV2`.
"""
def __repr__(self) -> str:
"""Implement the default ``__repr__`` method to avoid printing large objects.
E.g., the attribute ``composed_circuit`` is a quantum circuit. With the default
``dataclass.__repr__``, it would be entirely drawn. As this is recursive,
the full circuit would be printed when printing the :class:`.PrimitiveResult`
object returned by the :meth:`.POVMSampler.run` method. The redefinition
here avoids this.
"""
lst_fields = []
for field in dataclasses.fields(self):
f_name = field.name
f_val = getattr(self, field.name)
if isinstance(f_val, np.ndarray):
f_val = f'np.ndarray<{",".join(map(str, f_val.shape))}>'
elif isinstance(f_val, QuantumCircuit):
f_val = f_val.__repr__()
lst_fields.append((f_name, f_val))
f_repr = ", ".join(f"{name}={value}" for name, value in lst_fields)
return f"{self.__class__.__name__}({f_repr})"