VQE_EN.ipynb 58.2 KB
Newer Older
Q
Quleaf 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Variational Quantum Eigensolver\n",
    "\n",
    "<em> Copyright (c) 2021 Institute for Quantum Computing, Baidu Inc. All Rights Reserved. </em>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Overview\n",
    "\n",
Q
Quleaf 已提交
18
    "It is widely believed that one of the most promising applications of quantum computing in the near future is solving quantum chemistry problems [1-2]. **Variational Quantum Eigensolver** (VQE) is a strong proof to this possibility of studying quantum chemistry with **Noisy Intermediate-Scale Quantum** (NISQ) devices [1-4]. The core task is to solve the ground state of any molecular Hamiltonian $\\hat{H}$ by preparing a parametrized wave function ansatz $|\\Psi(\\boldsymbol\\theta)\\rangle$ on a quantum computer and adopt classical optimization methods (e.g. gradient descent) to adjust the parameters $\\boldsymbol\\theta$ to minimize the expectation value $\\langle \\Psi(\\boldsymbol\\theta)|\\hat{H}|\\Psi(\\boldsymbol\\theta)\\rangle$. This approach is based on the **Rayleigh-Ritz variational principle**. \n",
Q
Quleaf 已提交
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
    "\n",
    "$$\n",
    "E_0 = \\min_{\\boldsymbol\\theta} \\langle \\Psi(\\boldsymbol\\theta)|\\hat{H}|\\Psi(\\boldsymbol\\theta)\\rangle.\n",
    "\\tag{1}\n",
    "$$\n",
    "\n",
    "where $E_0$ denotes the ground state energy. Numerically, it can be understood as finding the smallest eigenvalue $\\lambda_{\\min}$ of a **discretized** Hamiltonian $H$ (hermitian matrix) and its corresponding eigenvector $|\\Psi_0\\rangle$. How such a discretization can be done on a classical computer belongs to the art of quantum chemistry and is far beyond the scope of this tutorial. We will discuss this part with a few words in the background section. In general, such a Hamiltonian $H$ is expressed as a weighted sum of Pauli spin operators $\\{X,Y,Z\\}$ (native to quantum devices) such that this information can be processed on a quantum computer.\n",
    "\n",
    "$$\n",
    "H = \\sum_k c_k ~ \\bigg( \\bigotimes_{j=0}^{M-1} \\sigma_j^{(k)} \\bigg),\n",
    "\\tag{2}\n",
    "$$\n",
    "\n",
    "where $\\sigma_j^{(k)} \\in \\{I,X,Y,Z\\}$ and $M$ stands for qubit number. We refer this form of Hamiltonian as **Pauli strings**. For example, \n",
    "\n",
    "$$\n",
    "H= 0.12~Y_0 \\otimes I_1-0.04~X_0\\otimes Z_1.\n",
    "\\tag{3}\n",
    "$$\n",
    "\n",
Q
Quleaf 已提交
39
    "In the next section, we will provide a brief review on the electronic structure problem which essentially tells us how to calculate the Hamiltonian $H$. For those who are already familiar with this topic or only interested in how to implement VQE on Paddle Quantum, please skip this part and jump into the illustrative example of hydrogen molecule $H_2$.\n",
Q
Quleaf 已提交
40 41 42 43 44 45 46 47 48 49 50 51
    "\n",
    "## Background: the electronic structure problem\n",
    "\n",
    "In this section, we focus on one of the fundamental problems in quantum chemistry --  **the electronic structure problem**. To be more specific, we are interested in the low lying energy eigenstates of any given molecule. These knowledge could help predict reaction rates and location of stable structures [5]. Suppose a molecule consists of $N_n$ nuclei and $N_e$ electrons, the first quantized (canonical quantization) Hamiltonian operator $\\hat{H}_{mol}$ describing the total energy of this molecular system can be written as\n",
    "\n",
    "$$\n",
    "\\begin{align}\n",
    "\\hat{H}_{\\text{mol}} & = -\\sum_{i}\\frac{\\nabla_{R_i}^2}{2M_i} - \\sum_{i} \\frac{\\nabla_{r_i}^2}{2} -\\sum_{i,j}\\frac{Z_i}{\\lvert R_i - r_j\\lvert} + \\sum_{i,j>i}\\frac{Z_iZ_j}{\\lvert R_i - R_j\\lvert} + \\sum_{i, j>i}\\frac{1}{\\lvert r_i - r_j\\lvert}, \n",
    "\\tag{4}\n",
    "\\end{align}\n",
    "$$\n",
    "\n",
Q
Quleaf 已提交
52
    "where $R_i, M_i,$ and $Z_i$ denote the position, mass and atomic number (the number of protons) of the $i^{th}$ nucleus, and the positions of electrons are $r_i$. The first two sums describe the kinetic energy of nuclei and electrons, respectively. The third sum describes the attractive Coulomb interaction between the positively charged nuclei and the negatively charged electrons. The last two terms represent the repulsive nuclei-nuclei and electron-electron interactions.  Here, the molecular Hamiltonian $\\hat{H}_\\text{mol}$ is already in atomic units of energy, **Hartree**. $1$ Hartree is $[\\hbar^2/(m_ee^2a_0^2)] = 27.2$ eV or $630$ kcal/mol, where $m_e, e,$ and $a_0$ stand for the mass of electron, charge of electron, and Bohr radius. \n",
