paddle\_quantum.qinfo
============================

量子信息中的常用功能实现。

.. py:function:: partial_trace(state, dim1, dim2, A_or_B)

   计算量子态的偏迹。

   :param state: 输入的量子态。
   :type state: Union[np.ndarray, paddle.Tensor, State]
   :param dim1: 系统A的维数。
   :type dim1: int
   :param dim2: 系统B的维数。
   :type dim2: int
   :param A_or_B: 1或者2，1表示计算系统A上的偏迹，2表示计算系统B上的偏迹。
   :type A_or_B: int

   :return: 输入的量子态的偏迹。
   :rtype: Union[np.ndarray, paddle.Tensor, State]

.. py:function:: partial_trace_discontiguous(state, preserve_qubits=None)

   计算量子态的偏迹，可选取任意子系统。

   :param state: 输入的量子态。
   :type state: Union[np.ndarray, paddle.Tensor, State]
   :param preserve_qubits: 要保留的量子比特，默认为 None，表示全保留。
   :type preserve_qubits: list, optional
   
   :return: 所选子系统的量子态偏迹。
   :rtype: Union[np.ndarray, paddle.Tensor, State]

.. py:function:: trace_distance(rho, sigma)

   计算两个量子态的迹距离。

   .. math::

      D(\rho, \sigma) = 1 / 2 * \text{tr}|\rho-\sigma|

   :param rho: 量子态的密度矩阵形式。
   :type rho: Union[np.ndarray, paddle.Tensor, State]
   :param sigma: 量子态的密度矩阵形式。
   :type sigma: Union[np.ndarray, paddle.Tensor, State]

   :return: 输入的量子态之间的迹距离。
   :rtype: Union[np.ndarray, paddle.Tensor]

.. py:function:: state_fidelity(rho, sigma)

   计算两个量子态的保真度。

   .. math::

      F(\rho, \sigma) = \text{tr}(\sqrt{\sqrt{\rho}\sigma\sqrt{\rho}})

   :param rho: 量子态的密度矩阵形式。
   :type rho: Union[np.ndarray, paddle.Tensor, State]
   :param sigma: 量子态的密度矩阵形式。
   :type sigma: Union[np.ndarray, paddle.Tensor, State]
   :return: 输入的量子态之间的保真度。
   :rtype: Union[np.ndarray, paddle.Tensor]

.. py:function:: gate_fidelity(U, V)

   计算两个量子门的保真度。

   .. math::

      F(U, V) = |\text{tr}(UV^\dagger)|/2^n

   :math:`U` 是一个 :math:`2^n\times 2^n` 的 Unitary 矩阵。

   :param U: 量子门 :math:`U` 的酉矩阵形式。
   :type U: Union[np.ndarray, paddle.Tensor]
   :param V: 量子门 :math:`V` 的酉矩阵形式。
   :type V: Union[np.ndarray, paddle.Tensor]

   :return: 输入的量子门之间的保真度。
   :rtype: Union[np.ndarray, paddle.Tensor]

.. py:function:: purity(rho)

   计算量子态的纯度。

   .. math::

      P = \text{tr}(\rho^2)

   :param rho: 量子态的密度矩阵形式。
   :type rho: Union[np.ndarray, paddle.Tensor, State]

   :return: 输入的量子态的纯度。
   :rtype: Union[np.ndarray, paddle.Tensor]

.. py:function:: von_neumann_entropy(rho, base)

    计算量子态的冯诺依曼熵。

   .. math::

      S = -\text{tr}(\rho \log(\rho))

   :param rho: 量子态的密度矩阵形式。
   :type rho: Union[np.ndarray, paddle.Tensor, State]
   :param base: 对数的底。默认为2。
   :type base: int, optional

   :return: 输入的量子态的冯诺依曼熵。
   :rtype: Union[np.ndarray, paddle.Tensor]

