Source code for qDNA.dynamics.dm_analysis

"""This module provides utility functions for analyzing density matrices.

The functions include calculations for trace distance, purity, coherence, and inverse
participation ratio (IPR).
"""

import numpy as np

__all__ = ["calc_trace_distance", "calc_purity", "calc_coherence", "calc_ipr_dm"]

# ----------------------------------------------------------------------


[docs] def calc_trace_distance(dm_1, dm_2): """Calculate the trace distance between two density matrices. The trace distance is a measure of the distinguishability between two quantum states represented by their density matrices. It is defined as half the trace of the absolute difference between the two density matrices. Parameters ---------- dm_1 : numpy.ndarray The first density matrix. dm_2 : numpy.ndarray The second density matrix. Returns ------- float The trace distance between the two density matrices. Raises ------ ValueError If the density matrices do not have the same shape. """ # Check if the density matrices have the same shape if dm_1.shape != dm_2.shape: raise ValueError("Density matrices must have the same shape.") # Calculate the trace distance eigenvals = np.linalg.eig(dm_1 - dm_2)[0] diag = np.diag(np.absolute(eigenvals)) return 0.5 * np.trace(diag)
[docs] def calc_purity(dm): """Calculates the purity of a density matrix. Parameters ---------- dm : np.ndarray Density matrix. Returns ------- float The purity of the density matrix. """ return np.real(np.trace(np.matmul(dm, dm)))
[docs] def calc_coherence(dm): """Calculates the coherence (absolute sum of the off-diagonals) of a density matrix. Parameters ---------- dm : np.ndarray Density matrix. Returns ------- float The coherence of the density matrix. """ coherence = sum(abs(element) for element in dm.flatten()) - np.sum(np.diag(dm)) return coherence.real
[docs] def calc_ipr_dm(dm): r"""Calculate the inverse participation ratio (IPR) of a density matrix. Parameters ---------- dm : np.ndarray The density matrix for which the IPR is calculated. Should be a square, complex-valued matrix. Returns ------- float The inverse participation ratio of the density matrix, providing an indication of state localization. Notes ----- .. note:: The IPR provides a measure of the localization of a quantum state .. math:: \mathrm{IPR} = \frac{\left( \sum_{i,j} |\rho_{i,j}| \right)^2}{N \sum_{i,j} |\rho_{i,j}|^2} - Localized state: :math:`IPR = 1/N`, where `N` is the dimension of the density matrix. - Delocalized (coherent) state: :math:`IPR = N`, indicating full coherence. - Maximally mixed state: :math:`IPR = 1`, representing maximal mixing. """ dims = dm.shape[0] numerator = sum(abs(element) for element in dm.flatten()) denominator = sum(abs(element) ** 2 for element in dm.flatten()) return numerator**2 / (dims * denominator)
# ----------------------------------------------------------------------