Q
Quleaf 已提交
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
    "\n",
    "\n",
    "**Note:** The spin-orbit interaction and hyperfine interaction are not considered in this picture. They can be treated as perturbations if necessary. \n",
    "\n",
    "### Born-Oppenheimer approximation\n",
    "\n",
    "Since the nuclei are much heavier than electrons, the electrons will move much faster than the nuclei. It is reasonable to treat the positions of nuclei as fixed, $R_i =$ constants. This is known as the Born-Oppenheimer approximation by decoupling the behavior of nuclei and electrons in time scale. Consequently, the kinetic energy term of nuclei will disappear and the nuclei-nuclei repulsive interaction term can be viewed as an energy shift (independent of electron positions $r_i$). We could derive the electronic Hamiltonian $\\hat{H}_{\\text{electron}}$ as\n",
    "\n",
    "$$\n",
    "\\begin{align}\n",
    "\\hat{H}_{\\text{electron}} & =  - \\sum_{i} \\frac{\\nabla_{r_i}^2}{2} -\\sum_{i,j}\\frac{Z_i}{\\lvert R_i - r_j\\lvert} + \\sum_{i, j>i}\\frac{1}{\\lvert r_i - r_j\\lvert} \n",
    "\\tag{5},\n",
    "\\end{align}\n",
    "$$\n",
    "\n",
    "The energy levels of the electrons in the molecule can be found by solving the time independent Schrödinger equation\n",
Q
Quleaf 已提交
69
    "\n",
Q
Quleaf 已提交
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
    "$$\n",
    "\\hat{H}_{\\text{electron}} |\\Psi_n \\rangle = E_n |\\Psi_n \\rangle,\n",
    "\\tag{6}\n",
    "$$\n",
    "\n",
    "where $n$ stands for the energy level. Notice the electron repulsion terms scale as $N_e(N_e-1)/2$ which means for the Oxygen molecule $O_2$ carrying 16 electrons there will be 120 electron repulsion terms in total! In general, this problem cannot be solved analytically. As Dirac concluded in [Quantum mechanics of many-electron systems](https://royalsocietypublishing.org/doi/10.1098/rspa.1929.0094) [6],\n",
    "\n",
    "> *The underlying physical laws necessary for the mathematical theory of a large part of physics and the whole of chemistry are thus completely known, and the difficulty is only that the exact application of these laws leads to equations much too complicated to be soluble.*                                                                                                                                                                  \n",
    ">\n",
    "> ​\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t-- Paul Dirac (1929)\n",
    "\n",
    "A straightforward numerical approach is discretizing the infinite-dimensional Hilbert space into equidistant grid points where linear algebra guides the whole calculation. Suppose each axis of space is discretized into $k$ points, the $N$-electron (drop the subscript e for simplicity) wave function can be written as [2]\n",
    "\n",
    "$$\n",
    "|\\Psi \\rangle = \\sum_{\\mathbf{x_1}, \\ldots, \\mathbf{x_N}} \\psi(\\mathbf{x_1}, \\ldots, \\mathbf{x_N}) \\mathcal{A}(|\\mathbf{x_1}, \\ldots, \\mathbf{x_N}\\rangle).\n",
    "\\tag{7}\n",
    "$$\n",
    "\n",
    "where coordinate $|\\mathbf{x_j}\\rangle = |r_j\\rangle |\\sigma_j\\rangle$ records the spatial location and spin of the $j^{th}$ electron, $|r_j\\rangle  = |x_j,y_j,z_j\\rangle$ for $j\\in \\{1,2,\\cdots,N\\}$, $x_j,y_j,z_j \\in \\{0,1,\\cdots,k-1\\}$ and  $\\sigma_j \\in \\{\\downarrow,\\uparrow\\}$ for spin down or up.  There will be $k^{3N}\\times 2^{N}$ complex amplitudes in total. Here, $\\mathcal{A}$ denotes anti-symmetrization and a consequence of the Pauli exclusion principle (electrons are fermion), and $\\psi(\\mathbf{x_1}, \\mathbf{x_2}, \\ldots, \\mathbf{x_N})=\\langle\\mathbf{x_1}, \\mathbf{x_2}, \\ldots, \\mathbf{x_N}|\\Psi\\rangle$. One can see that storing such a wave function already requires **exponentially growing memory** with respect to the number of electrons $N$. This would make classical simulation methods based on this naive numerical approach intractable for systems size larger than few tens of electrons. Now, the question becomes can we prepare such a wave function $|\\Psi\\rangle$ directly on a quantum computer and measure the expectation value $E_0$? In the next section, let's take the simplest molecular system -- hydrogen molecule $H_2$ as a concrete example.\n",
    "\n",
    "\n",
    "\n",
