PaddleQuantum_Qchem_Tutorial_CN.ipynb 16.9 KB
Notebook
Newer Older
Q
Quleaf 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
{
 "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 反馈给我们,我们会及时给出回复。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 分子基态能量计算\n",
Q
Quleaf 已提交
23 24 25 26 27 28
    "qchem 为量子化学计算提供了很多便捷的工具。目前,qchem 模块支持下列分子波函数模版线路:\n",
    "* Hardware Efficient ansatz[<sup>1</sup>](#refer-1),\n",
    "* Slater determinant ansatz[<sup>2</sup>](#refer-2),\n",
    "* Unitary Coupled Cluster singles and doubles (UCCSD) ansatz[<sup>3</sup>](#refer-3).\n",
    "\n",
    "让我们从具体的例子出发了解 qchem 的使用方法,下面我们演示了利用 qchem 求解氢分子基态的过程。"
Q
Quleaf 已提交
29 30 31 32
   ]
  },
  {
   "cell_type": "code",
Q
Quleaf 已提交
33
   "execution_count": 2,
Q
Quleaf 已提交
34 35 36
   "metadata": {},
   "outputs": [],
   "source": [
Q
Quleaf 已提交
37 38 39 40
    "import paddle_quantum as pq\n",
    "from paddle_quantum import qchem as pq_qchem\n",
    "import warnings\n",
    "warnings.filterwarnings(\"ignore\")"
Q
Quleaf 已提交
41 42 43 44 45 46
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
Q
Quleaf 已提交
47
    "接下来,我们需要提供量子化学计算需要用到的一些分子性质,包括:分子的几何结构、分子的电荷、计算需要用到的量子化学基函数等。"
Q
Quleaf 已提交
48 49 50 51
   ]
  },
  {
   "cell_type": "code",
Q
Quleaf 已提交
52
   "execution_count": 3,
Q
Quleaf 已提交
53 54 55
   "metadata": {},
   "outputs": [],
   "source": [
Q
Quleaf 已提交
56 57 58 59 60
    "# 定义氢分子的几何结构,长度单位为埃\n",
    "h2_geometry = \"H 0.0 0.0 0.0; H 0.0 0.0 0.74\"\n",
    "basis_set = \"sto-3g\"\n",
    "multiplicity = 1\n",
    "charge = 0"
Q
Quleaf 已提交
61 62 63 64 65 66
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
Q
Quleaf 已提交
67
    "然后,我们需要为氢分子选择一种波函数模版线路。我们选择 `UCCSDModel` 作为模版线路并且用 `MolEnergyLoss` 作为损失函数。`UCCSDModel` 需要用 Trotter-Suzuki 方法构造其量子线路,关于 Trotter-Suzuki 方法,感兴趣的读者可以阅读这篇[教程](https://qml.baidu.com/tutorials/quantum-simulation/hamiltonian-simulation-with-product-formula.html)。"
Q
Quleaf 已提交
68 69 70 71 72 73 74 75
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
Q
Quleaf 已提交
76 77 78 79
    "# 构建 UCCSD 线路.\n",
    "n_qubits = 4\n",
    "n_electrons = 2\n",
    "uccsd_ansatz = pq_qchem.UCCSDModel(n_qubits, n_electrons, n_trotter_steps=3)\n",
Q
Quleaf 已提交
80
    "\n",
Q
Quleaf 已提交
81 82
    "# 设置损失函数\n",
    "loss_fn = pq_qchem.MolEnergyLoss(h2_geometry, basis_set)"
Q
Quleaf 已提交
83 84 85 86 87 88
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
Q
Quleaf 已提交
89
    "完成上面的步骤之后,我们可以按照[教程](https://qml.baidu.com/tutorials/quantum-simulation/variational-quantum-eigensolver.html)中的方法利用 paddlepaddle 中的优化器来训练参数化量子线路。"
Q
Quleaf 已提交
90 91 92
   ]
  },
  {
Q
Quleaf 已提交
93 94
   "cell_type": "code",
   "execution_count": 5,
Q
Quleaf 已提交
95
   "metadata": {},
Q
Quleaf 已提交
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The iter is   0, loss is 0.71510.\n",
      "The iter is   1, loss is 0.63558.\n",
      "The iter is   2, loss is 0.13140.\n",
      "The iter is   3, loss is -0.20547.\n",
      "The iter is   4, loss is -0.59966.\n",
      "The iter is   5, loss is -0.30310.\n",
      "The iter is   6, loss is -0.69676.\n",
      "The iter is   7, loss is -0.75225.\n",
      "The iter is   8, loss is -0.75798.\n",
      "The iter is   9, loss is -0.92072.\n",
      "The iter is  10, loss is -0.89658.\n",
      "The iter is  11, loss is -0.90863.\n",
      "The iter is  12, loss is -0.96792.\n",
      "The iter is  13, loss is -0.95464.\n",
      "The iter is  14, loss is -0.96280.\n",
      "The iter is  15, loss is -1.00236.\n",
      "The iter is  16, loss is -1.02617.\n",
      "The iter is  17, loss is -1.06962.\n",
      "The iter is  18, loss is -1.06430.\n",
      "The iter is  19, loss is -1.04589.\n",
      "The iter is  20, loss is -1.06411.\n",
      "The iter is  21, loss is -1.05254.\n",
      "The iter is  22, loss is -1.04040.\n",
      "The iter is  23, loss is -1.07904.\n",
      "The iter is  24, loss is -1.10329.\n",
      "The iter is  25, loss is -1.09534.\n",
      "The iter is  26, loss is -1.10908.\n",
      "The iter is  27, loss is -1.10671.\n",
      "The iter is  28, loss is -1.09553.\n",
      "The iter is  29, loss is -1.11231.\n",
      "The iter is  30, loss is -1.11247.\n",
      "The iter is  31, loss is -1.11016.\n",
      "The iter is  32, loss is -1.12201.\n",
      "The iter is  33, loss is -1.12010.\n",
      "The iter is  34, loss is -1.11167.\n",
      "The iter is  35, loss is -1.12422.\n",
      "The iter is  36, loss is -1.12399.\n",
      "The iter is  37, loss is -1.12124.\n",
      "The iter is  38, loss is -1.12681.\n",
      "The iter is  39, loss is -1.12666.\n",
      "The iter is  40, loss is -1.12503.\n",
      "The iter is  41, loss is -1.13086.\n",
      "The iter is  42, loss is -1.13036.\n",
      "The iter is  43, loss is -1.13068.\n",
      "The iter is  44, loss is -1.13146.\n",
      "The iter is  45, loss is -1.13127.\n",
      "The iter is  46, loss is -1.13295.\n",
      "The iter is  47, loss is -1.13266.\n",
      "The iter is  48, loss is -1.13277.\n",
      "The iter is  49, loss is -1.13409.\n",
      "The iter is  50, loss is -1.13268.\n",
      "The iter is  51, loss is -1.13372.\n",
      "The iter is  52, loss is -1.13478.\n",
      "The iter is  53, loss is -1.13374.\n",
      "The iter is  54, loss is -1.13571.\n",
      "The iter is  55, loss is -1.13538.\n",
      "The iter is  56, loss is -1.13525.\n",
      "The iter is  57, loss is -1.13623.\n",
      "The iter is  58, loss is -1.13576.\n",
      "The iter is  59, loss is -1.13595.\n",
      "The iter is  60, loss is -1.13564.\n",
      "The iter is  61, loss is -1.13593.\n",
      "The iter is  62, loss is -1.13649.\n",
      "The iter is  63, loss is -1.13643.\n",
      "The iter is  64, loss is -1.13676.\n",
      "The iter is  65, loss is -1.13627.\n",
      "The iter is  66, loss is -1.13635.\n",
      "The iter is  67, loss is -1.13670.\n",
      "The iter is  68, loss is -1.13649.\n",
      "The iter is  69, loss is -1.13696.\n",
      "The iter is  70, loss is -1.13686.\n",
      "The iter is  71, loss is -1.13687.\n",
      "The iter is  72, loss is -1.13697.\n",
      "The iter is  73, loss is -1.13685.\n",
      "The iter is  74, loss is -1.13703.\n",
      "The iter is  75, loss is -1.13698.\n",
      "The iter is  76, loss is -1.13710.\n",
      "The iter is  77, loss is -1.13706.\n",
      "The iter is  78, loss is -1.13706.\n",
      "The iter is  79, loss is -1.13706.\n",
      "The iter is  80, loss is -1.13700.\n",
      "The iter is  81, loss is -1.13716.\n",
      "The iter is  82, loss is -1.13715.\n",
      "The iter is  83, loss is -1.13721.\n",
      "The iter is  84, loss is -1.13717.\n",
      "The iter is  85, loss is -1.13714.\n",
      "The iter is  86, loss is -1.13717.\n",
      "The iter is  87, loss is -1.13719.\n",
      "The iter is  88, loss is -1.13724.\n",
      "The iter is  89, loss is -1.13723.\n",
      "The iter is  90, loss is -1.13722.\n",
      "The iter is  91, loss is -1.13721.\n",
      "The iter is  92, loss is -1.13723.\n",
      "The iter is  93, loss is -1.13721.\n",
      "The iter is  94, loss is -1.13725.\n",
      "The iter is  95, loss is -1.13724.\n",
      "The iter is  96, loss is -1.13724.\n",
      "The iter is  97, loss is -1.13725.\n",
      "The iter is  98, loss is -1.13725.\n",
      "The iter is  99, loss is -1.13725.\n",
      "The theoretical value is -1.137283834485513.\n"
     ]
    }
   ],