.. py:function:: relative_entropy(rho, sig, base)

   计算两个量子态的相对熵。

   .. math::

      S(\rho \| \sigma)=\text{tr} \rho(\log \rho-\log \sigma)

   :param rho: 量子态的密度矩阵形式。
   :type rho: Union[np.ndarray, paddle.Tensor, State]
   :param sig: 量子态的密度矩阵形式。
   :type sig: Union[np.ndarray, paddle.Tensor, State]
   :param base: 对数的底，默认为2。
   :type base: int, optional
   
   :return: 输入的量子态之间的相对熵。
   :rtype: Union[np.ndarray, paddle.Tensor]

.. py:function:: random_pauli_str_generator(n, terms=3)

   随机生成一个可观测量（observable）的列表（ ``list`` ）形式。

   一个可观测量 :math:`O=0.3X\otimes I\otimes I+0.5Y\otimes I\otimes Z` 的
   列表形式为 ``[[0.3, 'x0'], [0.5, 'y0,z2']]`` 。这样一个可观测量是由
   调用 ``random_pauli_str_generator(3, terms=2)`` 生成的。

   :param n: 量子比特数量。
   :type n: int
   :param terms: 可观测量的项数, 默认为 3。
   :type terms: int, optional

   :return: 随机生成的可观测量的列表形式。
   :rtype: List

.. py:function:: pauli_str_to_matrix(pauli_str, n)

   将输入的可观测量（observable）的列表（ ``list`` ）形式转换为其矩阵形式。

   如输入的 ``pauli_str`` 为 ``[[0.7, 'z0,x1'], [0.2, 'z1']]`` 且 ``n=3`` ,
   则此函数返回可观测量 :math:`0.7Z\otimes X\otimes I+0.2I\otimes Z\otimes I` 的
   矩阵形式。

   :param pauli_str: 一个可观测量的列表形式。
   :type pauli_str: list
   :param n: 量子比特数量。
   :type n: int

   :raises ValueError: 只有泡利算子 "I" 可以被接受，而不指定其位置。

   :return: 输入列表对应的可观测量的矩阵形式。
   :rtype: paddle.Tensor

.. py:function:: partial_transpose_2(density_op, sub_system=None)

   计算输入量子态的 partial transpose :math:`\rho^{T_A}`。

   :param density_op: 量子态的密度矩阵形式。
   :type density_op: Union[np.ndarray, paddle.Tensor, State]
   :param sub_system: 1或2，表示关于哪个子系统进行 partial transpose，默认为第二个。
   :type sub_system: int, optional

   :return: 输入的量子态的 partial transpose
   :rtype: Union[np.ndarray, paddle.Tensor]

.. py:function:: partial_transpose(density_op, n)

   计算输入量子态的 partial transpose :math:`\rho^{T_A}`。

   :param density_op: 量子态的密度矩阵形式。
   :type density_op: Union[np.ndarray, paddle.Tensor, State]
   :param n: 需要转置系统的量子比特数量。
   :type n: int
   
   :return: 输入的量子态的 partial transpose。
   :rtype: Union[np.ndarray, paddle.Tensor]

.. py:function:: partial_transpose(mat, perm_list, dim_list)

   根据输入顺序组合量子系统。

   :param mat: 输入矩阵，通常为量子态。
   :type mat: Union[np.ndarray, paddle.Tensor, State]
   :param perm: 排列顺序，例如输入 ``[0,2,1,3]`` 将会交换第 2、3 个子系统的顺序。
   :type perm: List[int]
   :param dim: 每个子系统维度列表。
   :type dim: List[int]

   :return: 排序后的矩阵。
   :rtype: Union[np.ndarray, paddle.Tensor, State]

.. py:function:: negativity(density_op)

   计算输入量子态的 Negativity :math:`N = ||\frac{\rho^{T_A}-1}{2}||`。

   :param density_op: 量子态的密度矩阵形式。
   :type density_op: Union[np.ndarray, paddle.Tensor, State]

   :return: 输入的量子态的 Negativity。
   :rtype: Union[np.ndarray, paddle.Tensor]