Q
Quleaf 已提交
92
    "**Note:** A detailed review on quantum chemistry and existing classical computational methods are far beyond the scope of this tutorial, we refer the enthusiastic readers to the standard textbooks *'Molecular Electronic-Structure Theory'* [5] by Helgaker and *'Modern Quantum Chemistry: Introduction to Advanced Electronic Structure Theory'* [7] by Szabo & Ostlund. To bridge to knowledge gap between quantum chemistry and quantum computing, please check the following review papers [Quantum computational chemistry](https://journals.aps.org/rmp/abstract/10.1103/RevModPhys.92.015003) [2] and [Quantum Chemistry in the Age of Quantum Computing](https://pubs.acs.org/doi/10.1021/acs.chemrev.8b00803) [1].\n",
Q
Quleaf 已提交
93 94 95 96 97 98 99 100
    "\n",
    "**Note:** For energy calculation, it is desired to reach the **chemical accuracy** of $1.6\\times10^{-3}$ Hartree or 1 kcal/mol . "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
Q
Quleaf 已提交
101
    "## Ground state of the hydrogen molecule $H_2$\n",
Q
Quleaf 已提交
102 103 104
    "\n",
    "### Building electronic Hamiltonian\n",
    "\n",
Q
Quleaf 已提交
105 106 107
    "First of all, let us import the necessary libraries and packages.`qchem` module in Paddle Quantum is developed basing on `psi4` and `openfermion`, so you need to install these two packages before executing the following codes. We strongly encourage you to read the tutorial [Building molecular Hamiltonian](./BuildingMolecule_EN.ipynb) first, which introduces how to utilize our quantum chemistry toolkit `qchem`.\n",
    "\n",
    "**Note: As to the environment setting, please refer to [README.md](https://github.com/PaddlePaddle/Quantum/blob/master/README.md).**"
