Source code for toqito.measurement_props.is_povm
"""Determine if a list of matrices are POVM elements."""
import numpy as np
from toqito.matrix_props import is_positive_semidefinite
[docs]
def is_povm(mat_list: list[np.ndarray]) -> bool:
r"""Determine if a list of matrices constitute a valid set of POVMs [@WikiPOVM].
A valid set of measurements are defined by a set of positive semidefinite operators
\[
\{P_a : a \in \Gamma\} \subset \text{Pos}(\mathcal{X}),
\]
indexed by the alphabet \(\Gamma\) of measurement outcomes satisfying the constraint that
\[
\sum_{a \in \Gamma} P_a = I_{\mathcal{X}}.
\]
Examples:
Consider the following matrices:
\[
M_0 =
\begin{pmatrix}
1 & 0 \\
0 & 0
\end{pmatrix}
\quad \text{and} \quad
M_1 =
\begin{pmatrix}
0 & 0 \\
0 & 1
\end{pmatrix}.
\]
Our function indicates that this set of operators constitute a set of
POVMs.
```python exec="1" source="above"
import numpy as np
from toqito.measurement_props import is_povm
meas_1 = np.array([[1, 0], [0, 0]])
meas_2 = np.array([[0, 0], [0, 1]])
meas = [meas_1, meas_2]
print(is_povm(meas))
```
We may also use the `random_povm` function from `|toqito⟩`, and can verify that a
randomly generated set satisfies the criteria for being a POVM set.
```python exec="1" source="above"
import numpy as np
from toqito.rand import random_povm
from toqito.measurement_props import is_povm
dim, num_inputs, num_outputs = 2, 2, 2
measurements = random_povm(dim, num_inputs, num_outputs)
print(is_povm([measurements[:, :, 0, 0], measurements[:, :, 0, 1]]))
```
Alternatively, the following matrices
\[
M_0 =
\begin{pmatrix}
1 & 2 \\
3 & 4
\end{pmatrix}
\quad \text{and} \quad
M_1 =
\begin{pmatrix}
5 & 6 \\
7 & 8
\end{pmatrix},
\]
do not constitute a POVM set.
```python exec="1" source="above"
import numpy as np
from toqito.measurement_props import is_povm
non_meas_1 = np.array([[1, 2], [3, 4]])
non_meas_2 = np.array([[5, 6], [7, 8]])
non_meas = [non_meas_1, non_meas_2]
print(is_povm(non_meas))
```
Args:
mat_list: A list of matrices.
Returns:
Return `True` if set of matrices constitutes a set of measurements, and `False` otherwise.
"""
dim = mat_list[0].shape[0]
mat_sum = np.zeros((dim, dim), dtype=complex)
for mat in mat_list:
# Each measurement in the set must be positive semidefinite.
if not is_positive_semidefinite(mat):
return False
mat_sum += mat
# Summing all the measurements from the set must be equal to the identity.
if not np.allclose(np.identity(dim), mat_sum):
return False
return True