Source code for toqito.perms.permutation_operator
"""Permutation operator is a unitary operator that permutes subsystems."""
import numpy as np
import scipy as sp
from toqito.perms import permute_systems
[docs]
def permutation_operator(
dim: list[int] | int,
perm: list[int],
inv_perm: bool = False,
is_sparse: bool = False,
) -> np.ndarray:
r"""Produce a unitary operator that permutes subsystems.
Generates a unitary operator that permutes the order of subsystems according to the permutation vector `perm`,
where the \(i^{th}\) subsystem has dimension `dim[i]`.
If `inv_perm` = True, it implements the inverse permutation of `perm`. The permutation operator return
is full is `is_sparse` is `False` and sparse if `is_sparse` is `True`.
Examples:
The permutation operator obtained with dimension \(d = 2\) is equivalent to the standard swap operator on two
qubits
\[
P_{2, [1, 0]} =
\begin{pmatrix}
1 & 0 & 0 & 0 \\
0 & 0 & 1 & 0 \\
0 & 1 & 0 & 0 \\
0 & 0 & 0 & 1
\end{pmatrix}
\]
Using `|toqito⟩`, this can be achieved in the following manner.
```python exec="1" source="above"
from toqito.perms import permutation_operator
print(permutation_operator(2, [1, 0]))
```
Args:
dim: The dimensions of the subsystems to be permuted.
perm: A permutation vector.
inv_perm: Boolean dictating if `perm` is inverse or not.
is_sparse: Boolean indicating if return is sparse or not.
Returns:
Permutation operator of dimension `dim`.
"""
# Allow the user to enter a single number for `dim`.
if isinstance(dim, int):
dim_arr = np.array([dim] * np.ones(max(perm) + 1))
elif isinstance(dim, list):
dim_arr = np.array(dim)
else:
dim_arr = dim
mat = sp.sparse.identity(int(np.prod(dim_arr))) if is_sparse else np.identity(int(np.prod(dim_arr)))
# Swap the rows of the identity matrix appropriately.
return permute_systems(mat, perm, dim_arr, True, inv_perm)