ProductPOVM¶
- class ProductPOVM(frames: dict[tuple[int, ...], T])[source]¶
Bases:
ProductFrame
[MultiQubitPOVM
],BasePOVM
Class to represent a set of product POVM operators.
A product POVM
is made of local POVMs acting on respective subsystems. Each global effect can be written as the tensor product of local effects, .Below is an example of how to construct an instance of this class.
>>> from qiskit.quantum_info import Operator >>> from povm_toolbox.quantum_info import SingleQubitPOVM, MultiQubitPOVM, ProductPOVM >>> sqp = SingleQubitPOVM([Operator.from_label("0"), Operator.from_label("1")]) >>> mqp = MultiQubitPOVM( ... [ ... Operator.from_label("00"), ... Operator.from_label("01"), ... Operator.from_label("10"), ... Operator.from_label("11"), ... ] ... ) >>> product = ProductPOVM({(0,): sqp, (1, 3): mqp, (2,): sqp})
Note
For most cases, you may find that
ProductPOVM.from_list()
works just fine and is easier to use.Initialize from a mapping of local frames.
- Parameters:
frames (dict[tuple[int, ...], T]) – a dictionary mapping from a tuple of subsystem indices to a local frame objects.
- Raises:
ValueError – if any key in
frames
is not a tuple consisting of unique integers. In other words, every local frame must act on a distinct set of subsystem indices which do not overlap with each other.ValueError – if any key in
frames
re-uses a previously used subsystem index. In other words, all local frames must act on mutually exclusive subsystem indices.ValueError – if any key in
frames
does not specify the number of subsystem indices, which matches the number of systems acted upon by that local frame (MultiQubitFrame.num_subsystems()
).
Inherited Attributes
- dimension¶
The dimension of the Hilbert space on which the effects act.
- informationally_complete¶
If the frame spans the entire Hilbert space.
- num_operators¶
The number of effects of the frame.
- num_outcomes¶
The number of outcomes of the POVM.
- num_subsystems¶
The number of subsystems which the frame operators act on.
For qubits, this is always
dimension
.
- shape¶
Give the number of operators per sub-system.
- sub_systems¶
Give the number of operators per sub-system.
Methods
- draw_bloch(*, title: str = '', figure: Figure | None = None, axes: Axes | list[Axes] | None = None, figsize: tuple[float, float] | None = None, font_size: float | None = None, colorbar: bool = False) Figure [source]¶
Plot a Bloch sphere for each single-qubit POVM forming the product POVM.
- Parameters:
title (str) – a string that represents the plot title.
figure (Figure | None) – User supplied Matplotlib Figure instance for plotting Bloch sphere.
axes (Axes | list[Axes] | None) – User supplied Matplotlib axes to render the bloch sphere.
figsize (tuple[float, float] | None) – size of each individual Bloch sphere figure, in inches.
font_size (float | None) – Font size for the Bloch ball figures.
colorbar (bool) – If
True
, normalize the vectors on the Bloch sphere and add a colormap to keep track of the norm of the vectors. It can help to visualize the vector if they have a small norm.
- Returns:
The resulting figure.
- Raises:
NotImplementedError – if this product POVM contains a
MultiQubitPOVM
acting on more than a single qubit.- Return type:
Figure
Inherited Methods
- analysis(hermitian_op: SparsePauliOp | Operator, frame_op_idx: tuple[int, ...] | set[tuple[int, ...]] | None = None) float | dict[tuple[int, ...], float] | ndarray ¶
Return the frame coefficients of
hermitian_op
.This method implements the analysis operator
of the frame :where
are called the frame coefficients of the Hermitian operator .- Parameters:
- Returns:
Frame coefficients, specified by
frame_op_idx
, of the Hermitian operatorhermitian_op
. If a specific coefficient was queried, afloat
is returned. If a specific set of coefficients was queried, a dictionary mapping labels to coefficients is returned. If all coefficients were queried, an array with all coefficients is returned.- Raises:
TypeError – when the provided single or sequence of labels
frame_op_idx
does not have a valid type.ValueError – when the dimension of the provided
hermitian_op
does not match the dimension of the frame operators.
- Return type:
- classmethod from_list(frames: Sequence[T]) Self ¶
Construct a
ProductFrame
from a list ofMultiQubitFrame
objects.This is a convenience method to simplify the construction of a
ProductFrame
for the cases in which the local frame objects act on a sequential order of subsystems. In other words, this method converts the sequence of frames to a dictionary of frames in accordance with the input toProductFrame.__init__()
by using the positions along the sequence as subsystem indices.Below are some examples:
>>> from qiskit.quantum_info import Operator >>> from povm_toolbox.quantum_info import SingleQubitPOVM, MultiQubitPOVM, ProductPOVM
>>> sqp = SingleQubitPOVM([Operator.from_label("0"), Operator.from_label("1")]) >>> product = ProductPOVM.from_list([sqp, sqp]) >>> # is equivalent to >>> product = ProductPOVM({(0,): sqp, (1,): sqp})
>>> mqp = MultiQubitPOVM( ... [ ... Operator.from_label("00"), ... Operator.from_label("01"), ... Operator.from_label("10"), ... Operator.from_label("11"), ... ] ... ) >>> product = ProductPOVM.from_list([mqp, mqp]) >>> # is equivalent to >>> product = ProductPOVM({(0, 1): mqp, (2, 3): mqp})
>>> product = ProductPOVM.from_list([sqp, sqp, mqp]) >>> # is equivalent to >>> product = ProductPOVM({(0,): sqp, (1,): sqp, (2, 3): mqp})
>>> product = ProductPOVM.from_list([sqp, mqp, sqp]) >>> # is equivalent to >>> product = ProductPOVM({(0,): sqp, (1, 2): mqp, (3,): sqp})
- Parameters:
frames (Sequence[T]) – a sequence of
MultiQubitFrame
objects.- Returns:
A new
ProductFrame
instance.- Return type:
Self
- get_prob(rho: SparsePauliOp | DensityMatrix | Statevector, outcome_idx: LabelT | set[LabelT] | None = None) float | dict[LabelT, float] | ndarray ¶
Return the outcome probabilities given a state,
.Each outcome
is associated with an effect of the POVM. The probability of obtaining the outcome when measuring a staterho
is given by .Note
In the frame theory formalism, the mapping
is referred to as the analysis operator, which is implemented by theanalysis()
method.- Parameters:
rho (SparsePauliOp | DensityMatrix | Statevector) – the state for which to compute the outcome probabilities.
outcome_idx (LabelT | set[LabelT] | None) – 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 staterho
. If a specific outcome was queried, afloat
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.- Return type: