Source code for povm_toolbox.quantum_info.base.base_povm

# (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.

"""BasePOVM."""

from __future__ import annotations

from abc import ABC

import numpy as np
from qiskit.quantum_info import DensityMatrix, Operator, SparsePauliOp, Statevector

from .base_dual import BaseDual
from .base_frame import BaseFrame, LabelT


[docs] class BasePOVM(BaseFrame[LabelT], ABC): """Abstract base class that contains all methods that any specific POVM should implement.""" default_dual_class: type[BaseDual] """The default :class:`.BaseDual` associated with this POVM.""" @property def num_outcomes(self) -> int: """The number of outcomes of the POVM.""" return self.num_operators
[docs] def get_prob( self, rho: SparsePauliOp | DensityMatrix | Statevector, outcome_idx: LabelT | set[LabelT] | None = None, ) -> float | dict[LabelT, float] | np.ndarray: r"""Return the outcome probabilities given a state, :math:`\rho`. Each outcome :math:`k` is associated with an effect :math:`M_k` of the POVM. The probability of obtaining the outcome :math:`k` when measuring a state ``rho`` is given by :math:`p_k = \text{Tr}\left[M_k \rho\right]`. .. note:: In the frame theory formalism, the mapping :math:`A: \rho \mapsto \{\text{Tr}\left[M_k \rho\right]\}_k` is referred to as the *analysis operator*, which is implemented by the :meth:`.analysis` method. Args: rho: the state for which to compute the outcome probabilities. outcome_idx: label or set of labels indicating which outcome probabilities are queried. If ``None``, all outcome probabilities are queried. Returns: Probabilities of obtaining the outcome(s) specified by ``outcome_idx`` over the state ``rho``. If a specific outcome was queried, a ``float`` is returned. If a specific set of outcomes was queried, a dictionary mapping outcomes to probabilities is returned. If all outcomes were queried, an array with all probabilities is returned. """ if isinstance(rho, (DensityMatrix, Statevector)): rho = Operator(rho) return self.analysis(rho, outcome_idx)