.. py:function:: logarithmic_negativity(density_op)

   计算输入量子态的 Logarithmic Negativity :math:`E_N = ||\rho^{T_A}||`。

   :param density_op: 量子态的密度矩阵形式。
   :type density_op: Union[np.ndarray, paddle.Tensor, State]

   :return: 输入的量子态的 Logarithmic Negativity。
   :rtype: Union[np.ndarray, paddle.Tensor]

.. py:function:: is_ppt(density_op)

   计算输入量子态是否满足 PPT 条件。

   :param density_op: 量子态的密度矩阵形式。
   :type density_op: Union[np.ndarray, paddle.Tensor, State]
   
   :return: 输入的量子态是否满足 PPT 条件。
   :rtype: bool

.. py:function:: is_choi(op)

   判断输入算子是否为某个量子操作的 Choi 算子。

   :param op: 线性算子的矩阵形式。
   :type op: Union[np.ndarray, paddle.Tensor]
   
   :return: 输入算子是否为某个量子操作的 Choi 算子。
   :rtype: bool

   .. note::
      输入算子默认作用在第二个系统上。

.. py:function:: schmidt_decompose(psi, sys_A=None)

   计算输入量子态的施密特分解 :math:`\lvert\psi\rangle=\sum_ic_i\lvert i_A\rangle\otimes\lvert i_B \rangle`。

   :param psi: 量子态的向量形式，形状为（2**n）。
   :type psi: Union[np.ndarray, paddle.Tensor, State]
   :param sys_A: 包含在子系统 A 中的 qubit 下标（其余 qubit 包含在子系统B中），默认为量子态 :math:`\lvert \psi\rangle` 的前半数 qubit。
   :type sys_A: List[int], optional

   :return:
      包含如下元素：

      - 由施密特系数组成的一维数组，形状为 ``(k)``。
      - 由子系统A的基 :math:`\lvert i_A\rangle` 组成的高维数组，形状为 ``(k, 2**m, 1)``。
      - 由子系统B的基 :math:`\lvert i_B\rangle` 组成的高维数组，形状为 ``(k, 2**l, 1)``。
   :rtype: Union[Tuple[paddle.Tensor, paddle.Tensor, paddle.Tensor], Tuple[np.ndarray, np.ndarray, np.ndarray]]

.. py:function:: image_to_density_matrix(image_filepath)

   将图片编码为密度矩阵。

   :param image_filepath: 图片文件的路径。
   :type image_filepath: str

   :return: 编码得到的密度矩阵。
   :rtype: paddle_quantum.State

.. py:function:: shadow_trace(state, hamiltonian, sample_shots, method='CS')

   估计可观测量 :math:`H` 的期望值 :math:`\text{trace}(H\rho)`。

   :param state: 输入的量子态。
   :type state: paddle_quantum.State
   :param hamiltonian: 可观测量。
   :type hamiltonian: paddle_quantum.Hamiltonian
   :param sample_shots: 采样次数。
   :type sample_shots: int
   :param method: 使用 shadow 来进行估计的方法，可选 "CS"、"LBCS"、"APS" 三种方法，默认为 ``CS``。
   :type method: str, optional

   :raises ValueError: 输入的哈密顿量 (Hamiltonian) 形式不合法。

   :return: 估计可观测量 :math:`H` 的期望值。
   :rtype: float

.. py:function:: tensor_state(state_a, state_b, *args)

   计算输入的量子态(至少两个)的直积形式, 输出将自动返回 State 实例。

   :param state_a: 量子态 A。
   :type state_a: State
   :param state_b: 量子态 B。
   :type state_b: State
   :param args: 其他量子态。
   :type args: State

   .. note::

      需要注意输入态使用的 backend；
      若输入数据为 ``paddle.Tensor`` 或者 ``numpy.ndarray``，请使用 ``paddle_quantum.linalg.NKron`` 函数处理。

   :return: 输入量子态的直积。
   :rtype: State