Q
Quleaf 已提交
205
   "source": [
Q
Quleaf 已提交
206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228
    "# 选择 paddlepaddle 中的 Adam 优化器\n",
    "import paddle\n",
    "\n",
    "optimizer = paddle.optimizer.Adam(parameters=uccsd_ansatz.parameters(), learning_rate=0.1)\n",
    "\n",
    "# 制备初始量子态, e.g. |0000>\n",
    "init_state = pq.state.computational_basis(n_qubits, 0)\n",
    "\n",
    "# 定义优化步数\n",
    "num_itr = 100\n",
    "for itr in range(0, num_itr):\n",
    "    # 运行量子线路得到末态\n",
    "    state = uccsd_ansatz(init_state)\n",
    "    # 计算损失函数,即期望值\n",
    "    loss = loss_fn(state)\n",
    "    # 反向传播梯度\n",
    "    loss.backward()\n",
    "    # 通过loss值更新参数\n",
    "    optimizer.minimize(loss)\n",
    "    # 清除当前梯度\n",
    "    optimizer.clear_grad()\n",
    "    print(f\"The iter is {itr:3d}, loss is {loss.item():3.5f}.\")\n",
    "print(\"The theoretical value is -1.137283834485513.\")"
Q
Quleaf 已提交
229 230 231
   ]
  },
  {
Q
Quleaf 已提交
232
   "cell_type": "markdown",
Q
Quleaf 已提交
233 234
   "metadata": {},
   "source": [
Q
Quleaf 已提交
235
    "现在你可以把波函数模版替换为 `HardwareEfficientModel`,然后尝试比较一下使用两种方法计算出来的基态能量。"
Q
Quleaf 已提交
236 237 238 239 240 241
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
Q
Quleaf 已提交
242 243
    "## 利用Hatree Fock方法计算分子基态能量\n",
    "Hartree Fock方法是量子化学中非常重要的方法。如果要利用qchem模块运行Hartree Fock方法的话,我们只需要把前面的波函数模版线路换成`RHFSlaterDeterminantModel`,并把损失函数换成`RHFEnergyLoss`(注意:使用Hartree Fock方法需要安装PySCF,`pip install -U pyscf`)。"
Q
Quleaf 已提交
244 245 246 247
   ]
  },
  {
   "cell_type": "code",
Q
Quleaf 已提交
248
   "execution_count": 6,
Q
Quleaf 已提交
249
   "metadata": {},
Q
Quleaf 已提交
250 251 252 253 254 255 256 257 258
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Overwritten attributes  multiplicity  of <class 'pyscf.gto.mole.Mole'>\n"
     ]
    }
   ],
