paddle\_quantum.dataset
==============================

数据集的功能实现。

.. py:class:: Dataset()

      基类: :py:class:`object`

      所有数据集的基类，集成了多种量子编码方法。

   .. py:method:: data2circuit(classical_data, encoding, num_qubits, can_describe_dimension, split_circuit,return_state: bool, is_image=False)

      将输入的经典数据 ``classical_data`` 用编码方式 ``encoding`` 编码成量子态，这里的经典数据经过了截断或者补零，因而可以正好被编码。

      :param classical_data: 待编码的向量，经过了截断或者补零，刚好可以被编码。
      :type classical_data: list
      :param encoding: 编码方式，参见 MNIST 编码注释。
      :type encoding: str
      :param num_qubits: 量子比特数目。
      :type num_qubits: int
      :param can_describe_dimension:  ``encoding`` 编码方式可以编码的数目。
      :type can_describe_dimension: int
      :param split_circuit: 是否切分电路。
      :type split_circuit: bool
      :param return_state: 是否返回量子态。
      :type return_state: bool
      :param is_image: 是否是图片，如果是图片，归一化方法不同。
      :type is_image: bool, optional

      :raises Exception: 暂不支持返回 amplitude encoding 的电路。

      :return: 如果 ``return_state == True`` ，返回编码后的量子态，否则返回编码的电路。
      :rtype: list
   
   .. py:method:: filter_class(x, y, classes, data_num, need_relabel, seed=0)

      将输入的 ``x`` , ``y`` 按照 ``classes`` 给出的类别进行筛选，数目为 ``data_num``。

      :param x: 样本的特征。
      :type x: Union[list, np.ndarray]
      :param y: 样本标签。
      :type y: Union[list, np.ndarray]
      :param classes: 需要筛选的类别。
      :type classes: list
      :param data_num: 筛选出来的样本数目。
      :type data_num: int
      :param need_relabel: 将原有类别按照顺序重新标记为 0、1、2 等新的名字，比如传入 ``[1,2]`` ， 重新标记之后变为 ``[0,1]`` 主要用于二分类。
      :type need_relabel: bool
      :param seed: 随机种子，默认为 ``0``。
      :type seed: int, optional

      :return: 
         包含如下元素:

         - new_x: 筛选出的特征
         - new_y: 对应于 new_x 的标签
      :rtype: Tuple[list]


.. py:class:: VisionDataset(figure_size)
      
   基类: :py:class:`paddle_quantum.dataset.Dataset`

   图片数据集类，通过继承 VisionDataset 类，用户可以快速生成自己的图片量子数据。

   :param figure_size: 图片大小，也就是长和高的数值。
   :type figure_size: int

   .. py:method:: encode(feature, encoding, num_qubits, split_circuit, downscaling_method='resize', target_dimension=-1, return_state=True, full_return=False)

      将 ``feature`` 编码到 ``num_qubits`` 量子比特中，再降维到 ``target_dimension`` 后使用 ``encoding``。 ``feature`` 是一维的图像向量。

      :param feature: 一维图片向量组成的list/ndarray。
      :type feature: Union[list, np.ndarray]
      :param encoding: ``angle_encoding`` 表示角度编码，一个量子比特编码一个旋转门； ``amplitude_encoding`` 表示振幅编码； ``pauli_rotation_encoding`` 表示SU(3)的角度编码; 还有 ``linear_entangled_encoding`` , ``real_entangled_encoding`` , ``complex_entangled_encoding`` 和 ``IQP_encoding`` 编码。
      :type encoding: str
      :param num_qubits: 编码后的量子比特数目。
      :type num_qubits: int
      :param split_circuit: 是否需要切分电路。除了振幅之外的所有电路都会存在堆叠的情况，如果选择 ``True`` 就将块与块分开，默认为 ``False``。
      :type split_circuit: bool, optional
      :param downscaling_method: 包括 ``PCA`` 和 ``resize``, 默认为 ``resize``。
      :type downscaling_method: str, optional
      :param target_dimension: 降维之后的尺度大小，如果是 ``PCA`` ，不能超过图片大小；如果是 ``resize`` ，不能超过原图大小，默认为 ``-1``。
      :type target_dimension: int, optional
      :param return_state: 是否返回量子态，如果是 ``False`` 返回量子电路，默认为 ``True``。
      :type return_state: bool, optional
      :param full_return: 是否返回原始图像, 经典图像矢量, 量子态和量子电路, 默认为 ``False``。
      :type full_return: bool, optional

      :raises Exception: PCA维度应小于图片大小。
      :raises Exception: 调整大小的尺寸应该是一个平方数。
      :raises Exception: 缩小尺寸的方法只能是 resize 和 PCA。
      :raises Exception: 无效的编码方法。

      :return: 
         包含如下元素:

         - quantum_image_states: 量子态，只有 ``full_return==True`` 或者 ``return_state==True`` 的时候会返回。
         - quantum_image_circuits: 所有特征编码的电路，只有 ``full_return==False`` 或者 ``return_state==True`` 的时候会返回。
         - 图片经过类别过滤，但是还没有降维、补零的特征，是一个一维向量（可以 reshape 成图片），只有 ``return_state==True`` 的时候会返回。
         - 经过类别过滤和降维、补零等操作之后的特征，并未编码为量子态，只有 ``return_state==True`` 的时候会返回。
      :rtype: Tuple[paddle.Tensor, list, np.ndarray, np.ndarray]

