{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 利用 Paddle Quantum 的 qchem 模块进行量子化学计算\n", "_Copyright (c) 2021 Institute for Quantum Computing, Baidu Inc. All Rights Reserved._\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "qchem 是基于 Paddle Quantum 推出的用于量子化学研究的工具集。qchem 为量子化学领域的研究者提供了一系列工具,使他们可以利用量子计算方法完成量子化学任务。与此同时,qchem 也提供了方便开发者进行功能拓展的方式。目前,qchem 正处于开发之中,您可以将需求和建议通过 GitHub 的 issue 或 pull request 反馈给我们,我们会及时给出回复。" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## 分子基态能量计算\n", "qchem 为量子化学计算提供了很多便捷的工具。目前,qchem 模块支持下列分子波函数模版线路:\n", "* Hardware Efficient ansatz[1](#refer-1),\n", "* Hartree Fock ansatz[2](#refer-2),\n", "* Unitary Coupled Cluster singles and doubles (UCCSD) ansatz[3](#refer-3).\n", "\n", "让我们从具体的例子出发了解 qchem 的使用方法,下面我们演示了利用 qchem 求解氢分子基态的过程。" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/zl/miniconda3/envs/pq/lib/python3.8/site-packages/openfermion/hamiltonians/hartree_fock.py:11: DeprecationWarning: Please use `OptimizeResult` from the `scipy.optimize` namespace, the `scipy.optimize.optimize` namespace is deprecated.\n", " from scipy.optimize.optimize import OptimizeResult\n", "/home/zl/miniconda3/envs/pq/lib/python3.8/site-packages/paddle/tensor/creation.py:125: DeprecationWarning: `np.object` is a deprecated alias for the builtin `object`. To silence this warning, use `object` by itself. Doing this will not modify any behavior and is safe. \n", "Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations\n", " if data.dtype == np.object:\n", "/home/zl/miniconda3/envs/pq/lib/python3.8/site-packages/paddle/tensor/creation.py:125: DeprecationWarning: `np.object` is a deprecated alias for the builtin `object`. To silence this warning, use `object` by itself. Doing this will not modify any behavior and is safe. \n", "Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations\n", " if data.dtype == np.object:\n" ] } ], "source": [ "import paddle_quantum as pq\n", "from paddle_quantum import qchem as pq_qchem\n", "import warnings\n", "warnings.filterwarnings(\"ignore\")\n", "import logging\n", "logging.basicConfig(level=logging.INFO)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "接下来,我们会利用分子的一些主要性质,包括:分子的几何结构、分子的电荷、计算需要用到的量子化学基函数等,来构建一个 qchem 中的 `Molecule` 类。 " ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# `driver` 用来计算分子中的各种积分\n", "driver = pq_qchem.PySCFDriver()\n", "\n", "# 通过氢分子的性质构造一个 Molecule 类,注:长度单位为埃\n", "mol = pq_qchem.Molecule(\n", " geometry=[(\"H\", [0.0, 0.0, 0.0]), (\"H\", [0.0, 0.0, 0.74])],\n", " basis=\"sto-3g\",\n", " multiplicity=1, \n", " driver=driver\n", ")" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "然后,我们需要为氢分子选择一种波函数模版线路。我们选择 `HardwareEfficient` 作为模版线路。" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:root:\n", "#######################################\n", "Molecule\n", "#######################################\n", "INFO:root:H2\n", "INFO:root:Geometry:\n", "INFO:root:H 0.00000, 0.00000, 0.00000\n", "H 0.00000, 0.00000, 0.74000\n", "INFO:root:Charge: 0\n", "INFO:root:Multiplicity: 1\n", "INFO:root:Unit: Angstrom\n", "INFO:root:\n", "#######################################\n", "SCF Calculation (Classical)\n", "#######################################\n", "INFO:root:Basis: sto-3g\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "converged SCF energy = -1.11675930739643\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:root:SCF energy: -1.11676.\n" ] } ], "source": [ "# 构建 HardwareEfficient 线路.\n", "mol.build()\n", "n_qubits = mol.num_qubits\n", "depth = 2\n", "cir = pq_qchem.HardwareEfficient(n_qubits, depth)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "完成上面的步骤之后,我们可以调用 `GroundStateSolver` 求解器,并利用 PaddlePaddle 中的优化器来训练参数化量子线路。" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "print(type(mol))" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:root:\n", "#######################################\n", "VQE (Ground State)\n", "#######################################\n", "INFO:root:Number of qubits: 4\n", "INFO:root:Ansatz: HardwareEfficient\n", "INFO:root:Optimizer: Adam\n", "INFO:root:\tlearning_rate: 0.5\n", "INFO:root:\n", "Optimization:\n", "INFO:root:\tItr 0, loss=-0.52172.\n", "INFO:root:\tItr 10, loss=-1.05356.\n", "INFO:root:\tItr 20, loss=-1.11600.\n", "INFO:root:\tItr 30, loss=-1.12634.\n", "INFO:root:\tItr 40, loss=-1.13320.\n", "INFO:root:\tItr 50, loss=-1.13628.\n", "INFO:root:Optimization converged after 58 iterations.\n", "INFO:root:The final loss = -1.13636.\n" ] } ], "source": [ "# 选择 paddlepaddle 中的 Adam 优化器\n", "from paddle.optimizer import Adam\n", "\n", "solver = pq_qchem.GroundStateSolver(Adam, num_iterations=100, tol=1e-5, save_every=10)\n", "e, psi = solver.solve(cir, mol, learning_rate=0.5)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "## 参考文献\n", "\n", "[1] Kandala, Abhinav, et al. \"Hardware-efficient variational quantum eigensolver for small molecules and quantum magnets.\" [Nature 549.7671 (2017): 242-246.](https://www.nature.com/articles/nature23879)\n", "\n", "[2] Arute, Frank, et al. \"Hartree-Fock on a superconducting qubit quantum computer.\" [Science 369.6507 (2020): 1084-1089.](https://www.science.org/doi/10.1126/science.abb9811)\n", "\n", "[3] Abhinav, Aspuru-Guzik, et al. \"A Quantum Computing View on Unitary Coupled Cluster Theory\" (https://arxiv.org/abs/2109.15176)" ] } ], "metadata": { "kernelspec": { "display_name": "modellib", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.13" }, "vscode": { "interpreter": { "hash": "8f24120f890011f53feb4ed62c47961d8565ec1de8b7cb23548c15bd6da8f2d2" } } }, "nbformat": 4, "nbformat_minor": 2 }