Q
Quleaf 已提交
108 109 110 111
   ]
  },
  {
   "cell_type": "code",
Q
Quleaf 已提交
112
   "execution_count": 8,
Q
Quleaf 已提交
113 114
   "metadata": {
    "ExecuteTime": {
Q
Quleaf 已提交
115 116
     "end_time": "2021-04-30T09:14:44.970178Z",
     "start_time": "2021-04-30T09:14:40.895128Z"
Q
Quleaf 已提交
117 118 119 120
    }
   },
   "outputs": [],
   "source": [
Q
Quleaf 已提交
121 122 123 124 125
    "import paddle\n",
    "import paddle_quantum.qchem as qchem\n",
    "from paddle_quantum.utils import Hamiltonian\n",
    "from paddle_quantum.circuit import UAnsatz\n",
    "\n",
Q
Quleaf 已提交
126 127 128 129 130 131 132
    "import os\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "import numpy\n",
    "from numpy import pi as PI\n",
    "from numpy import savez, zeros\n",
    "\n",
Q
Quleaf 已提交
133 134 135
    "# Eliminate noisy python warnings\n",
    "import warnings\n",
    "warnings.filterwarnings(\"ignore\")"
Q
Quleaf 已提交
136 137 138 139 140 141
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
Q
Quleaf 已提交
142
    "To analyze specific molecules, we need several key information such as **geometry**, **basis set** (such as STO-3G), **multiplicity**, and **charge** to model the molecule and achieve more information about the molecule, such as one-body integrations, two-body integrations, and others. Next, through our built-in quantum chemistry toolkit, we could set a `Hamiltonian` class to carry molecule Hamiltonian information, which may simplify the following calculations."
Q
Quleaf 已提交
143 144 145 146
   ]
  },
  {
   "cell_type": "code",
Q
Quleaf 已提交
147
   "execution_count": 9,
Q
Quleaf 已提交
148 149
   "metadata": {
    "ExecuteTime": {
Q
Quleaf 已提交
150 151
     "end_time": "2021-04-30T09:14:44.982005Z",
     "start_time": "2021-04-30T09:14:44.975892Z"
Q
Quleaf 已提交
152 153 154 155 156 157 158
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
Q
Quleaf 已提交
159
      "FCI energy for H2_sto-3g_singlet (2 electrons) is -1.1372838344855134.\n",
Q
Quleaf 已提交
160
      "\n",
Q
Quleaf 已提交
161
      "The generated h2 Hamiltonian is \n",
Q
Quleaf 已提交
162
      " -0.0970662686176252 I\n",
Q
Quleaf 已提交
163 164 165 166
      "-0.04530261550868938 X0, X1, Y2, Y3\n",
      "0.04530261550868938 X0, Y1, Y2, X3\n",
      "0.04530261550868938 Y0, X1, X2, Y3\n",
      "-0.04530261550868938 Y0, Y1, X2, X3\n",
Q
Quleaf 已提交
167 168 169 170 171 172 173 174 175 176
      "0.1714128263940238 Z0\n",
      "0.16868898168693292 Z0, Z1\n",
      "0.12062523481381847 Z0, Z2\n",
      "0.1659278503225078 Z0, Z3\n",
      "0.17141282639402383 Z1\n",
      "0.1659278503225078 Z1, Z2\n",
      "0.12062523481381847 Z1, Z3\n",
      "-0.22343153674664024 Z2\n",
      "0.17441287610651632 Z2, Z3\n",
      "-0.2234315367466403 Z3\n"
Q
Quleaf 已提交
177 178 179 180
     ]
    }
   ],
   "source": [
Q
Quleaf 已提交
181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197
    "geo = qchem.geometry(structure=[['H', [-0., 0., 0.0]], ['H', [-0., 0., 0.74]]])\n",
    "# geo = qchem.geometry(file='h2.xyz')\n",
    "\n",
    "# Save molecule information in to variable molecule, including one-body integrations, one-body integrations, molecular and Hamiltonian\n",
    "molecule = qchem.get_molecular_data(\n",
    "    geometry=geo,\n",
    "    basis='sto-3g',\n",
    "    charge=0,\n",
    "    multiplicity=1,\n",
    "    method=\"fci\",\n",
    "    if_save=True,\n",
    "    if_print=True\n",
    ")\n",
    "# Recall Hamiltonian\n",
    "molecular_hamiltonian = qchem.spin_hamiltonian(molecule=molecule,\n",
    "                                               filename=None, \n",
    "                                               multiplicity=1, \n",
Q
Quleaf 已提交
198
    "                                               mapping_method='jordan_wigner',)\n",
Q
Quleaf 已提交
199 200
    "# Print results\n",
    "print(\"\\nThe generated h2 Hamiltonian is \\n\", molecular_hamiltonian)"
Q
Quleaf 已提交
201 202 203 204 205 206 207 208
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Note:** This Hamiltonian is generated with an interatomic distance of $d = 74$ pm. \n",
    "\n",
Q
Quleaf 已提交
209
    "In addition to inputting molecular geometry directly, inputting molecular geometry file (.xyz file) is also allowed. For more information about quantum chemistry toolkit, please refer to the tutorial [Building molecular Hamiltonian](./BuildingMolecule_EN.ipynb). If you need to test the geometric configuration of more molecules, please check out this [database](http://smart.sns.it/molecules/index.html)."
Q
Quleaf 已提交
210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Building QNN and trial wave function\n",
    "\n",
    "To implement VQE, we firstly need to design a quantum neural network QNN to prepare the wave function ansatz $|\\Psi(\\boldsymbol\\theta)\\rangle$. Here, we provide a 4-qubit quantum circuit template with a depth of $D$ blocks. The dotted frame in the figure below denotes a single block:\n",
    "\n",
    "\n",
    "![Utheta.jpg](https://release-data.cdn.bcebos.com/PIC%2FUtheta.jpg)\n",
    "\n",
    "Next, we use the `UAnsatz` class and the built-in `real_entangled_layer(theta, D)` circuit template in Paddle Quantum to realize this QNN.\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
Q
Quleaf 已提交
229
   "execution_count": 10,
Q
Quleaf 已提交
230 231
   "metadata": {
    "ExecuteTime": {
Q
Quleaf 已提交
232 233
     "end_time": "2021-04-30T09:14:50.083041Z",
     "start_time": "2021-04-30T09:14:50.062255Z"
Q
Quleaf 已提交
234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253
    }
   },
   "outputs": [],
   "source": [
    "def U_theta(theta, Hamiltonian, N, D):\n",
    "    \"\"\"\n",
    "    Quantum Neural Network\n",
    "    \"\"\"\n",
    "    \n",
    "    # Initialize the quantum neural network according to the number of qubits N\n",
    "    cir = UAnsatz(N)\n",
    "    \n",
    "    # Built-in {R_y + CNOT} circuit template\n",
    "    cir.real_entangled_layer(theta[:D], D)\n",
    "    \n",
    "    # Lay R_y gates in the last row\n",
    "    for i in range(N):\n",
    "        cir.ry(theta=theta[D][i][0], which_qubit=i)\n",
    "        \n",
    "    # The quantum neural network acts on the default initial state |0000>\n",
Q
Quleaf 已提交
254
    "    fin_state = cir.run_state_vector()\n",
Q
Quleaf 已提交
255
    "    \n",
Q
Quleaf 已提交
256
    "    # Calculate the expectated value of the given Hamiltonian\n",
Q
Quleaf 已提交
257 258
    "    expectation_val = cir.expecval(Hamiltonian)\n",
    "\n",
Q
Quleaf 已提交
259
    "    return expectation_val, cir, fin_state"
Q
Quleaf 已提交
260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Setting up the loss function and model\n",
    "\n",
    "Now that we have the target Hamiltonian and QNN, we will further define the training model and loss function. By applying the QNN $U(\\theta)$ on the initial state $|0..0\\rangle$, we get the output state $|\\psi(\\boldsymbol\\theta)\\rangle $. Then, the loss function to be minimized is the expectation value, \n",
    "\n",
    "\n",
    "$$\n",
    "\\min_{\\boldsymbol\\theta}  \\mathcal{L}(\\boldsymbol \\theta) = \\min_{\\boldsymbol\\theta} \\langle \\Psi(\\boldsymbol\\theta)|H |\\Psi(\\boldsymbol\\theta)\\rangle\n",
    "= \\min_{\\boldsymbol\\theta} \\sum_k c_k~\\langle \\Psi(\\boldsymbol\\theta)| \\bigotimes_j \\sigma_j^{(k)}|\\Psi(\\boldsymbol\\theta)\\rangle.\n",
    "\\tag{8}\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
Q
Quleaf 已提交
280
   "execution_count": 11,
Q
Quleaf 已提交
281 282
   "metadata": {
    "ExecuteTime": {
Q
Quleaf 已提交
283 284
     "end_time": "2021-04-30T09:14:50.183996Z",
     "start_time": "2021-04-30T09:14:50.167892Z"
Q
Quleaf 已提交
285 286 287 288
    }
   },
   "outputs": [],
   "source": [
Q
Quleaf 已提交
289
    "class StateNet(paddle.nn.Layer):\n",
Q
Quleaf 已提交
290 291 292
    "    \"\"\"\n",
    "    Construct the model net\n",
    "    \"\"\"\n",
Q
Quleaf 已提交
293
    "\n",
Q
Quleaf 已提交
294
    "    def __init__(self, shape, dtype=\"float64\"):\n",
Q
Quleaf 已提交
295 296
    "        super(StateNet, self).__init__()\n",
    "        \n",
Q
Quleaf 已提交
297
    "        # Initialize the list of theta parameters, filling the initial values with a uniform distribution of [0, 2* PI]  \n",
Q
Quleaf 已提交
298 299 300
    "        self.theta = self.create_parameter(shape=shape, \n",
    "                                           default_initializer=paddle.nn.initializer.Uniform(low=0.0, high=2*PI),\n",
    "                                           dtype=dtype, is_bias=False)\n",
Q
Quleaf 已提交
301 302 303 304
    "        \n",
    "    # Define loss function and forward propagation mechanism\n",
    "    def forward(self, N, D):\n",
    "        \n",
Q
Quleaf 已提交
305 306
    "        # Calculate loss function/expected value\n",
    "        loss, cir, fin_state = U_theta(self.theta, molecular_hamiltonian.pauli_str, N, D)\n",
Q
Quleaf 已提交
307
    "\n",
Q
Quleaf 已提交
308
    "        return loss, cir, fin_state"
Q
Quleaf 已提交
309 310 311 312 313 314 315 316 317 318 319 320 321
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Hyper-parameters\n",
    "\n",
    "Before training the QNN, we also need to set some training hyper-parameters, mainly the learning rate (LR), the number of iterations (ITR), and the depth (D) of repeated blocks. "
   ]
  },
  {
   "cell_type": "code",
Q
Quleaf 已提交
322
   "execution_count": 12,
Q
Quleaf 已提交
323 324
   "metadata": {
    "ExecuteTime": {
Q
Quleaf 已提交
325 326
     "end_time": "2021-04-30T09:14:50.222465Z",
     "start_time": "2021-04-30T09:14:50.187093Z"
Q
Quleaf 已提交
327 328 329 330
    }
   },
   "outputs": [],
   "source": [
Q
Quleaf 已提交
331 332
    "ITR = 80  # Set the number of optimization iterations\n",
    "LR = 0.4   # Set the learning rate\n",
Q
Quleaf 已提交
333 334
    "D = 2      # Set the depth of the repetitive calculation module in QNN\n",
    "N = molecular_hamiltonian.n_qubits # Set number of qubits"
Q
Quleaf 已提交
335 336 337 338 339 340 341 342
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Training\n",
    "\n",
Q
Quleaf 已提交
343
    "After all the training model parameters are set, we convert the data into Tensor in the Paddle, and then train the quantum neural network. The results of the training process is stored in the summary_data file.\n"
Q
Quleaf 已提交
344 345 346 347
   ]
  },
  {
   "cell_type": "code",
Q
Quleaf 已提交
348
   "execution_count": 13,
Q
Quleaf 已提交
349 350
   "metadata": {
    "ExecuteTime": {
Q
Quleaf 已提交
351 352
     "end_time": "2021-04-30T09:15:52.165788Z",
     "start_time": "2021-04-30T09:15:29.625076Z"
Q
Quleaf 已提交
353 354 355 356 357 358 359
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
Q
Quleaf 已提交
360 361 362 363 364 365 366 367
      "iter: 20 loss: -1.0487\n",
      "iter: 20 Ground state energy: -1.0487 Ha\n",
      "iter: 40 loss: -1.1070\n",
      "iter: 40 Ground state energy: -1.1070 Ha\n",
      "iter: 60 loss: -1.1152\n",
      "iter: 60 Ground state energy: -1.1152 Ha\n",
      "iter: 80 loss: -1.1165\n",
      "iter: 80 Ground state energy: -1.1165 Ha\n",
Q
Quleaf 已提交
368
      "\n",
Q
Quleaf 已提交
369
      "Circuit after training:\n",
Q
Quleaf 已提交
370
      "--Ry(4.725)----*--------------x----Ry(-0.01)----*--------------x----Ry(-1.56)--\n",
Q
Quleaf 已提交
371
      "               |              |                 |              |               \n",
Q
Quleaf 已提交
372
      "--Ry(4.718)----x----*---------|----Ry(3.132)----x----*---------|----Ry(4.703)--\n",
Q
Quleaf 已提交
373
      "                    |         |                      |         |               \n",
Q
Quleaf 已提交
374
      "--Ry(4.720)---------x----*----|----Ry(3.124)---------x----*----|----Ry(4.721)--\n",
Q
Quleaf 已提交
375
      "                         |    |                           |    |               \n",
Q
Quleaf 已提交
376
      "--Ry(1.574)--------------x----*----Ry(6.291)--------------x----*----Ry(1.552)--\n",
Q
Quleaf 已提交
377
      "                                                                               \n"
Q
Quleaf 已提交
378 379 380 381
     ]
    }
   ],
   "source": [
Q
Quleaf 已提交
382
    "# Determine the parameter dimensions of the network \n",
Q
Quleaf 已提交
383
    "net = StateNet(shape=[D + 1, N, 1])\n",
Q
Quleaf 已提交
384
    "\n",
Q
Quleaf 已提交
385 386
    "# In general, we use the Adam optimizer to obtain relatively good convergence,\n",
    "# Of course you can change it to SGD or RMS prop.\n",
Q
Quleaf 已提交
387
    "opt = paddle.optimizer.Adam(learning_rate=LR, parameters=net.parameters())\n",
Q
Quleaf 已提交
388
    "\n",
Q
Quleaf 已提交
389 390 391
    "# Record optimization results\n",
    "summary_iter, summary_loss = [], []\n",
    "\n",
Q
Quleaf 已提交
392
    "# Optimize iterations\n",
Q
Quleaf 已提交
393 394
    "for itr in range(1, ITR + 1):\n",
    "\n",
Q
Quleaf 已提交
395 396
    "    # Forward propagation calculates the loss function\n",
    "    loss, cir, fin_state = net(N, D)\n",
Q
Quleaf 已提交
397
    "\n",
Q
Quleaf 已提交
398
    "    # Back propagation minimizes the loss function\n",
Q
Quleaf 已提交
399 400 401
    "    loss.backward()\n",
    "    opt.minimize(loss)\n",
    "    opt.clear_grad()\n",
Q
Quleaf 已提交
402
    "\n",
Q
Quleaf 已提交
403
    "    # Update optimization results\n",
Q
Quleaf 已提交
404 405
    "    summary_loss.append(loss.numpy())\n",
    "    summary_iter.append(itr)\n",
Q
Quleaf 已提交
406
    "\n",
Q
Quleaf 已提交
407
    "    # Print results\n",
Q
Quleaf 已提交
408 409 410 411
    "    if itr % 20 == 0:\n",
    "        print(\"iter:\", itr, \"loss:\", \"%.4f\" % loss.numpy())\n",
    "        print(\"iter:\", itr, \"Ground state energy:\", \"%.4f Ha\" \n",
    "                                            % loss.numpy())\n",
Q
Quleaf 已提交
412
    "    if itr == ITR:\n",
Q
Quleaf 已提交
413
    "        print(\"\\nCircuit after training:\") \n",
Q
Quleaf 已提交
414
    "        print(cir)\n",
Q
Quleaf 已提交
415
    "\n",
Q
Quleaf 已提交
416
    "# Save the training results in the Output folder\n",
Q
Quleaf 已提交
417 418 419
    "os.makedirs(\"output\", exist_ok=True)\n",
    "savez(\"./output/summary_data\", iter = summary_iter, \n",
    "                               energy=summary_loss)"
Q
Quleaf 已提交
420 421 422 423 424 425 426
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Benchmarking\n",
Q
Quleaf 已提交
427
    "We have now completed the training of the quantum neural network, and the estimated value of the ground state energy obtained is $E_0 \\approx -1.137 $ Hartree. The estimation obtained with VQE is consistent with the value of the ground state energy $E_0 = -1.13728$ Hartree calculated by `Psi4` at sto-3g basis using the full configuration-interaction (FCI) method within the chemical accuracy $\\varepsilon = 1.6 \\times 10^{-3}$ Hartree.\n"
Q
Quleaf 已提交
428 429 430 431
   ]
  },
  {
   "cell_type": "code",
Q
Quleaf 已提交
432
   "execution_count": 14,
Q
Quleaf 已提交
433 434
   "metadata": {
    "ExecuteTime": {
Q
Quleaf 已提交
435 436
     "end_time": "2021-04-30T09:15:18.096944Z",
     "start_time": "2021-04-30T09:15:17.481250Z"
Q
Quleaf 已提交
437 438 439 440 441
    }
   },
   "outputs": [
    {
     "data": {
Q
Quleaf 已提交
442
      "image/png": "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MamiGJaqM3VYSk83bh1ERFUsKCgIQgicOnUKAFC3bl3Y2dlh2bJlOHToEKytrZGZmYnnn38egYGBePbZZwEAvXv3xuXLlzW9M88++yyysrKwcOFCREdH49///jd+/fVXrF69utgxjxw5gueee67UmsLDw2FhYaG5ZKaWm5uLS5cu6RyvVNH6y3MOpdW/c+dODB48uNTa6PEYlqozdVhKTTVuHUREVczCwgIDBgzAjh07AACOjo746aefcODAAQwZMgS5ubno27cvunTpgt27d0OhUAAAWrdujQ4dOuCnn34CIL9ev27dOqxevRotW7bEyZMncfToUfj6+modLysrC9u3b8eECRNKrens2bNo0qQJHNW/m//flStXkJ2drTMsVbT+sp5DafVHR0cjMjISffr0KbU2KgNBlZacnCwAiOTkZP3u+PZtIQYMEGLkSP3ul4hqhMzMTHHlyhWRmZlp7FIqZMeOHSIgIKBY+0svvSReeukloVKpStxu165dIiAgQOTn55f5WF999ZXo1auXVtvBgweFn59fuWouy7ZVVb8QQixfvlw899xzZd6POdL130FZ/36zZ6k6U9/uJD29QrPfEhGZsl69eiEmJgY3b97Uao+MjERgYKCmN6ao/v37Y+LEibh7926Zj2VtbY2VK1dWqt6yqsr6d+7ciUGDBlW4VpI42qs6U3f1CgFkZBSEJyKiGsDOzg7pRcZs5uXl4fLly8XGDRU1bdq0ch3r1VdfLWd1FVPV9e/fv79c+6GSMSxVZzY2csnJkd+IY1giohrOysoKWVlZVXIsf3//coeWx21blfWT/vAyXHXH6QOIiIzCEGGJTBPDUnXHsERERGRUDEvVHcMSERGRUTEsVXcMS0REREbFsFTdMSwREREZFcNSdcewREREZFQMS9UdwxIREZFRMSxVdwxLREQmY+7cuY+dcJJMD8NSdcewREQ1UHx8PKZOnYrGjRvD1tYWnp6e6Nq1K1avXo2MjAxjl2cwY8aMwZAhQ8q9HUOaYXEG7+qOYYmIapi///4bXbt2haurKz799FO0bt0aSqUSFy9exDfffIO6deuWer+z3NxcWFtbV3HFVFn5+flQKBSwsKiefTjVsyoqwLBERDXMG2+8ASsrK5w5cwbDhw9HQEAAGjZsiMGDB2P37t0YOHCgZl2FQoHVq1dj0KBBcHBwwIIFCwAA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p6drAtmxY8dgYWFR7PMlIokDvInosVq3bo2QkBCsWLFCq71Hjx64f/8+PvvsM0RFRWHVqlX4/fff9XbcVatWYdu2bbh27RomT56MR48eYdy4cQCAyZMnIzExES+99BJOnz6NqKgo7N27F2PHjn1sYChq5syZWLRoETZv3ozIyEjMmjULERERmDp1aqXq9/f3x19//YW7d+9qvqX33nvv4fjx45gyZQoiIiJw48YN7Nixo9gA66KaNGmC27dvY9OmTYiKisKKFSuwbdu2YseLjo5GREQEHjx4gOzs7GL7CQkJga2tLUaPHo1Lly7h4MGDePPNN/Gvf/1LcwmOiLQxLBFRmXzyySfFLsMEBATgq6++wqpVq9C2bVuEhYVVamxTUQsXLsTChQvRtm1bHD16FDt37kSdOnUAQNMblJ+fj+eeew6tW7fGtGnT4OrqqjU+qizeeustvP3225gxYwZat26NPXv2YOfOnWjSpEml6v/kk09w69YtNGrUCO7u7gCANm3a4PDhw7h+/TqeeuoptG/fHh9//DF8fHx07mvQoEGYPn06pkyZgnbt2uH48eOab8mpDR06FH369MEzzzwDd3d3/O9//yu2H3t7e+zduxeJiYl44okn8OKLL6Jnz5748ssvK3WuROZMIYoOOCAiIiIiDfYsEREREenAsERERESkA8MSERERkQ4MS0REREQ6MCwRERER6cCwRERERKQDwxIRERGRDgxLRERERDowLBERERHpwLBEREREpAPDEhEREZEO/wcgLtckls/ftwAAAABJRU5ErkJggg==",
Q
Quleaf 已提交
443
      "text/plain": [
Q
Quleaf 已提交
444
       "<Figure size 640x480 with 1 Axes>"
Q
Quleaf 已提交
445 446
      ]
     },
Q
Quleaf 已提交
447
     "metadata": {},
Q
Quleaf 已提交
448 449 450 451 452 453 454
     "output_type": "display_data"
    }
   ],
   "source": [
    "result = numpy.load('./output/summary_data.npz')\n",
    "\n",
    "eig_val, eig_state = numpy.linalg.eig(\n",
Q
Quleaf 已提交
455
    "                     molecular_hamiltonian.construct_h_matrix())\n",
Q
Quleaf 已提交
456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475
    "min_eig_H = numpy.min(eig_val.real)\n",
    "min_loss = numpy.ones([len(result['iter'])]) * min_eig_H\n",
    "\n",
    "plt.figure(1)\n",
    "func1, = plt.plot(result['iter'], result['energy'], \n",
    "                  alpha=0.7, marker='', linestyle=\"-\", color='r')\n",
    "func_min, = plt.plot(result['iter'], min_loss, \n",
    "                  alpha=0.7, marker='', linestyle=\":\", color='b')\n",
    "plt.xlabel('Number of iteration')\n",
    "plt.ylabel('Energy (Ha)')\n",
    "\n",
    "plt.legend(handles=[\n",
    "    func1,\n",
    "    func_min\n",
    "],\n",
    "    labels=[\n",
    "        r'$\\left\\langle {\\psi \\left( {\\theta } \\right)} '\n",
    "        r'\\right|H\\left| {\\psi \\left( {\\theta } \\right)} \\right\\rangle $',\n",
    "        'Ground-state energy',\n",
    "    ], loc='best')\n",
Q
Quleaf 已提交
476
    "plt.text(-15.5, -1.145, f'{min_eig_H:.5f}', fontsize=10, color='b')\n",
Q
Quleaf 已提交
477 478 479 480 481 482 483 484 485 486 487 488
    "#plt.savefig(\"vqe.png\", bbox_inches='tight', dpi=300)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Determining the interatomic distance\n",
    "\n",
    "Recall the above calculation is done with an interatomic distance $d = 74$ pm between two hydrogen atoms. Another interesting aspect we can try with VQE is determining the true interatomic distance by modifying the `h2.xyz` file. The results are summarize in figure below,\n",
    "\n",
Q
Quleaf 已提交
489
    "![vqe-fig-dist](figures/vqe-fig-distance.png)\n",
Q
Quleaf 已提交
490
    "\n",
Q
Quleaf 已提交
491
    "The lowest value is found around $d = 74$ pm (1 pm = $1\\times 10^{-12}$m), which is consistent with the [experimental data](https://cccbdb.nist.gov/exp2x.asp?casno=1333740&charge=0) $d_{exp} (H_2) = 74.14$ pm."
Q
Quleaf 已提交
492 493 494 495 496 497 498 499 500 501
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "_______\n",
    "\n",
    "## References\n",
    "\n",
Q
Quleaf 已提交
502
    "[1] Cao, Yudong, et al. Quantum Chemistry in the Age of Quantum Computing. [Chemical reviews 119.19 (2019): 10856-10915.](https://pubs.acs.org/doi/10.1021/acs.chemrev.8b00803)\n",
Q
Quleaf 已提交
503
    "\n",
Q
Quleaf 已提交
504
    "[2] McArdle, Sam, et al. Quantum computational chemistry. [Reviews of Modern Physics 92.1 (2020): 015003.](https://journals.aps.org/rmp/abstract/10.1103/RevModPhys.92.015003)\n",
Q
Quleaf 已提交
505 506
    "\n",
    "\n",
Q
Quleaf 已提交
507 508 509 510
    "[3] Peruzzo, A. et al. A variational eigenvalue solver on a photonic quantum processor. [Nat. Commun. 5, 4213 (2014).](https://www.nature.com/articles/ncomms5213)\n",
    "\n",
    "[4] Moll, Nikolaj, et al. Quantum optimization using variational algorithms on near-term quantum devices. [Quantum Science and Technology 3.3 (2018): 030503.](https://iopscience.iop.org/article/10.1088/2058-9565/aab822)\n",
    "\n",
Q
Quleaf 已提交
511 512
    "[5] Helgaker, Trygve, Poul Jorgensen, and Jeppe Olsen. Molecular electronic-structure theory. John Wiley & Sons, 2014.\n",
    "\n",
Q
Quleaf 已提交
513
    "[6] Dirac, Paul Adrien Maurice. Quantum mechanics of many-electron systems. [Proceedings of the Royal Society of London. Series A, Containing Papers of a Mathematical and Physical Character 123.792 (1929): 714-733.](https://royalsocietypublishing.org/doi/10.1098/rspa.1929.0094)\n",
Q
Quleaf 已提交
514
    "\n",
Q
Quleaf 已提交
515
    "[7] Szabo, Attila, and Neil S. Ostlund. Modern quantum chemistry: introduction to advanced electronic structure theory. Courier Corporation, 2012."
Q
Quleaf 已提交
516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "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",
Q
Quleaf 已提交
535
   "version": "3.8.0"
Q
Quleaf 已提交
536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {
    "height": "calc(100% - 180px)",
    "left": "10px",
    "top": "150px",
    "width": "426.667px"
   },
   "toc_section_display": true,
Q
Quleaf 已提交
553
   "toc_window_display": false
Q
Quleaf 已提交
554 555 556 557 558
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}