提交 28845151 编写于 作者: Q Quleaf

update the api-doc and some details

上级 195b41b7
......@@ -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"
}
}
},
......
......@@ -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"
}
}
},
......
paddle\_quantum.biocomputing.biocomputing.algorithm
=======================================================
蛋白质折叠模型的VQE算法
.. py:function:: cvar_expectation(psi, h, alpha)
计算条件风险价值(CVaR)。
:param psi: 输入量子态。
:type psi: paddle_quantum.state.State
:param h: 哈密顿量。
:type h: paddle_quantum.Hamiltonian
:param alpha: 控制计算CVaR期望值中包括的basis数量的参数。
:return: 返回CVaR期望值。
:rtype: paddle.Tensor
.. py:class:: ProteinFoldingSolver(penalty_factors, alpha, optimizer, num_iterations, tol, save_every)
基类::py:class:`paddle_quantum.qchem.VQESolver`
求解蛋白质折叠模型的VQE求解器。
:param penalty_factors: 蛋白质哈密顿量中的正则化因子。
:type penalty_factors: List[float]
:param alpha: 控制计算CVaR期望值中包括的basis数量的参数。
:type alpha: float
:param optimizer: 量桨优化器。
:type optimizer: paddle.optimizer.Optimizer
:param num_iterations: VQE迭代次数。
:type num_iterations: int
:param tol: VQE算法收敛的判据。
:type tol: Optional[float]
:param save_every: 控制优化过程中每隔多少步记录优化结果。
:type save_every: Optional[int]
.. py:method:: solve(protein, ansatz, optimizer_kwargs)
求解函数。
:param protein: 输入的待优化蛋白质结构。
:type protein: paddle_quantum.biocomputing.Protein
:param ansatz: VQE中的参数化量子线路。
:type ansatz: paddle_quantum.ansatz.Circuit
:param optimizer_kwargs: 优化器配置参数。
:type optimizer_kwargs: Optional[Dict]
:return: 返回最终的损失函数值及其对应的计算基态。
:rtype: Tuple[float, str]
paddle\_quantum.biocomputing.data_loader
==============================================
数据加载模块。
.. py:function:: load_energy_matrix_file()
返回从Miyazawa-Jernigan potential文档中生成的能量矩阵。
:return: 能量矩阵,氨基酸序列。
:rtype: tuple[np.ndarray,List[str]]
.. py:function:: _parse_energy_matrix(matrix)
对加载的能量矩阵进行解析。
:param matrix: 能量矩阵
:type matrix: np.ndarray
:return: 解析后的能量矩阵。
:rtype: np.ndarray
\ No newline at end of file
paddle\_quantum.biocomputing.operator
==============================================
蛋白质哈密顿量中使用的算符集合。
.. py:function:: edge_direction_indicator(edge, affected_qubits, direction)
用于指示边的方向的算符。
:param edge: 蛋白质中氨基酸-氨基酸之间的边的编号。
:type edge: Tuple[int]
:param affected_qubits: 算符涉及到的量子比特序号。
:type affected_qubits: Optional[List[int]]
:param direction: 边的方向。
:type direction: Optional[int]
:return: 算符对应的符号,边方向指示算符。
:rtype: Tuple[float, Dict]
.. py:function:: contact_indicator(qindex)
蛋白质中指示两个氨基酸是否有相互作用的算符。
:param qindex: 算符影响的量子比特序号。
:type qindex: int
:return: 相互作用算符。
:rtype: openfermion.QubitOperator
.. py:function:: backwalk_indicator(e0_attrs, e1_attrs)
反映边重叠情况的算符。
:param e0_attrs: 给定边上的特征。
:type e0_attrs: Dict
:param e1_attrs: 相邻边上的特征。
:type e1_attrs: Dict
:return: 边重叠算符。
:rtype: openfermion.QubitOperator
\ No newline at end of file
paddle\_quantum.biocomputing.protein
==============================================
量桨中蛋白质结构构建工具。
.. py:function:: _check_valid_aa_seq(aa_seq)
判断一个给定的氨基酸序列标识是否合理。
:param aa_seq: 氨基酸序列。
:type aa_seq: str
:return: 返回一个氨基酸序列格式是否正确。
:rtype: bool
.. py:function:: _generate_valid_contact_pairs(num_aa)
根据输入的氨基酸数目给出可能发生相互作用的氨基酸对。
:param num_aa: 蛋白质中氨基酸数量。
:type num_aa: int
:return: 在给定情况下可能发生相互作用的氨基酸对的序号。
:rtype: List[Tuple[int]]
.. py:class:: Protein(aa_seqs, fixed_bond_directions, contact_pairs)
基类::py:class:`networkx.Graph`
量桨中用于构建蛋白质结构的类型。
:param aa_seqs: 蛋白质中氨基酸序列。
:type aa_seqs: str
:param fixed_bond_directions: 氨基酸之间确定方向的连接的序号。
:type fixed_bond_directions: Optional[Dict[Tuple,int]]
:param contact_pairs: 发生相互作用的氨基酸对的序号。
:type contact_pairs: Optional[List[Tuple[int]]]
.. py:property:: num_config_qubits()
蛋白质中用来表示结构的量子比特数。
.. py:property:: num_contact_qubits()
蛋白质中用来表示氨基酸之间相互作用的量子比特数。
.. py:property:: num_qubits()
蛋白质中的总量子比特数。
.. py:method:: distance_operator(p, q)
蛋白质中第p个和第q个氨基酸之间的距离算符。
:param p: 氨基酸序号。
:type p: int
:param q: 氨基酸序号。
:type q: int
:return: 氨基酸距离算符。
:rtype: openfermion.QubitOperator
.. py:method:: get_protein_hamiltonian(lambda0, lambda1, energy_multiplier)
蛋白质哈密顿量。
:param lambda0: 哈密顿量正则化因子。
:type lambda0: Optional[float]
:param lambda1: 哈密顿量正则化因子。
:type lambda1: Optional[float]
:param energy_multiplier: 能量尺度因子。
:type energy_multiplier: Optional[float]
:return: 蛋白质哈密顿量。
:rtype: paddle_quantum.Hamiltonian
\ No newline at end of file
paddle_quantum.biocomputing
=======================================
\ No newline at end of file
paddle\_quantum.biocomputing
=============================
生物计算模块。
.. rubric:: Submodules
.. toctree::
:maxdepth: 4
paddle_quantum.biocomputing.algorithm
paddle_quantum.biocomputing.data_loader
paddle_quantum.biocomputing.operators
paddle_quantum.biocomputing.protein
paddle_quantum.biocomputing.visualize
paddle\_quantum.biocomputing.visualize
==============================================
蛋白质可视化工具
.. py:function:: visualize_protein_structure(aa_seq, bond_directions, view_angles)
蛋白质结构可视化函数。
:param aa_seq: 氨基酸序列。
:type aa_seq: List[str]
:param bond_directions: 氨基酸之间成键的空间取向。
:type bond_directions: List[int]
:param view_angles: 输出图像的角度。
:type view_angles: Optional[List[float]]
\ No newline at end of file
......@@ -28,10 +28,7 @@ paddle\_quantum.data_analysis.vqr
:return: 返回计算的内积值(支持梯度分析)。
:rtype: paddle.Tensor
.. py:class:: QRegressionModel(data_file, model_name, x_feature,
y_feature, num_variable, init_params,
num_qubits, learning_rate,
iteration, language)
.. py:class:: QRegressionModel(data_file, model_name, x_feature, y_feature, num_variable, init_params, num_qubits, learning_rate, iteration, language)
基类::py:class: `object`
......@@ -90,8 +87,7 @@ paddle\_quantum.data_analysis.vqr
:param new_params: 输入的新参数值。
:type new_params: Union[paddle.Tensor, np.ndarray]
.. py:method:: fit(X, y, learning_rate, iteration,
saved_dir, print_score, model_name)
.. py:method:: fit(X, y, learning_rate, iteration, saved_dir, print_score, model_name)
输入训练集数据用来训练回归模型。
......
......@@ -5,49 +5,52 @@ paddle\_quantum.finance.pricing
.. py:function:: qae_cir(oracle, num_ancilla)
根据给定酉算子搭建一条量子振幅估计电路。
根据给定酉算子搭建一条量子振幅估计电路。
:param oracle: 给定酉算子。
:type oracle: paddle.Tensor
:param num_ancilla: 辅助比特使用数。
:type num_ancilla: int
:param oracle: 给定酉算子。
:type oracle: paddle.Tensor
:param num_ancilla: 辅助比特使用数。
:type num_ancilla: int
:return: 一条用于量子振幅估计的量子电路
:rtype: Circuit
:return: 一条用于量子振幅估计的量子电路
:rtype: Circuit
.. py:function:: qae_alg(oracle, : int)
.. py:function:: qae_alg(oracle, num_ancilla)
量子振幅估计算法。
:param oracle: 一个 :math:`n`-比特酉算子 :math:`\mathcal{A}`。
:type oracle: paddle.Tensor
:param num_ancilla: 辅助比特使用数。
:type num_ancilla: int
:param oracle: 一个 :math:`n`-比特酉算子 :math:`\mathcal{A}`。
:type oracle: paddle.Tensor
:param num_ancilla: 辅助比特使用数。
:type num_ancilla: int
:return: 包含如下元素的 tuple:
- 用于量子振幅估计的量子电路。
- 振幅估计结果,即 :math:`|\sin(2\pi\theta)|`。
:rtype: Tuple[Circuit, paddle.Tensor]
:return:
包含如下元素的 tuple:
.. note::
- 用于量子振幅估计的量子电路。
- 振幅估计结果,即 :math:`|\sin(2\pi\theta)|`。
:rtype: Tuple[Circuit, paddle.Tensor]
:math:`\mathcal{A}` 满足 :math:`\mathcal{A}|0^{\otimes n}\rangle=\cos(2\pi\theta)|0\rangle|\psi\rangle+\sin(2\pi\theta)|1\rangle|\phi\rangle.`
.. note::
:math:`\mathcal{A}` 满足 :math:`\mathcal{A}|0^{\otimes n}\rangle=\cos(2\pi\theta)|0\rangle|\psi\rangle+\sin(2\pi\theta)|1\rangle|\phi\rangle.`
.. py:function:: qmc_alg(fcn, list_prob, num_ancilla=6)
量子蒙特卡洛算法。
量子蒙特卡洛算法。
:param fcn: 应用于随机变量 :math:`X` 的实函数 :math:`f`。
:type fcn: Callable[[float], float]
:param list_prob: 随机变量 :math:`X` 的概率分布,其中第 j 个元素对应第 j 个事件的发生几率。
:type list_prob: List[float]
:param num_ancilla: 辅助比特使用数。默认为 ``6``。
:type num_ancilla: int
:param fcn: 应用于随机变量 :math:`X` 的实函数 :math:`f`。
:type fcn: Callable[[float], float]
:param list_prob: 随机变量 :math:`X` 的概率分布,其中第 j 个元素对应第 j 个事件的发生几率。
:type list_prob: List[float]
:param num_ancilla: 辅助比特使用数。默认为 ``6``。
:type num_ancilla: int
:return: 包含如下元素的 tuple:
- 用于量子蒙特卡洛的量子电路。
- 期望值估计结果,即 :math:`\mathbb{E}[f(X)]`。
:rtype: Tuple[Circuit, paddle.Tensor]
:return:
包含如下元素的 tuple:
- 用于量子蒙特卡洛的量子电路。
- 期望值估计结果,即 :math:`\mathbb{E}[f(X)]`。
:rtype: Tuple[Circuit, paddle.Tensor]
.. py:class:: EuroOptionEstimator(initial_price, strike_price, interest_rate, volatility, maturity_date, degree_of_estimation=5)
......@@ -70,16 +73,15 @@ paddle\_quantum.finance.pricing
.. note::
假设欧式期权定价处于 `Black-Scholes-Merton 模型 <https://en.wikipedia.org/wiki/Black%E2%80%93Scholes_model>`_ 中。
假设欧式期权定价处于 `Black-Scholes-Merton 模型 <https://en.wikipedia.org/wiki/Black%E2%80%93Scholes_model>`_ 中。
.. py:method:: estimate()
使用量子蒙特卡洛算法估算欧式期权定价。
:return: 给定资产的期权定价。
:rtype: float
:return: 给定资产的期权定价。
:rtype: float
.. py:method:: plot()
画出在该方案中使用的量子电路。
\ No newline at end of file
......@@ -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]
......
......@@ -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)
......
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
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]
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
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
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
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
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
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
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
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
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
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
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]
......@@ -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)
......
......@@ -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)
......
......@@ -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:
......
......@@ -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()
......
......@@ -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 = [], []
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册