Q
Quleaf 已提交
259
   "source": [
Q
Quleaf 已提交
260 261 262 263
    "# 构建Hartree Fock线路\n",
    "n_qubits = 4\n",
    "n_electrons = 2\n",
    "hartreefock_ansatz = pq_qchem.RHFSlaterDeterminantModel(n_qubits, n_electrons)\n",
Q
Quleaf 已提交
264
    "\n",
Q
Quleaf 已提交
265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384
    "# 设置Hartree Fock损失函数\n",
    "loss_fn = pq_qchem.RHFEnergyLoss(h2_geometry, basis_set)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The iter is   0, loss is 0.37967.\n",
      "The iter is   1, loss is 0.31168.\n",
      "The iter is   2, loss is 0.22180.\n",
      "The iter is   3, loss is 0.10975.\n",
      "The iter is   4, loss is -0.02357.\n",
      "The iter is   5, loss is -0.17552.\n",
      "The iter is   6, loss is -0.34124.\n",
      "The iter is   7, loss is -0.51346.\n",
      "The iter is   8, loss is -0.68254.\n",
      "The iter is   9, loss is -0.83712.\n",
      "The iter is  10, loss is -0.96538.\n",
      "The iter is  11, loss is -1.05717.\n",
      "The iter is  12, loss is -1.10677.\n",
      "The iter is  13, loss is -1.11545.\n",
      "The iter is  14, loss is -1.09212.\n",
      "The iter is  15, loss is -1.05087.\n",
      "The iter is  16, loss is -1.00622.\n",
      "The iter is  17, loss is -0.96914.\n",
      "The iter is  18, loss is -0.94574.\n",
      "The iter is  19, loss is -0.93791.\n",
      "The iter is  20, loss is -0.94471.\n",
      "The iter is  21, loss is -0.96343.\n",
      "The iter is  22, loss is -0.99040.\n",
      "The iter is  23, loss is -1.02149.\n",
      "The iter is  24, loss is -1.05253.\n",
      "The iter is  25, loss is -1.07977.\n",
      "The iter is  26, loss is -1.10035.\n",
      "The iter is  27, loss is -1.11271.\n",
      "The iter is  28, loss is -1.11676.\n",
      "The iter is  29, loss is -1.11378.\n",
      "The iter is  30, loss is -1.10610.\n",
      "The iter is  31, loss is -1.09642.\n",
      "The iter is  32, loss is -1.08731.\n",
      "The iter is  33, loss is -1.08072.\n",
      "The iter is  34, loss is -1.07775.\n",
      "The iter is  35, loss is -1.07866.\n",
      "The iter is  36, loss is -1.08294.\n",
      "The iter is  37, loss is -1.08958.\n",
      "The iter is  38, loss is -1.09727.\n",
      "The iter is  39, loss is -1.10472.\n",
      "The iter is  40, loss is -1.11083.\n",
      "The iter is  41, loss is -1.11488.\n",
      "The iter is  42, loss is -1.11665.\n",
      "The iter is  43, loss is -1.11636.\n",
      "The iter is  44, loss is -1.11457.\n",
      "The iter is  45, loss is -1.11207.\n",
      "The iter is  46, loss is -1.10960.\n",
      "The iter is  47, loss is -1.10780.\n",
      "The iter is  48, loss is -1.10702.\n",
      "The iter is  49, loss is -1.10736.\n",
      "The iter is  50, loss is -1.10865.\n",
      "The iter is  51, loss is -1.11056.\n",
      "The iter is  52, loss is -1.11265.\n",
      "The iter is  53, loss is -1.11454.\n",
      "The iter is  54, loss is -1.11592.\n",
      "The iter is  55, loss is -1.11664.\n",
      "The iter is  56, loss is -1.11672.\n",
      "The iter is  57, loss is -1.11630.\n",
      "The iter is  58, loss is -1.11561.\n",
      "The iter is  59, loss is -1.11489.\n",
      "The iter is  60, loss is -1.11436.\n",
      "The iter is  61, loss is -1.11412.\n",
      "The iter is  62, loss is -1.11423.\n",
      "The iter is  63, loss is -1.11462.\n",
      "The iter is  64, loss is -1.11519.\n",
      "The iter is  65, loss is -1.11579.\n",
      "The iter is  66, loss is -1.11629.\n",
      "The iter is  67, loss is -1.11663.\n",
      "The iter is  68, loss is -1.11676.\n",
      "The iter is  69, loss is -1.11670.\n",
      "The iter is  70, loss is -1.11653.\n",
      "The iter is  71, loss is -1.11631.\n",
      "The iter is  72, loss is -1.11612.\n",
      "The iter is  73, loss is -1.11601.\n",
      "The iter is  74, loss is -1.11601.\n",
      "The iter is  75, loss is -1.11611.\n",
      "The iter is  76, loss is -1.11628.\n",
      "The iter is  77, loss is -1.11646.\n",
      "The iter is  78, loss is -1.11662.\n",
      "The iter is  79, loss is -1.11672.\n",
      "The iter is  80, loss is -1.11676.\n",
      "The iter is  81, loss is -1.11674.\n",
      "The iter is  82, loss is -1.11668.\n",
      "The iter is  83, loss is -1.11661.\n",
      "The iter is  84, loss is -1.11656.\n",
      "The iter is  85, loss is -1.11653.\n",
      "The iter is  86, loss is -1.11654.\n",
      "The iter is  87, loss is -1.11658.\n",
      "The iter is  88, loss is -1.11663.\n",
      "The iter is  89, loss is -1.11669.\n",
      "The iter is  90, loss is -1.11673.\n",
      "The iter is  91, loss is -1.11676.\n",
      "The iter is  92, loss is -1.11676.\n",
      "The iter is  93, loss is -1.11674.\n",
      "The iter is  94, loss is -1.11672.\n",
      "The iter is  95, loss is -1.11670.\n",
      "The iter is  96, loss is -1.11669.\n",
      "The iter is  97, loss is -1.11669.\n",
      "The iter is  98, loss is -1.11670.\n",
      "The iter is  99, loss is -1.11671.\n",
      "The theoretical value is -1.11675.\n"
     ]
    }
   ],
   "source": [
    "# 选择 paddlepaddle 中的 Adam 优化器\n",
    "import paddle\n",
Q
Quleaf 已提交
385
    "\n",
Q
Quleaf 已提交
386
    "optimizer = paddle.optimizer.Adam(parameters=hartreefock_ansatz.parameters(), learning_rate=0.1)\n",
Q
Quleaf 已提交
387
    "\n",
Q
Quleaf 已提交
388 389
    "# 制备初始量子态, e.g. |1100>\n",
    "init_state = pq.state.computational_basis(n_qubits, 12)\n",
Q
Quleaf 已提交
390
    "\n",
Q
Quleaf 已提交
391 392 393 394 395 396 397 398
    "# 定义优化步数\n",
    "num_itr = 100\n",
    "for itr in range(0, num_itr):\n",
    "    # 运行量子线路得到末态\n",
    "    state = hartreefock_ansatz(init_state)\n",
    "    # 计算损失函数,即期望值\n",
    "    loss = loss_fn(state)\n",
    "    # 反向传播梯度\n",
Q
Quleaf 已提交
399
    "    loss.backward()\n",
Q
Quleaf 已提交
400 401 402 403 404 405
    "    # 通过loss值更新参数\n",
    "    optimizer.minimize(loss)\n",
    "    # 清除当前梯度\n",
    "    optimizer.clear_grad()\n",
    "    print(f\"The iter is {itr:3d}, loss is {loss.item():3.5f}.\")\n",
    "print(\"The theoretical value is -1.11675.\")"
Q
Quleaf 已提交
406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422
   ]
  },
  {
   "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)"
   ]
  }
 ],
 "metadata": {
  "interpreter": {
Q
Quleaf 已提交
423
   "hash": "f7cfecff1ef1940b21a48efa1b88278bb096bd916f13c2df11af4810c38b47e1"
Q
Quleaf 已提交
424 425
  },
  "kernelspec": {
Q
Quleaf 已提交
426
   "display_name": "Python 3.8.0 ('pq')",
Q
Quleaf 已提交
427 428 429 430 431 432 433 434 435 436 437 438 439
   "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 已提交
440
   "version": "3.8.0"
Q
Quleaf 已提交
441 442 443 444 445
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}