Source code for toqito.channel_metrics.diamond_distance
"""Computes the diamond norm between two quantum channels."""
import numpy as np
[docs]
def diamond_distance(choi_1: np.ndarray, choi_2: np.ndarray) -> float | np.floating:
r"""Return the diamond norm distance between two quantum channels.
This function is a wrapper around
[`completely_bounded_trace_norm`]
[toqito.channel_metrics.completely_bounded_trace_norm.completely_bounded_trace_norm],
in that it returns half of the completely bounded trace norm of the difference of its arguments.
!!! note
This calculation becomes very slow for 4 or more qubits.
Examples:
Consider the depolarizing and identity channels in a 2-dimensional space. The depolarizing channel parameter is
set to 0.2:
```python exec="1" source="above"
import numpy as np
from toqito.channels import depolarizing
from toqito.channel_metrics import diamond_distance
choi_depolarizing = depolarizing(dim=2, param_p=0.2)
choi_identity = np.identity(2**2)
print(diamond_distance(choi_depolarizing, choi_identity))
```
Similarly, we can compute the diamond norm between the dephasing channel (with parameter 0.3) and the identity
channel:
```python exec="1" source="above"
import numpy as np
from toqito.channels import dephasing
from toqito.channel_metrics import diamond_distance
choi_dephasing = dephasing(dim=2)
choi_identity = np.identity(2**2)
print(diamond_distance(choi_dephasing, choi_identity))
```
Raises:
ValueError: If matrices are not of equal dimension.
ValueError: If matrices are not square.
Args:
choi_1: A 4**N by 4**N matrix (where N is the number of qubits).
choi_2: A 4**N by 4**N matrix (where N is the number of qubits).
"""
from toqito.channel_metrics import completely_bounded_trace_norm # noqa
return completely_bounded_trace_norm(choi_1 - choi_2)