Source code for toqito.channels.ldot_channel

"""Local diagonal orthogonal twirl channel."""

import itertools

import numpy as np


[docs] def ldot_channel(mat: np.ndarray, efficient: bool = True) -> np.ndarray: r"""Apply the local diagonal orthogonal twirl (LDOT) channel to a matrix. The LDOT channel projects a matrix onto the subspace of local diagonal orthogonal invariant (LDOI) matrices. It is defined as: \[ \Phi_O(A) = \frac{1}{2^n} \sum_{O \in \text{DO}(\mathcal{X})} (O \otimes O) A (O \otimes O) \] where \(\text{DO}(\mathcal{X})\) is the set of \(n \times n\) diagonal matrices with diagonal entries equal to \(\pm 1\). The LDOT channel has the following properties: - It is a quantum channel (completely positive and trace-preserving) - It is self-adjoint: \(\Phi_O^* = \Phi_O\) - It preserves PPT and separability - It is an orthogonal projection onto the LDOI subspace The efficient implementation works directly in the computational basis, zeroing out the entries that average to zero under the twirl. This keeps the complexity polynomial in \(n\) instead of the exponential \(O(2^n)\) for the brute-force approach. Examples: Apply LDOT channel to project an arbitrary matrix onto LDOI subspace: ```python exec="1" source="above" from toqito.channels import ldot_channel import numpy as np # Arbitrary 2-qubit matrix mat = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]]) ldoi_projection = ldot_channel(mat) print(ldoi_projection) ``` The LDOT channel is idempotent (applying it twice gives the same result): ```python exec="1" source="above" from toqito.channels import ldot_channel import numpy as np mat = np.random.rand(4, 4) once = ldot_channel(mat) twice = ldot_channel(once) print(np.allclose(once, twice)) ``` Args: mat: A square matrix of dimension \(n^2 \times n^2\) representing a bipartite operator on \(\mathcal{X} \otimes \mathcal{Y}\) where \(\mathcal{X} = \mathcal{Y} = \mathbb{C}^n\). efficient: If True, use the efficient O(n²) standard basis implementation. If False, use the brute-force O(2ⁿ) implementation (useful for verification). Returns: The LDOI projection of the input matrix. """ if mat.ndim != 2 or mat.shape[0] != mat.shape[1]: raise ValueError("Input matrix must be square.") if efficient: return _ldot_channel_standard_basis(mat) return _ldot_channel_brute_force(mat)
def _ldot_channel_standard_basis(mat: np.ndarray) -> np.ndarray: """Efficient implementation by zeroing forbidden entries in the computational basis.""" dim_sq = mat.shape[0] dim = int(np.sqrt(dim_sq)) if dim * dim != dim_sq: raise ValueError("Input dimension must be a perfect square.") result = np.zeros_like(mat, dtype=np.complex128) for i in range(dim): for j in range(dim): row = i * dim + j for k in range(dim): for target in range(dim): col = k * dim + target if (i == j and k == target) or (i == k and j == target) or (i == target and j == k): result[row, col] = mat[row, col] return result def _ldot_channel_brute_force(mat: np.ndarray) -> np.ndarray: r"""Brute-force O(2ⁿ) implementation by averaging over all diagonal ±1 matrices. This implementation is provided for verification purposes and to match the mathematical definition exactly. For practical use, the efficient implementation should be preferred. Args: mat: A square matrix of dimension \\(n^2 \times n^2\\) representing a bipartite operator on \\(\\mathcal{X} \\otimes \\mathcal{Y}\\) where \\(\\mathcal{X} = \\mathcal{Y} = \\mathbb{C}^n\\). efficient: If True, use the efficient O(n²) standard basis implementation. If False, use the brute-force O(2ⁿ) implementation (useful for verification). Returns: The LDOI projection of the input matrix. """ dim = int(np.sqrt(mat.shape[0])) # Generate all possible diagonal ±1 matrices result = np.zeros((dim**2, dim**2), dtype=np.complex128) for diag_entries in itertools.product([-1, 1], repeat=dim): diag_mat = np.diag(diag_entries) conjugation = np.kron(diag_mat, diag_mat) result += conjugation @ mat @ conjugation return result / (2**dim)