.. py:function:: diamond_norm(channel_repr, dim_io, **kwargs)

   计算输入的菱形范数

   :param channel_repr: 信道对应的表示, ``ChoiRepr`` 或 ``KrausRepr`` 或 ``StinespringRepr`` 或 ``paddle.Tensor``。
   :type channel_repr: Union[ChoiRepr, KrausRepr, StinespringRepr, paddle.Tensor]
   :param dim_io: 输入和输出的维度。
   :type dim_io: Union[int, Tuple[int, int]], optional.
   :param kwargs: 使用cvx所需的参数。
   :type kwargs: Any

   :raises RuntimeError: ``channel_repr`` 必须是 ``ChoiRepr`` 或 ``KrausRepr`` 或 ``StinespringRepr`` 或 ``paddle.Tensor``。
   :raises TypeError: "dim_io" 必须是 "int" 或者 "tuple"。

   :warning: 输入的 ``channel_repr`` 不是choi表示，已被转换成 ``ChoiRepr``。

   :return: 返回菱形范数
   :rtype: float


.. py:function:: channel_repr_convert(representation, source, target, tol)

   将给定的信道转换成目标形式。

   :param representation: 输入信道的一种表示。
   :type representation: Union[paddle.Tensor, np.ndarray, List[paddle.Tensor], List[np.ndarray]]
   :param source: 输入信道的表示名称，应为 ``Choi``, ``Kraus`` 或 ``Stinespring``。
   :type source: str
   :param target: 可选 ``Choi``, ``Kraus`` 或 ``Stinespring``。
   :type target: str
   :param tol: 容错误差。
   :type tol: float, optional

   :raises ValueError: 不支持的信道表示形式，应为 ``Choi``，``Kraus`` 或 ``Stinespring``。

   .. note::

      Choi 变为 Kraus 目前因为 eigh 的精度会存在1e-6的误差。

   :raises NotImplementedError: 不支持输入数据类型的信道转换。

   :return: 返回目标形式的信道。
   :rtype: Union[paddle.Tensor, np.ndarray, List[paddle.Tensor], List[np.ndarray]]

.. py:function:: random_channel(num_qubits, rank, target)

   从 Stinespring 表示中随机生成一个量子信道。

   :param num_qubits: 量子比特数 :math:`n`。
   :type num_qubits: int
   :param rank: 信道的秩，默认从 :math:`[0, 2^n]` 中随机选择。
   :type rank: str
   :param target: 信道的表示，可选 ``Choi``，``Kraus`` 或 ``Stinespring``。
   :type target: str

   :return: 返回目标表示下的随机信道。
   :rtype: Union[paddle.Tensor, List[paddle.Tensor]]

.. py:function:: kraus_unitary_random(num_qubits, num_oper)

   随机输出一组描述量子信道的 Kraus 算符。

   :param num_qubits: 信道对应的量子比特数量。
   :type num_qubits: int
   :param num_oper: Kraus算符的数量。
   :type num_oper: int

   :return: 一组 Kraus 算符。
   :rtype: list

.. py:function:: grover_generation(oracle)

   Grover 算子生成函数。

   :param oracle: 给定酉算子。
   :type oracle: Union[np.ndarray, paddle.Tensor]

   :return: 根据 ``oracle`` 搭建的 Grover 算子。
   :rtype: Union[np.ndarray, paddle.Tensor]

.. py:function:: qft_generation(num_qubits)

   量子傅里叶变换算子生成函数。其矩阵形式为

   .. math::

      \begin{align}
         QFT = \frac{1}{\sqrt{N}}
         \begin{bmatrix}
               1 & 1 & .. & 1 \\
               1 & \omega_N & .. & \omega_N^{N-1} \\
               .. & .. & .. & .. \\
               1 & \omega_N^{N-1} & .. & \omega_N^{(N-1)^2}
         \end{bmatrix}
      \end{align}

   :param num_qubits: 算子作用的系统比特数。
   :type num_qubits: int

   :return: 量子傅里叶变换算子。
   :rtype: paddle.Tensor

