qml.qchem¶
概述¶
量子化学模块提供了执行哈特里-福克计算的功能,并构造如分子哈密顿量、偶极矩、自旋和粒子数可观察量等可观察量。它还包括与Openfermion的 QubitOperator 和 FermionOperator之间转换的功能。
该子模块提供执行量子化学计算的功能。
函数¶
|
为给定数量的活跃电子和活跃轨道构建活跃空间。 |
|
为一个原子生成默认基组参数。 |
|
返回一个计算两个收缩高斯函数之间核吸引积分的函数。 |
|
返回一个计算给定基函数集的电子-核吸引矩阵的函数。 |
|
返回分组的分子哈密顿量的系数和可观测量,以及通过基旋转分组方法获得的基旋转算子。 |
|
根据一组生成元和保利-X算符计算一个克利福德算符。 |
|
计算收敛高斯函数的归一化常数。 |
|
返回一个计算给定基函数集合的核心矩阵的函数。 |
|
使用OpenFermion工具将分子哈密顿量分解为泡利算符的线性组合。 |
|
返回一个计算量子比特哈密顿量的函数。 |
|
返回一个计算分子轨道上偶极矩积分的函数。 |
|
返回一个计算量子比特偶极矩可观察量的函数。 |
|
计算泡利基中的电偶极矩算符。 |
|
返回一个计算分子轨道基中一电子和二电子积分的函数。 |
|
计算四个原始高斯函数之间的电子-电子排斥积分。 |
|
从哈特利-福克参考态生成单激发和双激发。 |
|
将通过函数 |
|
递归计算两个高斯函数的赫米特高斯展开系数。 |
|
返回空间基中的双因子的两个电子积分张量的形式。 |
|
返回一个构建费米子偶极矩可观测量的函数。 |
|
返回一个计算费米哈密顿量的函数。 |
|
根据分子轨道积分创建费米子可观测量。 |
|
将 OpenFermion FermionOperator 转换为 PennyLane |
|
计算两个原始高斯函数的动能积分。 |
|
计算两个原始高斯函数的二维多极矩积分。 |
|
计算两个原始高斯函数的重叠积分。 |
|
将一个酉矩阵分解为一系列带相位偏移的Givens旋转门和一个对角相位矩阵。 |
|
递归计算 Hermite 矩(moment) 积分。 |
|
返回一个计算哈特里-福克能量的函数。 |
|
根据选择的基准生成哈特里-福克态矢量。 |
|
将外部波函数转换为状态向量。 |
|
返回一个计算两个收缩高斯函数的动积分的函数。 |
|
返回一个计算给定基函数集的动量矩阵的函数。 |
|
从基础集交换库提取基础集数据。 |
|
局部化振动正常模式。 |
|
生成一个文件,从中可以获取分子的均场电子结构。 |
|
为分子生成默认的基组参数。 |
|
从PubChem数据库获取化合物的符号和几何信息。 |
|
计算分子密度矩阵。 |
|
在保利基中生成分子的偶极矩算符。 |
|
生成分子的量子比特哈密顿量。 |
|
返回一个函数,该函数计算两个收敛高斯函数的多极矩积分。 |
|
返回一个计算一组基函数的多极矩阵的函数。 |
|
计算原始高斯函数之间的核吸引积分。 |
|
返回一个计算核斥能量的函数。 |
|
构建可以在PennyLane中测量期望值的费米子多体可观测量。 |
|
生成表示给定单粒子算符的FermionOperator,该算符用于构建多体量子比特可观测量。 |
|
获取包含基态的最佳扇区。 |
|
计算分子的平衡几何结构。 |
|
返回一个函数,计算两个收缩高斯函数的重叠积分。 |
|
返回一个计算给定基函数集合的重叠矩阵的函数。 |
|
在泡利基底中计算粒子数可观察量 \(\hat{N}=\sum_\alpha \hat{n}_\alpha\)。 |
|
计算原始高斯函数的归一化常数。 |
|
将费米子可观测量转换为PennyLane量子比特可观测量。 |
|
从文件中读取多原子系统的结构,并返回一个包含分子中原子符号的列表和一个包含它们位置的1D数组 \([x_1, y_1, z_1, x_2, y_2, z_2, \dots]\),单位为原子单位(波尔半径 = 1)。 |
|
返回一个计算四个收缩高斯函数之间电子-电子斥力积分的函数。 |
|
返回一个计算给定基函数集的电子排斥张量的函数。 |
|
返回一个执行自洽场计算的函数。 |
|
计算总自旋可观察量 \(\hat{S}^2\)。 |
|
计算总自旋投影可观测量 \(\hat{S}_z\)。 |
|
对电子积分执行块不变对称性移位。 |
|
使用Clifford算子变换Hartree-Fock状态,然后收缩量子比特。 |
|
使用克利福德算子变换一个门操作,然后收缩量子位。 |
|
返回泰勒玻色子振动哈密顿量。 |
|
计算泰勒振动哈密顿量的拟合系数。 |
|
计算泰勒偶极算子的拟合系数。 |
|
返回泰勒振动哈密顿量。 |
|
将PennyLane运算符转换为OpenFermion QubitOperator或FermionOperator。 |
|
生成表示给定双粒子算符的FermionOperator,以构建多体量子比特可观察量。 |
|
生成振动自洽场旋转积分。 |
类¶
|
创建一个基函数对象。 |
|
创建一个分子对象,用于存储分子信息和默认基态参数。 |
|
数据类,用于保存沿振动正常模式计算的潜在能量表面信息。 |
可微分哈特里-福克¶
可微哈特里-福克 (HF) 求解器允许执行可微 HF 计算,并同时计算相对于分子几何、基组和电路参数的精确梯度,使用的技术是 Autograd 中可用的自动微分技术。这使得该求解器比主要依赖数值方法计算梯度的非可微工具更具多功能性和稳健性,因为后者可能导致不准确和不稳定。此外,优化基组参数可以在不增加基组大小的情况下达到更低的基态能量。总体而言,该求解器允许用户执行量子化学的端到端可微算法。
可微分的HF求解器计算基函数上的积分,构建相关矩阵,并执行自洽场迭代以获取一组优化的分子轨道系数。这些系数和计算的基函数上的积分用于构建分子轨道基中的一体和二体电子积分,这可以用于生成可微分的二次量子化哈密顿量和在费米子及量子比特基中的偶极矩。
以下代码展示了氢分子的哈密顿量的构建,其中分子的几何形状和基集参数都是可微分的。
import pennylane as qml
from pennylane import numpy as np
symbols = ["H", "H"]
# This initial geometry is suboptimal and will be optimized by the algorithm
geometry = np.array([[0.0, 0.0, 0.0], [0.0, 0.0, 2.0]], requires_grad=True)
# The exponents and contraction coefficients of the Gaussian basis functions
alpha = np.array([[3.42525091, 0.62391373, 0.1688554],
[3.42525091, 0.62391373, 0.1688554]], requires_grad = True)
coeff = np.array([[0.15432897, 0.53532814, 0.44463454],
[0.15432897, 0.53532814, 0.44463454]], requires_grad = True)
然后我们构造哈密顿量。
args = [geometry, alpha, coeff] # initial values of the differentiable parameters
molecule = qml.qchem.Molecule(symbols, geometry, alpha=alpha, coeff=coeff)
hamiltonian, qubits = qml.qchem.molecular_hamiltonian(molecule, args=args)
>>> print(hamiltonian)
-0.3596823592263396 * I(0) + 0.1308241430372839 * Z(0) + -0.11496335836158356 * Z(2)+ 0.10316898251630022 * (Z(0) @ Z(2)) + 0.1308241430372839 * Z(1) + 0.15405495855812648 * (Z(0) @ Z(1)) + 0.050130617426473734 * (Y(0) @ X(1) @ X(2) @ Y(3)) + -0.050130617426473734 * (Y(0) @ Y(1) @ X(2) @ X(3)) + -0.050130617426473734 * (X(0) @ X(1) @ Y(2) @ Y(3)) + 0.050130617426473734 * (X(0) @ Y(1) @ Y(2) @ X(3)) + -0.11496335836158356 * Z(3) + 0.15329959994277395 * (Z(0) @ Z(3)) + 0.10316898251630022 * (Z(1) @ Z(3)) + 0.15329959994277395 * (Z(1) @ Z(2)) + 0.16096866639866414 * (Z(2) @ Z(3))
生成的哈密顿量可以在一个电路中使用,其中分子几何、基组参数和电路参数是同时优化的。关于使用PennyLane进行分子几何优化的更多信息,请参见这篇 论文和这个 演示。
dev = qml.device("default.qubit", wires=4)
hf_state = np.array([1, 1, 0, 0])
params = [np.array([0.0], requires_grad=True)] # initial values of the circuit parameters
def generate_circuit(mol):
@qml.qnode(dev)
def circuit(*args):
qml.BasisState(hf_state, wires=[0, 1, 2, 3])
qml.DoubleExcitation(*args[0][0], wires=[0, 1, 2, 3])
return qml.expval(qml.qchem.molecular_hamiltonian(mol, args=args[1:])[0])
return circuit
现在电路已经定义,我们可以创建一个几何体和参数优化循环。为了方便,我们创建一个分子对象,用于存储分子参数。
for n in range(21):
mol = qml.qchem.Molecule(symbols, geometry, alpha=alpha, coeff=coeff)
args = [params, geometry, alpha, coeff] # initial values of the differentiable parameters
# compute gradients with respect to the circuit parameters and update the parameters
g_params = qml.grad(generate_circuit(mol), argnum = 0)(*args)
params = params - 0.25 * g_params[0]
# compute gradients with respect to the nuclear coordinates and update geometry
g_coor = qml.grad(generate_circuit(mol), argnum = 1)(*args)
geometry = geometry - 0.5 * g_coor
# compute gradients with respect to the Gaussian exponents and update the exponents
g_alpha = qml.grad(generate_circuit(mol), argnum = 2)(*args)
alpha = alpha - 0.25 * g_alpha
# compute gradients with respect to the Gaussian contraction coefficients and update them
g_coeff = qml.grad(generate_circuit(mol), argnum = 3)(*args)
coeff = coeff - 0.25 * g_coeff
if n%5 == 0:
print(f'Step: {n}, Energy: {generate_circuit(mol)(*args)}, Maximum Absolute Force: {abs(g_coor).max()}')
运行此优化后,我们在原子单位中得到以下输出:
Step: 0, Energy: -1.0491709019856188, Maximum Absolute Force: 0.1580194718925249
Step: 5, Energy: -1.1349862621177522, Maximum Absolute Force: 0.037660768852544046
Step: 10, Energy: -1.1399960666483346, Maximum Absolute Force: 0.005175323916673413
Step: 15, Energy: -1.140321384816611, Maximum Absolute Force: 0.0004138319900744425
Step: 20, Energy: -1.1403680839339787, Maximum Absolute Force: 8.223248376348913e-06
请注意,计算得到的能量低于未优化基组参数得到的全配置相互作用能量,-1.1373060483 哈特里。
HF求解器的组件也可以单独求导。例如,重叠积分可以针对基组参数进行求导,如下所示
symbols = ["H", "H"]
geometry = np.array([[0.0, 0.0, 0.0], [0.0, 0.0, 2.0]], requires_grad=False)
alpha = np.array([[3.42525091, 0.62391373, 0.1688554],
[3.42525091, 0.62391373, 0.1688554]], requires_grad = True)
coeff = np.array([[0.15432897, 0.53532814, 0.44463454],
[0.15432897, 0.53532814, 0.44463454]], requires_grad = True)
mol = qml.qchem.Molecule(symbols, geometry, alpha=alpha, coeff=coeff)
args = [alpha, coeff]
a = mol.basis_set[0]
b = mol.basis_set[1]
g_alpha = qml.grad(qml.qchem.overlap_integral(a, b), argnum = 0)(*args)
g_coeff = qml.grad(qml.qchem.overlap_integral(a, b), argnum = 1)(*args)
>>> print(g_alpha)
[[ 0.00169332 -0.14826928 -0.37296693]
[ 0.00169332 -0.14826928 -0.37296693]]
OpenFermion-PySCF 后端¶
函数 molecular_hamiltonian() 也可以用来构建分子哈密顿量,使用不需要微分的后端,如OpenFermion-PySCF 插件或电子结构软件包 PySCF。可以通过在 molecular_hamiltonian 中设置 method='openfermion' 或 method='pyscf' 来选择不需要微分的后端:
import pennylane as qml
from pennylane import numpy as np
symbols = ["H", "H"]
geometry = np.array([[0.0, 0.0, 0.0], [0.0, 0.0, 2.0]])
molecule = qml.qchem.Molecule(symbols, geometry, charge=0, mult=1, basis_name='sto-3g')
hamiltonian, qubits = qml.qchem.molecular_hamiltonian(molecule, method='pyscf')
非可微分后端要求用户安装OpenFermion-PySCF或PySCF
pip install openfermionpyscf
pip install pyscf