.. py:class:: MNIST(mode, encoding, num_qubits, classes, data_num=-1, split_circuit=False, downscaling_method='resize', target_dimension=-1, need_cropping=True, need_relabel=True, return_state=True, seed=0)
      
   基类: :py:class:`paddle_quantum.dataset.VisionDataset`

   MNIST 数据集，它继承了 VisionDataset 图片数据集类。

   :param mode: 数据模式，包括 ``train`` 和 ``test``。
   :type mode: str
   :param encoding: ``angle_encoding`` 表示角度编码，一个量子比特编码一个旋转门； ``amplitude_encoding`` 表示振幅编码； ``pauli_rotation_encoding`` 表示SU(3)的角度编码; 还有 ``linear_entangled_encoding`` , ``real_entangled_encoding`` , ``complex_entangled_encoding`` 和 ``IQP_encoding`` 编码。
   :type encoding: str
   :param num_qubits: 编码后的量子比特数目。
   :type num_qubits: int
   :param classes: 用列表给出需要的类别，类别用数字标签表示。
   :type classes: list
   :param data_num: 使用的数据量大小, 默认为 ``-1``。
   :type data_num: int, optional
   :param split_circuit: 是否需要切分电路。除了振幅之外的所有电路都会存在堆叠的情况，如果选择 ``True`` 就将块与块分开。
   :type split_circuit: bool, optional
   :param downscaling_method: 包括 ``PCA`` 和 ``resize``。默认为 ``resize``。
   :type downscaling_method: str, optional
   :param target_dimension: 降维之后的尺度大小，如果是 ``PCA`` ，不能超过图片大小；如果是 ``resize`` ，不能超过原图大小。
   :type target_dimension: int, optional
   :param need_cropping: 是否需要裁边，如果为 ``True`` ，则从 ``image[0:27][0:27]`` 裁剪为 ``image[4:24][4:24]``。
   :type need_cropping: bool, optional
   :param need_relabel: 将原有类别按照顺序重新标记为 0, 1, 2 等新的名字，比如传入 ``[1,2]`` ，重新标记之后变为 ``[0,1]`` ，主要用于二分类。
   :type need_relabel: bool, optional
   :param return_state: 是否返回量子态，如果是 ``False`` 返回量子电路。
   :type return_state: bool, optional
   :param seed: 筛选样本的随机种子，默认为 ``0``。
   :type seed: int, optional

   :raises Exception: 数据模式只能为训练和测试。

.. py:class:: FashionMNIST(mode, encoding, num_qubits, classes, data_num=-1, split_circuit=False, downscaling_method, target_dimension=-1, need_relabel=True, return_state=True, seed=0)

   基类: :py:class:`paddle_quantum.dataset.VisionDataset`

   FashionMNIST 数据集，它继承了 ``VisionDataset`` 图片数据集类。

   :param mode: 数据模式，包括 ``train`` 和 ``test``。
   :type mode: str
   :param encoding: ``angle_encoding`` 表示角度编码，一个量子比特编码一个旋转门； ``amplitude_encoding`` 表示振幅编码； ``pauli_rotation_encoding`` 表示SU(3)的角度编码; 还有 ``linear_entangled_encoding`` , ``real_entangled_encoding`` , ``complex_entangled_encoding`` 和 ``IQP_encoding`` 编码。
   :type encoding: str
   :param num_qubits: 编码后的量子比特数目。
   :type num_qubits: int
   :param classes: 用列表给出需要的类别，类别用数字标签表示。
   :type classes: list
   :param data_num: 使用的数据量大小，默认为 ``-1``。
   :type data_num: int, optional
   :param split_circuit: 是否需要切分电路。除了振幅之外的所有电路都会存在堆叠的情况，如果选择 ``True`` 就将块与块分开， 默认为 ``False``。
   :type split_circuit: bool, optional
   :param downscaling_method: 包括 ``PCA`` 和 ``resize``，默认为 ``resize``。
   :type downscaling_method: str, optional
   :param target_dimension: 降维之后的尺度大小，如果是 ``PCA`` ，不能超过图片大小；如果是 ``resize`` ，不能超过原图大小， 默认为 ``-1``。
   :type target_dimension: int, optional
   :param need_relabel: 将原有类别按照顺序重新标记为 0, 1, 2 等新的名字，比如传入 ``[1,2]`` ，重新标记之后变为 ``[0,1]`` ，主要用于二分类， 默认为 ``True``。
   :type need_relabel: bool, optional
   :param return_state: 是否返回量子态，如果是 ``False`` 返回量子电路， 默认为 ``True``。
   :type return_state: bool, optional
   :param seed: 筛选样本的随机种子，默认为 ``0``。
   :type seed: int, optional

   :raises Exception: 数据模式只能为训练和测试。

