From 2884515147c574a32210034e4aaa2f360fc38401 Mon Sep 17 00:00:00 2001 From: Quleaf Date: Wed, 18 Jan 2023 17:33:13 +0800 Subject: [PATCH] update the api-doc and some details --- .../introduction_cn.ipynb | 8 +- .../introduction_en.ipynb | 8 +- .../protein_folding/APRLRFY_3d_structure.jpg | Bin 24693 -> 25947 bytes .../protein_folding/introduction_cn.ipynb | 1457 +---------------- .../protein_folding/introduction_en.ipynb | 1457 +---------------- .../paddle_quantum.biocomputing.algorithm.rst | 52 + ...addle_quantum.biocomputing.data_loader.rst | 21 + .../paddle_quantum.biocomputing.operators.rst | 40 + .../paddle_quantum.biocomputing.protein.rst | 75 + .../source/paddle_quantum.biocomputing.rst | 17 +- .../paddle_quantum.biocomputing.visualize.rst | 15 + .../paddle_quantum.data_analysis.vqr.rst | 8 +- .../source/paddle_quantum.finance.pricing.rst | 70 +- docs_zh_CN/source/paddle_quantum.fisher.rst | 6 +- .../source/paddle_quantum.hamiltonian.rst | 18 +- .../source/paddle_quantum.qchem.algorithm.rst | 49 + .../source/paddle_quantum.qchem.ansatz.rst | 62 + .../paddle_quantum.qchem.density_matrix.rst | 22 - .../source/paddle_quantum.qchem.drivers.rst | 79 + .../paddle_quantum.qchem.fermionic_state.rst | 111 ++ ...addle_quantum.qchem.hardware_efficient.rst | 15 - .../source/paddle_quantum.qchem.loss.rst | 36 - .../source/paddle_quantum.qchem.molecule.rst | 53 + .../paddle_quantum.qchem.properties.rst | 53 + .../source/paddle_quantum.qchem.qchem.rst | 113 -- ...addle_quantum.qchem.slater_determinant.rst | 36 - .../source/paddle_quantum.qchem.uccsd.rst | 36 - .../source/paddle_quantum.qchem.utils.rst | 14 + docs_zh_CN/source/paddle_quantum.qinfo.rst | 1 - .../source/paddle_quantum.qpp.utils.rst | 8 +- paddle_quantum/biocomputing/algorithm.py | 39 +- paddle_quantum/model.py | 14 +- paddle_quantum/qml/qnnmic.py | 17 +- 33 files changed, 747 insertions(+), 3263 deletions(-) create mode 100644 docs_zh_CN/source/paddle_quantum.biocomputing.algorithm.rst create mode 100644 docs_zh_CN/source/paddle_quantum.biocomputing.data_loader.rst create mode 100644 docs_zh_CN/source/paddle_quantum.biocomputing.operators.rst create mode 100644 docs_zh_CN/source/paddle_quantum.biocomputing.protein.rst create mode 100644 docs_zh_CN/source/paddle_quantum.biocomputing.visualize.rst delete mode 100644 docs_zh_CN/source/paddle_quantum.qchem.density_matrix.rst delete mode 100644 docs_zh_CN/source/paddle_quantum.qchem.hardware_efficient.rst delete mode 100644 docs_zh_CN/source/paddle_quantum.qchem.loss.rst delete mode 100644 docs_zh_CN/source/paddle_quantum.qchem.qchem.rst delete mode 100644 docs_zh_CN/source/paddle_quantum.qchem.slater_determinant.rst delete mode 100644 docs_zh_CN/source/paddle_quantum.qchem.uccsd.rst diff --git a/applications/portfolio_optimization/introduction_cn.ipynb b/applications/portfolio_optimization/introduction_cn.ipynb index 93cc646..9704a6b 100644 --- a/applications/portfolio_optimization/introduction_cn.ipynb +++ b/applications/portfolio_optimization/introduction_cn.ipynb @@ -42,7 +42,7 @@ "## 量子编码及求解\n", "我们通过变换 $x_i \\mapsto \\frac{I-Z_i}{2}$ 将损失函数转为一个哈密顿量,从而完成投资组合优化问题的编码。这里$Z_i=I \\otimes I \\otimes \\ldots \\otimes Z \\otimes \\ldots \\otimes I$,即 $Z_{i}$ 是作用在第$i$ 个比特上的Pauli算符。我们用这个映射将 $C_x$ 转化成量子比特数为 $n$ 的系统的哈密顿矩阵 $H_C$,其基态即为投资组合优化问题的最优解。为了寻找这一哈密顿量的基态,我们使用变分量子算法的思想,通过一个参数化量子线路,生成一个试验态 $|\\theta^* \\rangle$。我们通过量子线路获得哈密顿量在该试验态上的期望值,然后,通过经典的梯度下降算法调节参数化量子线路的参数,使期望值向基态能量靠拢。重复若干次之后,我们找到最优解:\n", "$$\n", - "|\\theta^* \\rangle = \\argmin_\\theta L(\\vec{\\theta})=\\argmin_\\theta \\left\\langle\\vec{\\theta}\\left|H_C\\right| \\vec{\\theta}\\right\\rangle.\n", + "|\\theta^* \\rangle = \\arg\\min_\\theta L(\\vec{\\theta})=\\arg\\min_\\theta \\left\\langle\\vec{\\theta}\\left|H_C\\right| \\vec{\\theta}\\right\\rangle.\n", "$$\n", "最后,我们读出测量结果的概率分布:$p(z)=\\left|\\left\\langle z \\mid \\vec{\\theta}^*\\right\\rangle\\right|^2$,即由量子编码还原出原先比特串的信息。某个比特串出现的概率越大,意味着其是投资组合优化问题最优解的可能性越大。" ] @@ -225,7 +225,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3.8.13 ('pq')", + "display_name": "pq-dev", "language": "python", "name": "python3" }, @@ -239,12 +239,12 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.13" + "version": "3.8.15 (default, Nov 10 2022, 13:17:42) \n[Clang 14.0.6 ]" }, "orig_nbformat": 4, "vscode": { "interpreter": { - "hash": "d3caffbb123012c2d0622db402df9f37d80adc57c1cef1fdb856f61446d88d0a" + "hash": "5fea01cac43c34394d065c23bb8c1e536fdb97a765a18633fd0c4eb359001810" } } }, diff --git a/applications/portfolio_optimization/introduction_en.ipynb b/applications/portfolio_optimization/introduction_en.ipynb index 975edc9..cb529ef 100644 --- a/applications/portfolio_optimization/introduction_en.ipynb +++ b/applications/portfolio_optimization/introduction_en.ipynb @@ -47,7 +47,7 @@ "$\n", "where $Z_i=I \\otimes I \\otimes \\ldots \\otimes Z \\otimes \\ldots \\otimes I$, i.e., $Z_{i}$ is the Pauli operator acting solely on the $i$-th qubit. Thus using the above mapping, we can transform the cost function $C_x$ into a Hamiltonian $H_C$ for the system of $n$ qubits, the ground state of which represents the solution of the portfolio optimization problem. In order to find the ground state, we use the idea of variational quantum algorithms. We implement a parametric quantum circuit, and use it to generate a trial state $|\\theta^* \\rangle$. We use the quantum circuit to measure the expectation value of the Hamiltonian on this state. Then, classical gradient descent algorithm is implemented to adjust the parameters of the parametric circuit, where the expectation value evolves towards the ground state energy. After some iterations, we arrive at the optimal value\n", "$$\n", - "|\\theta^* \\rangle = \\argmin_\\theta L(\\vec{\\theta})=\\argmin_\\theta \\left\\langle\\vec{\\theta}\\left|H_C\\right| \\vec{\\theta}\\right\\rangle.\n", + "|\\theta^* \\rangle = \\arg\\min_\\theta L(\\vec{\\theta})=\\arg\\min_\\theta \\left\\langle\\vec{\\theta}\\left|H_C\\right| \\vec{\\theta}\\right\\rangle.\n", "$$\n", "\n", "Finally, we read out the probability distribution from the measurement result (i.e. decoding the quantum problem to give information about the original bit string)\n", @@ -238,7 +238,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3.8.13 ('pq')", + "display_name": "pq-dev", "language": "python", "name": "python3" }, @@ -252,12 +252,12 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.13" + "version": "3.8.15 (default, Nov 10 2022, 13:17:42) \n[Clang 14.0.6 ]" }, "orig_nbformat": 4, "vscode": { "interpreter": { - "hash": "d3caffbb123012c2d0622db402df9f37d80adc57c1cef1fdb856f61446d88d0a" + "hash": "5fea01cac43c34394d065c23bb8c1e536fdb97a765a18633fd0c4eb359001810" } } }, diff --git a/applications/protein_folding/APRLRFY_3d_structure.jpg b/applications/protein_folding/APRLRFY_3d_structure.jpg index fbf6554adfaea4490a0b350b5dada0925eb36b30..532d830f25a3bd732a8995d0e517a3b2494824c6 100644 GIT binary patch literal 25947 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 N-T(i8_?!JX^)FU`I&}a5 literal 24693 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 中。 + 假设欧式期权定价处于 `Black-Scholes-Merton 模型 `_ 中。 .. py:method:: estimate() 使用量子蒙特卡洛算法估算欧式期权定价。 - :return: 给定资产的期权定价。 - :rtype: float + :return: 给定资产的期权定价。 + :rtype: float .. py:method:: plot() 画出在该方案中使用的量子电路。 - \ No newline at end of file diff --git a/docs_zh_CN/source/paddle_quantum.fisher.rst b/docs_zh_CN/source/paddle_quantum.fisher.rst index f08f45c..248eb35 100644 --- a/docs_zh_CN/source/paddle_quantum.fisher.rst +++ b/docs_zh_CN/source/paddle_quantum.fisher.rst @@ -125,9 +125,9 @@ Fisher 信息的功能实现。 :type model_type: str :param \*\*kwargs: 神经网络参数, 包含如下选项: - - size (list): 经典神经网络各层神经元的数量 \\ - - num_qubits (int): 量子神经网络量子比特的数量 \\ - - depth (int): 量子神经网络的深度 \\ + - size (list): 经典神经网络各层神经元的数量 + - num_qubits (int): 量子神经网络量子比特的数量 + - depth (int): 量子神经网络的深度 - encoding (str): 量子神经网络中经典数据的编码方式,目前支持 ``IQP`` 和 ``re-uploading`` :type \*\*kwargs: Union[List[int], int, str] diff --git a/docs_zh_CN/source/paddle_quantum.hamiltonian.rst b/docs_zh_CN/source/paddle_quantum.hamiltonian.rst index 44374f3..587ad5d 100644 --- a/docs_zh_CN/source/paddle_quantum.hamiltonian.rst +++ b/docs_zh_CN/source/paddle_quantum.hamiltonian.rst @@ -60,19 +60,23 @@ paddle\_quantum.hamiltonian 将 pauli_str 分解为系数、泡利字符串的简化形式以及它们分别作用的量子比特下标。 - :return: 包含如下元素的 tuple: - - coefficients: 元素为每一项的系数。 - - pauli_words_r: 元素为每一项的泡利字符串的简化形式,例如 'Z0, Z1, X3' 这一项的泡利字符串为 'ZZX'。 - - sites: 元素为每一项作用的量子比特下标,例如 'Z0, Z1, X3' 这一项的 site 为 [0, 1, 3]。 + :return: + 包含如下元素的 tuple: + + - coefficients: 元素为每一项的系数。 + - pauli_words_r: 元素为每一项的泡利字符串的简化形式,例如 'Z0, Z1, X3' 这一项的泡利字符串为 'ZZX'。 + - sites: 元素为每一项作用的量子比特下标,例如 'Z0, Z1, X3' 这一项的 site 为 [0, 1, 3]。 :rtype: Tuple[list] .. py:method:: decompose_pauli_words() 将 pauli_str 分解为系数和泡利字符串。 - :return: 包含如下元素的 tuple: - - coefficients: 元素为每一项的系数。 - - pauli_words: 元素为每一项的泡利字符串,例如 'Z0, Z1, X3' 这一项的泡利字符串为 'ZZIX'。 + :return: + 包含如下元素的 tuple: + + - coefficients: 元素为每一项的系数。 + - pauli_words: 元素为每一项的泡利字符串,例如 'Z0, Z1, X3' 这一项的泡利字符串为 'ZZIX'。 :rtype: Tuple[list] .. py:method:: construct_h_matrix(qubit_num=None) diff --git a/docs_zh_CN/source/paddle_quantum.qchem.algorithm.rst b/docs_zh_CN/source/paddle_quantum.qchem.algorithm.rst index 04ac75c..edb4f70 100644 --- a/docs_zh_CN/source/paddle_quantum.qchem.algorithm.rst +++ b/docs_zh_CN/source/paddle_quantum.qchem.algorithm.rst @@ -1,3 +1,52 @@ paddle\_quantum.qchem.algorithm ========================================= +变分量子求解器 + +.. py:class:: VQESolver(optimizer, num_iterations, tol, save_every) + + 变分量子算法基类 + + :param optimizer: 优化器。 + :type optimizer: paddle.optimizer.Optimizer + :param num_iterations: 优化迭代次数。 + :type num_iterations: int + :param tol: 优化器收敛精度。 + :type tol: float + :param save_every: 日志记录设置。 + :type save_every: int + + .. py:method:: solve + + 求解方法。 + +.. py:class:: GroundStateSolver(optimizer, num_iterations, tol, save_every) + + 基类::py:class:`VQESolver` + + 基态能量求解器。 + + :param optimizer: 优化器。 + :type optimizer: paddle.optimize.Optimizer + :param num_iterations: 优化迭代次数。 + :type num_iterations: int + :param tol: 优化器收敛精度。 + :type tol: float + :param save_every: 日志记录设置。 + :type save_every: int + + .. py:method:: solve(mol, ansatz, init_state, **optimizer_kwargs) + + 运行VQE方法计算分子基态能量。 + + :param mol: 给定需要计算的分子类型。 + :type mol: paddle_quantum.qchem.Molecule + :param ansatz: 变分量子线路。 + :type ansatz: paddle_quantum.ansatz.Circuit + :param init_state: 给定的初态。 + :type init_state: Optional[paddle_quantum.state.State] + :param optimizer_kwargs: 优化器配置参数。 + :type optimizer_kwargs: Optional[Dict] + + :return: 最终的损失函数值和优化后的量子态。 + :rtype: Tuple[float, paddle.Tensor] \ No newline at end of file diff --git a/docs_zh_CN/source/paddle_quantum.qchem.ansatz.rst b/docs_zh_CN/source/paddle_quantum.qchem.ansatz.rst index 869cd45..3a73f10 100644 --- a/docs_zh_CN/source/paddle_quantum.qchem.ansatz.rst +++ b/docs_zh_CN/source/paddle_quantum.qchem.ansatz.rst @@ -1,3 +1,65 @@ paddle\_quantum.qchem.ansatz ================================= +量子化学常用变分量子线路模版 + +.. py:class:: HardwareEfficient(num_qubits, depth, use_cz, angles, rot_type) + + 基类::py:class:`paddle_quantum.ansatz.Circuit` + + Hardware Efficient量子线路模版。 + + :param num_qubits: 量子比特数。 + :type num_qubits: int + :param depth: 量子线路深度(以重复单元数量计数)。 + :type depth: int + :param use_cz: 是否使用CZ门作为两比特门。 + :type use_cz: bool + :param angles: 线路中的可变分的角度。 + :type angles: Optional[np.ndarray] + :param rot_type: 线路中旋转门类型。 + :type rot_type: Optional[str] + + .. py:property:: rot_type + + 旋转门类型。 + + .. py:property:: entangle_type + + 纠缠门类型。 + +.. py:class:: UCC(num_qubits, ucc_order, single_ex_amps, double_ex_amps, **trotter_kwargs) + + 基类::py:class:`paddle_quantum.ansatz.Circuit` + + Unitary Coupled Cluster线路模版。 + + :param num_qubits: 量子比特数量。 + :type num_qubits: int + :param ucc_order: 耦合簇阶数。 + :type ucc_order: Optional[str] + :param single_ex_amps: 单粒子激发矩阵。 + :type single_ex_amps: Optional[np.ndarray] + :param double_ex_amps: 双粒子激发张量。 + :type double_ex_amps: Optional[np.ndarray] + :param \*\*trotter_kwargs: trotter分解方法配置参数。 + :type \*\*trotter_kwargs: Dict + + .. py:property:: onebody_tensor + + 单体算符张量。 + + .. py:property:: twobody_tensor + + 双体算符张量。 + +.. py:class:: HartreeFock(num_qubits, angles) + + 基类::py:class:`paddle_quantum.ansatz.Circuit` + + 哈特利-福克量子线路。 + + :param num_qubits: 量子比特数量。 + :type num_qubits: int + :param angles: 吉文斯旋转角度。 + :type angles: Optional[np.ndarray] diff --git a/docs_zh_CN/source/paddle_quantum.qchem.density_matrix.rst b/docs_zh_CN/source/paddle_quantum.qchem.density_matrix.rst deleted file mode 100644 index 049c8a3..0000000 --- a/docs_zh_CN/source/paddle_quantum.qchem.density_matrix.rst +++ /dev/null @@ -1,22 +0,0 @@ -paddle\_quantum.qchem.density\_matrix -============================================ - -对量子态测量单体密度矩阵。 - -.. py:class:: OneBodyDensityMatrix() - - 基类: :py:class:`paddle.autograd.PyLayer` - - 用于测量给定量子态的单体密度矩阵。 - -.. py:function:: get_spinorb_onebody_dm(n_qubits, state) - - 获取给定量子态的单体密度矩阵,并以自旋轨道数标注量子比特。 - - :param n_qubits: 量子态所包含的量子比特数。 - :type n_qubits: int - :param state: 给定量子态。 - :type state: paddle.Tensor - - :return: 自旋轨道数标注的单体密度矩阵。 - :rtype: Tuple[paddle.Tensor] \ No newline at end of file diff --git a/docs_zh_CN/source/paddle_quantum.qchem.drivers.rst b/docs_zh_CN/source/paddle_quantum.qchem.drivers.rst index 0c13fd8..48a61a1 100644 --- a/docs_zh_CN/source/paddle_quantum.qchem.drivers.rst +++ b/docs_zh_CN/source/paddle_quantum.qchem.drivers.rst @@ -1,3 +1,82 @@ paddle\_quantum.qchem.drivers ================================== +经典量子化学求解器。 + +.. py:class:: Driver + + 求解器基类。 + + .. py:method:: run_scf() + + SCF计算方法 + + .. py:property:: num_modes() + + 希尔伯特空间模式数量。 + + .. py:property:: energy_nuc() + + 原子核之间相互作用能量。 + + .. py:property:: mo_coeff() + + 原子轨道与分子轨道之间的转换矩阵。 + + .. py:method:: load_molecule() + + 加载分子。 + + .. py:method:: get_onebody_tensor() + + 哈密顿量中的单体算符张量。 + + .. py:method:: get_twobody_tensor() + + 哈密顿量中的双体算符张量。 + +.. py:class:: PySCFDriver + + 基类::py:class:`Driver` + + 基于PySCF的经典求解器。 + + .. py:method:: load_molecule(atom, basis, multiplicity, charge, unit) + + 根据提供的信息构建量子化学分子类型。 + + :param atom: 分子中原子标记及坐标。 + :type atom: List[Tuple[str,List[float]]] + :param basis: 量子化学基组。 + :type basis: str + :param multiplicity: 分子的自旋多重度。 + :type multiplicity: int + :param charge: 分子中的总电荷量。 + :type charge: int + :param unit: 构建分子使用的长度单位。 + :type unit: str + + .. py:method:: run_scf() + + SCF计算方法 + + .. py:property:: energy_nuc() + + 原子核之间相互作用能量。 + + .. py:property:: mo_coeff() + + 原子轨道与分子轨道之间的转换矩阵。 + + .. py:method:: get_onebody_tensor(integral_type) + + :param integral_type: 单体积分类型。 + :type integral_type: str + + :return: 哈密顿量中的单体算符张量。 + :rtype: np.ndarray + + .. py:method:: get_twobody_tensor() + + :return: 哈密顿量中的双体算符张量。 + :rtype: np.ndarray \ No newline at end of file diff --git a/docs_zh_CN/source/paddle_quantum.qchem.fermionic_state.rst b/docs_zh_CN/source/paddle_quantum.qchem.fermionic_state.rst index a1be0b2..491e2f5 100644 --- a/docs_zh_CN/source/paddle_quantum.qchem.fermionic_state.rst +++ b/docs_zh_CN/source/paddle_quantum.qchem.fermionic_state.rst @@ -1,3 +1,114 @@ paddle\_quantum.qchem.fermionic\_state ========================================= +费米子波函数。 + +.. py:class:: WaveFunction(data, convention, backend, dtype, override) + + 基类::py:class:`paddle_quantum.state.State` + + 费米子波函数。 + + :param data: 费米子波函数在计算基下的展开系数。 + :type data: Union[paddle.Tensor, np.ndarray] + :param convention: 计算基中自旋轨道排列方式,自旋轨道分开排列(`separated`) 或混合排列(`mixed`)。 + :type convention: Optional[str] + :param backend: 后端使用的计算方式。 + :type backend: Optional[paddle_quantum.backend.Backend] + :param dtype: 存储费米子波函数所用的数据类型,32位或64位。 + :type dtype: str + :param override: 是否在copy时覆盖原有数据。 + :type override: bool + + .. py:method:: clone() + + :return: 原费米子量子态的复制。 + :rtype: WaveFunction + + .. py:method:: swap(p, q) + + 交换两个费米子。 + + :param p: 被交换的费米子序号。 + :type p: int + :param q: 被交换的费米子序号。 + :type q: int + + :return: 交换之后的费米子波函数。 + :rtype: WaveFunction + + .. py:method:: to_spin_mixed() + + 将自旋轨道的排列顺序变为“上下上下......”混合的形式。 + + :return: 原费米子波函数在新排列下的表示。 + :rtype: WaveFunction + + .. py:method:: to_spin_separated() + + 将自旋轨道的排列顺序变为“上上...下下下...”的分离形式。 + + :return: 原费米子波函数在新排列下的表示。 + :rtype: WaveFunction + + .. py:method:: slater_determinant_state(num_qubits, num_elec, mz, backend, dtype) + + 根据给定的量子比特数、电子数和磁量子数生成Slater行列式态。 + + :param num_qubits: 量子比特数量。 + :type num_qubits: int + :param num_elec: 电子数。 + :type num_elec: int + :param mz: 磁量子数。 + :type mz: int + :param backend: 后端使用的计算方式。 + :type backend: Optional[paddle_quantum.backend.Backend] + :param dtype: 数据类型,32位或64位。 + :type dtype: str + + :return: 存储Slater行列式的费米子波函数。 + :rtype: WaveFunction + + .. py:method:: zero_state(num_qubits, backend, dtype) + + 根据给定的量子比特数生成零态。 + + :param num_qubits: 量子比特数。 + :type num_qubits: int + :param backend: 后端使用的计算方式。 + :type backend: Optional[paddle_quantum.backend.Backend] + :param dtype: 存储数据类型,32位或64位。 + :type dtype: Optional[str] + + :return: 存储零态的费米子波函数。 + :rtype: WaveFunction + + .. py:method:: num_elec(shots) + + 多电子费米子波函数中包含的电子数。 + + :param shots: 测量次数。 + :type shots: Optional[int] + + :return: 电子数。 + :rtype: int + + .. py:method:: total_SpinZ(shots) + + 总自旋的z分量。 + + :param shots: 测量次数。 + :type shots: Optional[int] + + :return: 总自旋的z分量。 + :rtype: float + + .. py:method:: total_Spin2(shots) + + 总自旋的平方。 + + :param shots: 测量次数。 + :type shots: Optional[int] + + :return: 总自旋的平方 + :rtype: float \ No newline at end of file diff --git a/docs_zh_CN/source/paddle_quantum.qchem.hardware_efficient.rst b/docs_zh_CN/source/paddle_quantum.qchem.hardware_efficient.rst deleted file mode 100644 index 90e8d52..0000000 --- a/docs_zh_CN/source/paddle_quantum.qchem.hardware_efficient.rst +++ /dev/null @@ -1,15 +0,0 @@ -paddle\_quantum.qchem.hardware\_efficient -================================================ - -Hardware Efficient 电路模板。 - -.. py:class:: HardwareEfficientModel(n_qubits, depth, theta=None) - - 基类: :py:class:`paddle_quantum.gate.base.Gate` - - :param n_qubits: 量子态所包含的量子比特数。 - :type n_qubits: int - :param depth: 量子电话深度,单层 Hardware Efficient 量子电路包含 [Ry, Rz, CNOT] 门。 - :type depth: int - :param theta: 线路中 Ry, Rz 量子门的参数,默认值为 ``None``。 - :type theta: paddle.Tensor, optional diff --git a/docs_zh_CN/source/paddle_quantum.qchem.loss.rst b/docs_zh_CN/source/paddle_quantum.qchem.loss.rst deleted file mode 100644 index b572908..0000000 --- a/docs_zh_CN/source/paddle_quantum.qchem.loss.rst +++ /dev/null @@ -1,36 +0,0 @@ -paddle\_quantum.qchem.loss -================================= - -量子化学中的损失函数。 - -.. py:class:: MolEnergyLoss(geometry, basis, multiplicity=1, charge=0) - - 基类::py:class:`paddle_quantum.loss.ExpecVal` - - 分子基态计算的损失函数。 - - :param geometry: 表示分子位置几何信息,例如 ``H 0.0 0.0 0.0; H 0.0 0.0 0.74``。 - :type geometry: str - :param basis: 化学基选取,例如 ``sto-3g``。 - :type basis: str - :param multiplicity: 自旋多重度, 默认值为 ``1``。 - :type multiplicity: int, optional - :param charge: 分子电荷量, 默认值为 ``0``。 - :type charge: int, optional - -.. py:class:: RHFEnergyLoss(geometry, basis, multiplicity=1, charge=0) - - 基类: :py:class:`paddle_quantum.Operator` - - Restricted Hartree Fock 计算的损失函数。 - - :param geometry: 表示分子位置几何信息,例如 ``H 0.0 0.0 0.0; H 0.0 0.0 0.74``。 - :type geometry: str - :param basis: 化学基选取,例如 ``sto-3g``。 - :type basis: str - :param multiplicity: 自旋多重度, 默认值为 ``1``。 - :type multiplicity: int, optional - :param charge: 分子电荷量, 默认值为 ``0``。 - :type charge: int, optional - - :raises ModuleNotFoundError: Hartree Fock 方法需要安装 ``pyscf`` 包。安装请运行 ``pip install -U pyscf``。 \ No newline at end of file diff --git a/docs_zh_CN/source/paddle_quantum.qchem.molecule.rst b/docs_zh_CN/source/paddle_quantum.qchem.molecule.rst index aec92b9..ea9f17c 100644 --- a/docs_zh_CN/source/paddle_quantum.qchem.molecule.rst +++ b/docs_zh_CN/source/paddle_quantum.qchem.molecule.rst @@ -1,3 +1,56 @@ paddle\_quantum.qchem.molecule ========================================= +量子化学中的分子类型。 + +.. py:class:: Molecule(geometry, basis, multiplicity, charge, mol_expr, use_angstrom, driver) + + 量子化学分子类型。 + + :param geometry: 分子中原子符号与原子位置坐标。 + :type geometry: Optional[List[Tuple[str,list]]] + :param basis: 量子化学基组。 + :type basis: Optional[str] + :param multiplicity: 分子的自旋多重度。 + :type multiplicity: Optional[int] + :param charge: 分子中的总电荷数。 + :type charge: Optional[int] + :param mol_expr: 分子表达式。 + :type mol_expr: Optional[str] + :param use_angstrom: 是否用埃作为分子中的长度单位。 + :type use_angstrom: bool + :param driver: 经典量子化学计算工具(计算分子积分)。 + :type driver: paddle_quantum.qchem.Driver + + .. py:method:: build() + + 利用经典量子化学工具完成相关计算。 + + .. py:property:: atom_charges() + + 分子中每个原子的核电荷数,例如,氢分子为 [1, 1] + + .. py:property:: atom_coords() + + 分子中每个原子的位置坐标,返回一个 ``numpy ndarray`` 。 + + .. py:property:: unit() + + 分子中原子间距离的长度单位。 + + .. py:method:: get_mo_integral(integral_type) + + 计算分子积分。 + + :param integral_type: 分子积分的类型,如动能积分 "int1e_kin"。 + :type integral_type: str + + :return: 分子积分。 + :rtype: numpy.ndarray + + .. py:method:: get_molecular_hamiltonian() + + 分子的哈密顿量。 + + :return: 分子哈密顿量。 + :rtype: paddle_quantum.Hamiltonian \ No newline at end of file diff --git a/docs_zh_CN/source/paddle_quantum.qchem.properties.rst b/docs_zh_CN/source/paddle_quantum.qchem.properties.rst index c7c4c7c..856715c 100644 --- a/docs_zh_CN/source/paddle_quantum.qchem.properties.rst +++ b/docs_zh_CN/source/paddle_quantum.qchem.properties.rst @@ -1,3 +1,56 @@ paddle\_quantum.qchem.properties ========================================= +计算分子性质。 + +.. py:function:: energy(psi, mol, shots, use_shadow, **shadow_kwargs) + + 计算哈密顿量在给定量子态下的能量。 + + :param psi: 量子态。 + :type psi: paddle_quantum.state.State + :param mol: 分子类型。 + :type mol: paddle_quantum.qchem.Molecule + :param shots: 测量次数。 + :type shots: Optional[int] + :param use_shadow: 是否使用经典影子方法。 + :type use_shadow: Optional[bool] + :param \*\*shadow_kwargs: 经典影子方法的配置。 + :type \*\*shadow_kwargs: Dict + + :return: 哈密顿量的能量。 + :rtype: float + +.. py:function:: symmetric_rdm1e(psi, shots, use_shadow, **shadow_kwargs) + + 对称化的单电子约化密度矩阵。 + + :param psi: 量子态。 + :type psi: paddle_quantum.state.State + :param shots: 测量次数。 + :type shots: int + :param use_shadow: 是否使用经典影子方法。 + :type use_shadow: bool + :param \*\*shadow_kwargs: 经典影子方法的配置。 + :type \*\*shadow_kwargs: Dict + + :return: 单电子密度矩阵。 + :rtype: np.ndarray + +.. py:function:: dipole_moment(psi, mol, shots, use_shadow, **shadow_kwargs) + + 利用给定的量子态计算分子偶极矩。 + + :param psi: 量子态。 + :type psi: paddle_quantum.state.State + :param mol: 分子类型。 + :type mol: paddle_quantum.qchem.Molecule + :param shots: 测量次数。 + :type shots: int + :param use_shadow: 是否使用经典影子方法。 + :type use_shadow: bool + :param \*\*shadow_kwargs: 经典影子方法的配置。 + :type \*\*shadow_kwargs: Dict + + :return: 分子偶极矩。 + :rtype: np.ndarray diff --git a/docs_zh_CN/source/paddle_quantum.qchem.qchem.rst b/docs_zh_CN/source/paddle_quantum.qchem.qchem.rst deleted file mode 100644 index d160856..0000000 --- a/docs_zh_CN/source/paddle_quantum.qchem.qchem.rst +++ /dev/null @@ -1,113 +0,0 @@ -paddle\_quantum.qchem.qchem -================================== - -量子化学中的功能函数。 - -.. py:function:: qubitOperator_to_Hamiltonian(spin_h,tol) - - 将openfermion形式转化为量桨的哈密顿量形式。 - - :param spin_h: openfermion形式的哈密顿量。 - :type spin_h: openfermion.ops.operators.qubit_operator.QubitOperator - :param tol: 阈值 - :type tol: float, optional - - :return: 返回转换成量桨形式的哈密顿量 - :rtype: Hamiltonian - -.. py:function:: geometry(structure, file) - - 读取分子几何信息。 - - :param structure: 分子几何信息的字符串形式, 以 H2 分子为例 ``[['H', [-1.68666, 1.79811, 0.0]], ['H', [-1.12017, 1.37343, 0.0]]]``。 - :type structure: string, optional - :param file: xyz 文件的路径。 - :type file: str, optional - - :raises AssertionError: 两个输入参数不可以同时为 ``None``。 - - :return: 分子的几何信息。 - :rtype: str - -.. py:function:: get_molecular_data(geometry, charge, multiplicity, basis, method, if_save, if_print, name, file_path) - - 计算分子的必要信息,包括单体积分(one-body integrations)和双体积分(two-body integrations,以及用选定的方法计算基态的能量。 - - :param geometry: 分子的几何信息。 - :type geometry: str - :param charge: 分子电荷, 默认值为 ``0``。 - :type charge: int, optional - :param multiplicity: 分子的多重度, 默认值为 ``1``。 - :type multiplicity: int, optional - :param basis: 常用的基组是 ``sto-3g、6-31g`` 等, 默认的基组是 ``sto-3g``,更多的基组选择可以参考网站 - https://psicode.org/psi4manual/master/basissets_byelement.html#apdx-basiselement。 - :type basis: str, optional - :param method: 用于计算基态能量的方法, 包括 ``scf`` 和 ``fci``,默认的方法为 ``scf``。 - :type method: str, optional - :param if_save: 是否需要将分子信息存储成 .hdf5 文件,默认为 ``True``。 - :type if_save: bool, optional - :param if_print: 是否需要打印出选定方法 (method) 计算出的分子基态能量,默认为 ``True``。 - :type if_print: bool, optional - :param name: 命名储存的文件, 默认为 ``""``。 - :type name: str, optional - :param file_path: 文件的储存路径, 默认为 ``"."``。 - :type file_path: str, optional - - :return: 包含分子所有信息的类。 - :rtype: MolecularData - -.. py:function:: active_space(electrons, orbitals, multiplicity, active_electrons, active_orbitals) - - 对于给定的活跃电子和活跃轨道计算相应的活跃空间(active space)。 - - :param electrons: 电子数。 - :type electrons: int - :param orbitals: 轨道数。 - :type orbitals: int - :param multiplicity: 自旋多重度, 默认值为 ``1``。 - :type multiplicity: int, optional - :param active_electrons: 活跃 (active) 电子数,默认情况为所有电子均为活跃电子。 - :type active_electrons: int, optional - :param active_orbitals: 活跃 (active) 轨道数,默认情况为所有轨道均为活跃轨道。 - :type active_orbitals: int, optional - - :return: 核心轨道和活跃轨道的索引。 - :rtype: tuple - -.. py:function:: fermionic_hamiltonian(molecule, filename, multiplicity, active_electrons, active_orbitals) - - 计算给定分子的费米哈密顿量。 - - :param molecule: 包含分子所有信息的类。 - :type molecule: MolecularData - :param filename: 分子的 .hdf5 文件的路径。 - :type filename: str, optional - :param multiplicity: 自旋多重度, 默认值为 ``1``。 - :type multiplicity: int, optional - :param active_electrons: 活跃 (active) 电子数,默认情况为所有电子均为活跃电子。 - :type active_electrons: int, optional - :param active_orbitals: 活跃 (active) 轨道数,默认情况为所有轨道均为活跃轨道。 - :type active_orbitals: int, optional - - :return: openfermion 格式的哈密顿量。 - :rtype: openfermion.ops.operators.qubit_operator.QubitOperator - -.. py:function:: spin_hamiltonian(molecule, filename, multiplicity, mapping_method, active_electrons, active_orbitals) - - 生成 Paddle Quantum 格式的哈密顿量。 - - :param molecule: openfermion 格式的哈密顿量。 - :type molecule: openfermion.ops.operators.qubit_operator.QubitOperator - :param filename: 分子的 .hdf5 文件的路径。 - :type filename: str, optional - :param multiplicity: 自旋多重度, 默认值为 ``1``。 - :type multiplicity: int, optional - :param mapping_method: 映射方法,这里默认为 ``jordan_wigner``,此外还提供 ``bravyi_kitaev`` 方法。 - :type mapping_method: str, optional - :param active_electrons: 活跃 (active) 电子数,默认情况为所有电子均为活跃电子。 - :type active_electrons: int, optional - :param active_orbitals: 活跃 (active) 轨道数默认情况为所有轨道均为活跃轨道。 - :type active_orbitals: int, optional - - :return: Paddle Quantum 格式的哈密顿量。 - :rtype: Hamiltonian \ No newline at end of file diff --git a/docs_zh_CN/source/paddle_quantum.qchem.slater_determinant.rst b/docs_zh_CN/source/paddle_quantum.qchem.slater_determinant.rst deleted file mode 100644 index 3954ba6..0000000 --- a/docs_zh_CN/source/paddle_quantum.qchem.slater_determinant.rst +++ /dev/null @@ -1,36 +0,0 @@ -paddle\_quantum.qchem.slater\_determinant -================================================ - -受限 Hartree Fock 下的 Slater 行列式电路模板。 - -.. py:class:: GivensRotationBlock(pindex, qindex, theta) - - 基类::py:class:`paddle_quantum.gate.Gate` - - 双量子门,用于实现给定旋转。 - - .. math:: - - \begin{align} - U(\theta)=e^{-i\frac{\theta}{2}(Y\otimes X-X\otimes Y)} - \end{align} - - :param pindex: 第一个qubit的编号。 - :type pindex: int - :param qindex: 第二个qubit的编号。 - :type qindex: int - :param theta: 给定旋转角度。 - :type theta: float - -.. py:class:: RHFSlaterDeterminantModel(n_qubits, n_electrons, mo_coeff=None) - - 基类::py:class:`paddle_quantum.gate.Gate` - - 在 Restricted Hartree Fock 计算中使用的 Slater 方阵拟设。 - - :param n_qubits: 量子态所包含的量子比特数。 - :type n_qubits: int - :param n_electrons: 分子中所包含的电子数。 - :type n_electrons: int - :param mo_coeff: 初始化Slater 方阵态的参数, 默认值为 ``None``。 - :type mo_coeff: Union[np.array, None], optional \ No newline at end of file diff --git a/docs_zh_CN/source/paddle_quantum.qchem.uccsd.rst b/docs_zh_CN/source/paddle_quantum.qchem.uccsd.rst deleted file mode 100644 index a22cccd..0000000 --- a/docs_zh_CN/source/paddle_quantum.qchem.uccsd.rst +++ /dev/null @@ -1,36 +0,0 @@ -paddle\_quantum.qchem.uccsd -================================== - -UCCSD 电路模板。 - -.. py:class:: UCCSDModel(n_qubits, n_electrons, n_trotter_steps, single_excitation_amplitude=None, double_excitation_amplitude=None) - - 基类::py:class:`paddle_quantum.gate.Gate` - - 量子化学计算中的酉耦合簇拟设 (UCCSD)。 - - .. note:: - UCCSD 模型一般需要建立非常深的量子电路。因此,对于 H2 元素序列之后的分子结构,训练 UCCSD 拟设需要更好的设备及大量的运算时间。 - - .. math:: - - \begin{align} - U(\theta)&=e^{\hat{T}-\hat{T}^{\dagger}}\\ - \hat{T}&=\hat{T}_1+\hat{T}_2\\ - \hat{T}_1&=\sum_{a\in{\text{virt}}}\sum_{i\in\text{occ}}t_{ai}\sum_{\sigma}\hat{c}^{\dagger}_{a\sigma}\hat{c}_{i\sigma}-h.c.\\ - \hat{T}_2&=\frac{1}{2}\sum_{a,b\in\text{virt}}\sum_{i,j\in\text{occ}}t_{aibj}\sum_{\sigma\tau}\hat{c}^{\dagger}_{a\sigma}\hat{c}^{\dagger}_{b\tau}\hat{c}_{j\tau}\hat{c}_{i\sigma}-h.c. - \end{align} - - :param n_qubits: 量子态所包含的量子比特数。 - :type n_qubits: int - :param n_electrons: 分子中所包含的电子数。 - :type n_electrons: int - :param n_trotter_steps: 建立UCCSD电路所需的特罗特分解步数。 - :type n_trotter_steps: int - :param single_excitation_amplitude: :math:`\hat{T}_1` 定义中的 :math:`t_{ai}`, 默认值为 ``None``。 - :type single_excitation_amplitude: Union[np.array, None], optional - :param double_excitation_amplitude: :math:`\hat{T}_2` 定义中的 :math:`t_{aibj}`, 默认值为 ``None``。 - :type double_excitation_amplitude: Union[np.array, None], optional - - - diff --git a/docs_zh_CN/source/paddle_quantum.qchem.utils.rst b/docs_zh_CN/source/paddle_quantum.qchem.utils.rst index 13cdf47..df36794 100644 --- a/docs_zh_CN/source/paddle_quantum.qchem.utils.rst +++ b/docs_zh_CN/source/paddle_quantum.qchem.utils.rst @@ -1,4 +1,18 @@ paddle\_quantum.qchem.utils ========================================= +utility 函数。 +.. py:function:: orb2spinorb(num_modes, single_ex_amps, double_ex_amps) + + 将分子轨道积分转变为自旋轨道积分。 + + :param num_modes: 希尔伯特空间的维度。 + :type num_modes: int + :param single_ex_amps: 单粒子激发矩阵元。 + :type single_ex_amps: np.ndarray + :param double_ex_amps: 双粒子激发张量。 + :type double_ex_amps: np.ndarray + + :return: 自旋轨道基下的分子单体双体积分。 + :rtype: Tuple[np.ndarray] diff --git a/docs_zh_CN/source/paddle_quantum.qinfo.rst b/docs_zh_CN/source/paddle_quantum.qinfo.rst index 89eb842..c54f672 100644 --- a/docs_zh_CN/source/paddle_quantum.qinfo.rst +++ b/docs_zh_CN/source/paddle_quantum.qinfo.rst @@ -258,7 +258,6 @@ paddle\_quantum.qinfo - 由施密特系数组成的一维数组,形状为 ``(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) diff --git a/docs_zh_CN/source/paddle_quantum.qpp.utils.rst b/docs_zh_CN/source/paddle_quantum.qpp.utils.rst index 3f36f15..5fdd5d6 100644 --- a/docs_zh_CN/source/paddle_quantum.qpp.utils.rst +++ b/docs_zh_CN/source/paddle_quantum.qpp.utils.rst @@ -48,9 +48,11 @@ QPP 线路变换和其他相关工具。更多细节参考论文 https://arxiv.o :param initial_state: 输入量子态。 :type initial_state: Union[np.ndarray, paddle.Tensor, State] - :return: 包含如下元素的 tuple: - - 一个 ``U`` 的本征相位; - - 其相位对应的,存在和 ``initial_state`` 内积不为零的本征态。 + :return: + 包含如下元素的 tuple: + + - 一个 ``U`` 的本征相位; + - 其相位对应的,存在和 ``initial_state`` 内积不为零的本征态。 :rtype: Tuple[float, State] .. py:function:: qubitize(block_enc, num_block_qubits) diff --git a/paddle_quantum/biocomputing/algorithm.py b/paddle_quantum/biocomputing/algorithm.py index e3881bf..982b744 100644 --- a/paddle_quantum/biocomputing/algorithm.py +++ b/paddle_quantum/biocomputing/algorithm.py @@ -77,35 +77,30 @@ def cvar_expectation(psi: State, h: Hamiltonian, alpha: float) -> paddle.Tensor: class ProteinFoldingSolver(VQESolver): + r""" + Args: + penalty_factors: penalty factor ``[lambda0, lambda1]`` used in building the protein's Hamiltonian. + alpha: the cutoff probability for CVaR expectation value calculation. + optimizer: paddle's optimizer used to perform parameter update. + num_iterations : number of VQE iterations. + tol: convergence criteria. + save_every : number of steps between two recorded VQE loss. + """ def __init__( - self, - penalty_factors: List[float], - alpha: float, - optimizer: Optimizer, - num_iterations: int, - tol: float = 1e-8, - save_every: int = 1, + self, + penalty_factors: List[float], + alpha: float, + optimizer: Optimizer, + num_iterations: int, + tol: float = 1e-8, + save_every: int = 1, ) -> None: - r""" - Args: - penalty_factors: penalty factor ``[lambda0, lambda1]`` used in building the protein's Hamiltonian. - alpha: the cutoff probability for CVaR expectation value calculation. - optimizer: paddle's optimizer used to perform parameter update. - num_iterations : number of VQE iterations. - tol: convergence criteria. - save_every : number of steps between two recorded VQE loss. - """ super().__init__(optimizer, num_iterations, tol, save_every) self.lambda0 = penalty_factors[0] self.lambda1 = penalty_factors[1] self.alpha = alpha - def solve( - self, - protein: Protein, - ansatz: Circuit, - **optimizer_kwargs - ) -> Tuple[float, str]: + def solve(self, protein: Protein, ansatz: Circuit, **optimizer_kwargs) -> Tuple[float, str]: r"""Run VQE to calculate the structure of the protein that satisfies various constraints. Args: diff --git a/paddle_quantum/model.py b/paddle_quantum/model.py index e9795e9..8299322 100644 --- a/paddle_quantum/model.py +++ b/paddle_quantum/model.py @@ -47,7 +47,7 @@ rcParams = { 'optimizer': 'Adam', # optimizer in PaddlePaddle 'scheduler': 'StepDecay', # scheduler in PaddlePaddle: can be set to None. 'learning_rate': 0.2, # (initial) learning rate of the optimizer - 'scheduler_args': 100, # arguments of the scheduler other than learning rate + 'scheduler_args': {100}, # arguments (in list or tuple) of the scheduler other than learning rate # settings for the training 'num_itr': 200, # number of iterations during the training @@ -160,7 +160,7 @@ class Model(object): return [] if rcParams['print_style'] == 'exponential': - # print list is generated by poisson distribution + # print list is generated by exponential distribution lamb = 4 * math.log(2) / num_itr poisson = lambda x: lamb * math.exp(-lamb * x) list_itr = list(range(1, num_itr)) @@ -176,6 +176,11 @@ class Model(object): return print_list + def __scheduler_step(self, scheduler_name: str) -> List: + r""" Generate the argument for the scheduler.step() + """ + return (lambda x: [x]) if scheduler_name == 'ReduceOnPlateau' else (lambda x: []) + def prepare(self, loss_fcn: Callable[[Union[State, Circuit, Sequential], Any], Any], metric_fcn: Callable[[Union[Circuit, Sequential]], float] = None, metric_name: str = None) -> None: @@ -210,7 +215,8 @@ class Model(object): # setup the scheduler and optimizer self.__sch = NullScheduler(learning_rate=rcParams['learning_rate']) if rcParams['scheduler'] is None else \ - getattr(paddle.optimizer.lr, rcParams['scheduler'])(rcParams['learning_rate'], rcParams['scheduler_args']) + getattr(paddle.optimizer.lr, rcParams['scheduler'])(rcParams['learning_rate'], *rcParams['scheduler_args']) + self.__step = self.__scheduler_step(rcParams['scheduler']) self.__opt = getattr(paddle.optimizer, rcParams["optimizer"])(learning_rate=self.__sch, parameters=self.parameters()) # take the setting of rcParams @@ -304,7 +310,7 @@ class Model(object): self.__opt.minimize(loss) self.__opt.clear_grad() - self.__sch.step() + self.__sch.step(*self.__step(loss)) # update loss loss = loss.item() diff --git a/paddle_quantum/qml/qnnmic.py b/paddle_quantum/qml/qnnmic.py index 6742bec..5409002 100644 --- a/paddle_quantum/qml/qnnmic.py +++ b/paddle_quantum/qml/qnnmic.py @@ -43,17 +43,20 @@ class ImageDataset(Dataset): The class used for loading classical datasets. Args: - file_path: The path of the input image. - num_samples: The number of the data in the test dataset. - task: The training, validation, or testing task. - pca: Whether use principal component analysis. Defaults to None. - scaler: Whether scale the data. Defaults to None. - centering: Whether remove the mean. Defaults to None. + file_path: The path of the input image. + num_samples: The number of the data in the test dataset. + task: The training, validation, or testing task. + pca: Whether use principal component analysis. Defaults to None. + scaler: Whether scale the data. Defaults to None. + centering: Whether remove the mean. Defaults to None. Raises: ValueError: If the task is not training, validation, or test, raises the error. """ - def __init__(self, file_path: str, num_samples: int, task: str, pca: PCA=None, scaler: StandardScaler=None, centering: MinMaxScaler=None): + def __init__( + self, file_path: str, num_samples: int, task: str, pca: PCA = None, + scaler: StandardScaler = None, centering: MinMaxScaler = None + ): super().__init__() # load data data, labels = [], [] -- GitLab