.. py:class:: SimpleDataset(dimension)
      
   基类: :py:class:`paddle_quantum.dataset.Dataset`

   用于不需要降维的简单分类数据。用户可以通过继承 ``SimpleDataset`` ，将自己的分类数据变为量子态。下面的几个属性也会被继承。

   :param dimension: 编码数据的维度。
   :type dimension: int

   .. py:method:: encode(feature, encoding, num_qubits, return_state=True, full_return=False)

      用 ``num_qubits`` 的量子比特对 ``feature`` 进行编码 ``encoding``。

      :param feature: 编码的特征，每一个分量都是一个 ndarray 的特征向量。
      :type feature: Union[list, np.ndarray]
      :param encoding: 编码方法。
      :type encoding: str
      :param num_qubits: 编码的量子比特数目。
      :type num_qubits: int
      :param return_state: 是否返回量子态，默认为 ``True``。
      :type return_state: bool, optional
      :param full_return: 是否返回原始图像, 经典图像矢量, 量子态和量子电路, 默认为 ``False``。
      :type full_return: bool, optional
         
      :raises Exception: 无效特征类型。
      :raises Exception: 无效编码方式。
      :raises Exception: 量子比特数不足。

      :return: 
         包含如下元素:

         - quantum_states: 量子态，只有 ``full_return==True`` 或者 ``return_state==True`` 的时候会返回。
         - quantum_circuits: 所有特征编码的电路，只有 ``full_return==False`` 或者 ``return_state==True`` 的时候会返回。
         - origin_feature: 经过类别过滤之后的所有特征，并未编码为量子态，只有 ``return_state==True`` 的时候会返回。
         - feature: ``origin_feature`` 经过了补零之后的特征， ``quantum_states`` 就是将 ``feature`` 编码之后的结果。 只有 ``return_state==True`` 的时候会返回。
      :rtype: Tuple[np.ndarray, list, np.ndarray, np.ndarray]

.. py:class:: Iris(encoding: str, num_qubits: int, classes: list, test_rate: float=0.2, need_relabel=True, return_state=True, seed=0)
      
   基类: :py:class:`paddle_quantum.dataset.SimpleDataset`
 
   Iris 数据集。

   :param encoding: ``angle_encoding`` 表示角度编码，一个量子比特编码一个旋转门； ``amplitude_encoding`` 表示振幅编码； ``pauli_rotation_encoding`` 表示SU(3)的角度编码; 还有 ``linear_entangled_encoding`` , ``real_entangled_encoding`` , ``complex_entangled_encoding`` 和 ``IQP_encoding`` 编码。
   :type encoding: str
   :param num_qubits: 量子比特数目。
   :type num_qubits: int
   :param classes: 用列表给出需要的类别，类别用数字标签表示。
   :type classes: list
   :param test_rate: 测试集的占比, 默认为 ``0.2``。
   :type test_rate: float, optional
   :param need_relabel: 将原有类别按照顺序重标记为 0、1、2 等新的名字，比如传入 [1,2] ，重标记之后变为 [0,1] ，主要用于二分类。默认为 ``True``。
   :type need_relabel: bool, optional
   :param return_state: 是否返回量子态，默认为 ``True``。
   :type return_state: bool, optional
   :param seed: 筛选样本的随机种子，默认为 ``0``。
   :type seed: int, optional

.. py:class:: BreastCancer(encoding, num_qubits, test_rate=0.2, return_state=True, seed=0)

   基类: :py:class:`paddle_quantum.dataset.SimpleDataset`

   BreastCancer 数据集。

   :param encoding: ``angle_encoding`` 表示角度编码，一个量子比特编码一个旋转门； ``amplitude_encoding`` 表示振幅编码； ``pauli_rotation_encoding`` 表示SU(3)的角度编码; 还有 ``linear_entangled_encoding`` , ``real_entangled_encoding`` , ``complex_entangled_encoding`` 和 ``IQP_encoding`` 编码。
   :type encoding: _type_
   :param num_qubits: 量子比特数目。
   :type num_qubits: _type_
   :param test_rate: 测试集的占比, 默认为 ``0.2``。
   :type test_rate: float, optional
   :param return_state: 是否返回量子态，默认为 ``True``。
   :type return_state: bool, optional
   :param seed: 筛选样本的随机种子，默认为 ``0``。
   :type seed: int, optional
