{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "#

Variational Quantum Eigensolver for an Interacting Scalar Field

\n", "\n", "

Ryan LaRose

\n", "

PHY 855/955 Final Project

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Abstract

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this notebook, we compute the ground state energy for a real scalar field with $\\lambda \\phi^4$ interaction. We use the Variational Quantum Eigensolver (VQE) with a product state ansatz consisting of three parameters. The notebook is designed to run on the \"Aspen-4-3Q-A\" lattice on [Rigetti Quantum Cloud Services](https://www.rigetti.com/qcs) which consists of three superconducting qubits, or on a quantum computer simulator designed to mimic this chip.\n", "\n", "Note that the code must be in a script to run on the actual quantum chip. This notebook is primarily for instructive purposes to explain what is happening in the script, the code of which is identical to this notebook." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##

Installing Software

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If you don't have the necessary software installed (or are running on Binder), run the cells below. This will automatically install all the other requirements for the notebook." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\"\"\"Install software, if necessary. (Uncomment these lines if needed, then run the cell.)\"\"\"\n", "#!pip install pyquil==2.4.0\n", "#!pip install matplotlib\n", "#!pip install scipy" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##

Imports

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We first import the necessary packages. The software pyQuil is developed by Rigetti, a start-up quantum computing company founded by Chad Rigetti in California. Other companies have quantum computers (e.g. IBM and Google) as well as their own software to use them [1]. IBM's computers are based on a queue system, which makes is difficult to run variational quantum algorithms. Google's quantum computers are not currently open to the public. For these reasons, we use Rigetti." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "\"\"\"Imports.\"\"\"\n", "from math import pi\n", "import time\n", "\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "from scipy.optimize import minimize\n", "\n", "from pyquil import Program, get_qc\n", "from pyquil.gates import H, S, RX, MEASURE" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##

Constants and Parameters

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The code cell below defines two important quantities for this notebook. First, the parameter `omega` dictates the interaction strength of the field (see Hamiltonian below). Second, the `computer` is which computer we will use to execute the algorithm. Quantum computer simulators are classical programs designed to mimic the (noiseless) evolution of a quantum computer. It is possible to artificially inject a noise model into a quantum computer simulator, which can be useful in a variety of situations." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "\"\"\"Parmeters/constants.\"\"\"\n", "# Value of \\omega_\\phi [1] which determines the interaction strength\n", "# omega = 1 <==> no interaction, omega --> 0 <==> large interaction\n", "omega = 0.5\n", "\n", "# Computer to run on\n", "simulator = \"3q-qvm\"\n", "qcomputer = \"Aspen-4-3Q-A\"\n", "computer = get_qc(qcomputer, as_qvm=True) # Change to as_qvm=False to run on QC. Must have reservation." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##

Scalar Quantum Field theory

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We consider the scalar quantum field with $\\lambda \\phi^4$ interaction term, the Lagrangian of which can be written\n", "\n", "\\begin{equation}\n", " \\mathcal{L} = \\frac{1}{2} \\partial_\\mu \\phi \\partial^\\mu \\phi - \\frac{1}{2} m_0^2 \\phi^2 - \\frac{\\lambda_0^2}{4!} \\phi^4 .\n", "\\end{equation}\n", "\n", "Here, $m_0$ is the bare mass of the field. The physical mass gets affected by the interaction term $\\lambda_0 \\phi^4$. It is possible to renormalize the theory by computing the physical mass via $m = E_1 - E_0$ [2]. In this code, we only consider computing the ground state energy $E_0$. The first excited state energy could be computed by similar methods, for example those of [3].\n", "\n", "The steps to obtaining a qubit Hamiltonian from such a Lagrangian are described in detail in my write-up and slides. Below, we will use the form of the Hamiltonian derived in [4] for three qubits. \n", "\n", "\n", "We do mention one effect due to discretization. Namely, our lattice simulation is valid only at low energies (momenta), as can be seen by the following plot. This plot shows the continuous dispersion related and the discrete dispresion relation. The region where they overlap (at low momenta) is the valid region for our simulation. Note that coefficients in this plot were chosen arbitrarily for visual appearance. The effective shape of both curve and physics is contained in this plot, however." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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c2nQoAE3btwgMDCQqVOnUrBgQbZv305MTAxNmjShdevWlCtXzmm5C8+yYwf8+6+tHRgIcvNW3IsUbyLHKV0aGjYE657dgKVbYuRI83ISnuXMmTP06tWL8+fPExsbm+ni6p9//qFkyZI0aNAAgAIFCgCwdu1a9u3bl3x37vr16xw5ckSKNy+2aJGx3bata7f1EzmDdJuKHKl7d2N74UJz8hCe6bnnnmPkyJHs37+f77//njt37mTqfK01Ko11HrTWfPnll+zZs4c9e/Zw4sQJWrdu7ay0hYfROvVnU7du5uQiPIvbFW9KqQCl1J9Kqb1Kqb+UUu9Y49OUUieUUnusjzpm5yrcl/0H4G+/WRbtFSIjrl+/TqlSpQCYPn16cjx//vxERUWl205StWpVzp07x/bt2wHLRvbx8fG0adOGb7/9ljjraqyHDx/m5s2brrwU4cYOHoQjR2xtPz9o3968fITncMdu0xighdY6WinlB2xWSq2yPjdKa73AxNyEh6hYEWrVgn37LO3ERMug4KeeMjcvcXf67exflO/WrVuUTjEg8qWXXmLs2LGEhYVRqlQpHnroIU6cOAFAx44d6dGjB4sXL+brr7+md+/eDBkyhC+++CK5KxTA39+fuXPn8txzz3H79m0CAwNZv349Tz/9NCdPnqRevXporSlevDhL7KcaCq9hf9etZUsoVMicXIRncbviTWutgWhr08/6kGVWRaZ162Yr3sDyQSnFm7CXmJiYZrxzGlP+KleuzL59+4iKiiJ//vwAhqVCpk2blvx9gwYN2LZtW6rXGDduHOPGjcti1iInsB/vZj/cQ4j0uF23KYBSKpdSag9wCVintf6f9an3lVL7lFITlVK5TUxReAD7D8L1640LYQohhFmOHYO9e21tHx/LTHkhMkJpN947SClVCFgMPAdcBi4A/sAk4JjW+t00zhkKDAUICgoKmTNnjktzjI6OztQK7TmNO1+/1vDkkw05c8Y2des//znIY49dcsrru/O1ZwdnXH/BggWpWLGikzLKPgkJCeTywFVUjx49yvUs/gYjf++dc/1z55bhu+8qJLdr177GZ5/tyfLrupL87F1//c2bN9+pta5/zwO11m79AN4GXrGLhQLL73VuSEiIdrXw8HCXv4c7c/frHzNGa0sZZ3l06+a813b3a3c1Z1z/wYMHs56ICW7cuGF2Cg5xxp+3/L0Pd8rrPPSQ8bPpiy+c8rIuJT/7cJe/B7BDZ6A2crtuU6VUcesdN5RSgUAr4G+lVElrTAFdgAPmZSk8hf2s01WrQCb3uRftxnf/cxL5c3YfZ8+C/XDILl3MyUV4Jrcr3oCSQLhSah+wHcuYt+XATKXUfmA/UAx4z8QchYeoXx/KlLG1b9+GNWvMy0cYBQQEcPnyZSksXExrzeXLlwkICDA7FUHqvUwbNjR+TglxL+4423QfUDeNeAsT0hEeTinL3bfPP7fFFi2ShTDdRenSpTlz5gwRHrYI3507dzyuEAoICDAsiSLMY79EiMwyFZnldsWbEM5mX7wtWwYxMZBb5iubzs/PzyO3htq4cSN166b6HVOIe4qMhE2bjLGuXc3JRXgud+w2FcKpmjSBEiVs7Rs3YMMG8/IRQnivpUsti4YnqVkTKlUyLx/hmaR4EzlerlypBwPLXqdCCDPIwrzCGaR4E17B/gPyl18gPt6cXIQQ3unGDVi3zhiT8bfCEVK8Ca8QGmrcMzAyEn7/3bR0hBBeaMUKiI21tStWhBo1zMtHeC4p3oRX8PdPvfWMffeFEEK40oIFxna3bpYZ8UJklhRvwmvYd08sWmQcOCyEEK4SHQ0rVxpjMt5NOEqKN+E1WreGvHlt7XPnYOtW8/IRQniP5cvhzh1bOzgYGjQwLR3h4aR4E14jMBA6djTG5s0zJxchhHex/6wJC5MuU+E4Kd6EV+nZ09ieP1+6ToUQrhUVZdlXOaWwMHNyETmDFG/Cqzz+OOTLZ2ufPw9btpiXjxAi50ury7R+fdPSETmAFG/Cq0jXqRAiu82fb2xLl6nIKinehNex7zpduBASEszJRQiRs0VFpZ5lav8ZJERmSfEmvI50nQohssvy5RATY2sHB0NIiGnpiBxCijfhdQICoHNnY0y6ToUQrmD/2dKzp3SZiqyT4k14JftuiwULpOtUCOFcN27ILFPhGlK8Ca/UujUUKGBrX7woe50KIZzLvsu0XDnpMhXOIcWb8EoBAan3OpWuUyGEM8nCvMJVpHgTXktmnQohXOXGDVi92hiTWabCWaR4E17Lvuv00iX47Tfz8hFC5BzLlqXuMq1Xz7x8RM4ixZvwWrlzQ5cuxph0nQohnMF+YV6ZZSqcSYo34dXS6jqNjzcnFyFEzpBWl6nMMhXOJMWb8GqPPQYFC9raERGwaZN5+QghPN+SJdJlKlxLijfh1fz9oWtXY2zOHHNyEULkDLNmGdu9e0uXqXAuKd6E10ur6zQ21pxchBCeLSIC1q83xvr0MScXkXO5XfGmlApQSv2plNqrlPpLKfWONV5OKfU/pdQRpdRcpZS/2bmKnKFVKyha1Na+ehXWrDEvHyGE55o/37jkUPXqULOmefmInMntijcgBmihta4N1AEeV0o9BHwATNRaVwKuAk+ZmKPIQfz8Ug8mtu/2EEKIjJg929iWu27CFdyueNMW0damn/WhgRbAAmt8OtAljdOFcMgTTxjbS5fCzZvm5CKE8EynT8PmzcZY797m5CJyNrcr3gCUUrmUUnuAS8A64BhwTWudtIjDGaCUWfmJnKdJEyhd2ta+dctSwAkhREbNnWtsN2wIFSqYk4vI2ZTW2uwc0qWUKgQsBt4CftRaV7TGywArtdapRhIopYYCQwGCgoJC5rh46mB0dDT58uVz6Xu4s5x0/d99V565cx9IbjduHMm4cQfSPT4nXbsjvPn65dq989rh7tc/dGgIR47kT24/++xRevQ4k12puZz87F1//c2bN9+pta5/zwO11m79AN4GRgGRgK811hhYc69zQ0JCtKuFh4e7/D3cWU66/l27tAbbw9dX68jI9I/PSdfuCG++frl275Xe9f/9t/HzQymtz57N3txcTX724S5/D2CHzkBt5Hbdpkqp4tY7biilAoFWwCEgHOhhPWwA8Is5GYqcqk4dqFLF1o6PtywbIoQQ92I/USE0FO6/35RUhBdwu+INKAmEK6X2AduBdVrr5cBo4CWl1FGgKDDVxBxFDqRU6plh9h/IQghhT2uZZSqyl6/ZCdjTWu8D6qYRPw40zP6MhDfp0wfGjrW1N22Cs2ehlEyPEUKkY/duOHzY1vbzg+7dzctH5HzueOdNCNNUrgwhIba21qlnkAkhREr2d93atIEiRczJRXgHKd6EsGO/5pt0nQoh0pOYmHo/ZOkyFa4mxZsQdnr1Mm4ivWMHHDliXj5CCPe1ZQucSbEaSGAgdOpkXj7CO0jxJoSdUqXg0UeNMbn7JoRIi/1nQ6dO4MVLoYlsIsWbEGmw7zqdNcsy/k0IIZLExqYeEytdpiI7SPEmRBq6dwffFHOx//kHdu0yLx8hhPtZtQquXLG1CxeGxx83Lx/hPaR4EyINRYum/hCeMcOcXIQQ7sn+M6FXL8id25xchHeR4k2IdPTvb2zPnm3ZdUEIIa5dg2XLjDH7zwwhXEWKNyHS0bEjFChga1+6BGvXmpePEMJ9zJ9vGfOWpEIFaNzYvHyEd5HiTYh0BAZCWJgxJl2nQghI/VnQr59xiSEhXEmKNyHuwr4bZMkSuHHDnFyEEO7h5En4/XdjrF8/U1IRXkqKNyHu4pFHoGxZW/vOHViwwLx8hBDm+/lnY7txY6hY0ZxchHeS4k2Iu/DxSf0btXSdCuG9tE79GSATFUR2k+JNiHuw/2DeuBFOnzYlFSGEyf7+Oz+HD9vafn7Qs6d5+QjvJMWbEPdQpQo0aGCMzZxpTi5CCHOtWxdkaLdrZ1kXUojsJMWbEBlgf/dtxgzZLksIbxMXBxs2lDDEpMtUmEGKNyEyoHdv43ZZhw7B4cP5zUtICJHt1qyB69f9k9uFCkGHDiYmJLyWFG9CZEDx4tC2rTG2dm1Q2gcLIXIk+4kKPXvKdljCHFK8CZFB9t0jGzaUIC7OnFyEENnr+nX45RdjTLpMhVkcKt6UUoHOTkQId9exIxQsaGtfu+Yv22UJ4SXmzYOYGFu7XDlo0sS8fIR3c/TO20Wl1A9KqeZOzUYINxYQkHq7rJ9+MicXIUT2+vFHY1u2wxJmcrR4ywcMANYrpU4qpd5VSlVyYl5CuKUnnzS2lyyBK1fMyUUIkT3+/hu2bjXGBg40JRUhgKyPeVPAA8DrwN9KqT+UUkOVUoWynpoQ7qdpU6hQwdaOjYXZs83LRwjhetOmGdvNmkH58qakIgSQteJNAdr6UNZHI+Bb4LxSap5SqoNSKlfW0xTCPSiV+jfuH34wJRUhRDaIj089PGLQIHNyESKJo8VbbeBd4CCWog0sRRzWdm6gO/ALcFYp9YlSqk5WEhXCXQwYYBzrsmsX7N1rXj5CCNdZuxbOn7e1AwPj6dHDvHyEAAeLN631fq31WK11TaAKlm7T3dgKObDdjSsBvADsVErtVUqNuNtsVaVUGaVUuFLqkFLqL6XU89b4WKXUWaXUHuujnSO5C5FVZcrAY48ZY/aDmYUQOYP9v+3Q0Ajy5jUnFyGSZHmdN631Ea31eK11faAc8AqwFVuXaspu1ZrAl8ARpVTrdF4yHnhZa10NeAh4Vin1oPW5iVrrOtbHyqzmLoSjBg82tmfOtIx/E0LkHJcvw9KlxljbthfMSUaIFJy9SO8Z4BgQCSSkiNsXcvcDy5RS9exfQGt9Xmu9y/p9FHAIKOXkPIXIks6dIV8+2wq9kZGwfLmJCQkhnG7WLOMvZZUqQY0a181LSAgrpxRvSqnqSqmPgbPAIqADkHKiQtKdtxRLHOIHvH2P1w0G6gL/s4ZGKqX2WdeYK+yM3IVwREAAtGp1yRCTiQtC5Cz2XaYDB8rabsI9KK31vY9K60SlCgJ9gMFASFLY+lWn+P468BPwDZY7c+8CL1qfO6+1TvOumlIqH7AJeF9rvUgpFYTljp4G/guU1FoPTuO8ocBQgKCgoJA5c+Y4dH0ZFR0dTb58+Vz6Hu7Mm69/z55cvPjiI8ltHx/NvHlbKVrUO/pPvflnL9ee86/96NG8DBnSILnt46OZM2cbgYGXveL60+ItP/v0ZMf1N2/efKd1GNrdaa0z/QBmAbewdI0mWh8Jdu1dwBAgj925ubAUdIlAQjqv7wesAV5K5/lg4MC98gwJCdGuFh4e7vL3cGfefP0bNoTrmjW1Btvjgw/Mzir7ePPPXq4953v+eeO/7TZtLHFvuf60ePO1a5091w/s0BmowxztNu0NBJB6rbdY4GfgYa11Pa31ZK31LbtiMQGISO+FlVIKmAoc0lp/miJeMsVhXYEDDuYuhFMolXriwg8/WD7qhRCeKzbWMgkpJVnbTbgT3yycm3IW6Qnge2Cq1vpyBs5dAASl81wToD+wXym1xxr7D9DHulacBk4CwxxPXQjn6NsXRo2yLOQJ8M8/sG0bNG5sbl5CCMctX26ZhJSkUCHLJCUh3EVWi7eVWMayrbbe7svYiVqPuctzmzGuF5dElgYRbqd4cejUCRYtssV++EGKNyE8mf1EhSeesExSEsJdONpt+gFQQWvdUWu9KjOFmxA5jX13yty5cPOmObkIIbLm7FlYaXerQLpMhbtxdIeF17TWp5ydjBCe6PHH4b77bO2oKJg/37x8hBCO+/FHSEy0tWvWhJCQ9I8XwgzOXqRXCK/j62vZ7zSlyZPNyUUI4bjERJgyxRgbOlTWdhPux6HiTSmVkMnHHaXUaaXUAqVUB2dfhBBme+opY/uPP+CAzIcWwqOsWwenUvQpBQRYJiUJ4W4cvfOmMvnwB0pjWeLjF6XUQqVU7qylLoT7qFQJWrQwxuTumxCexf7fbFgYFJa9fIQbykq3qXbgAZZirgvwdRbeWwi3M3Sosf3TT3D7tjm5CCEy5+JF+OUXY8z+37QQ7iIrxVvSXbWU39s/0nouaX24QUqpWll4fyHcSpcuUKyYrX3tGixYYF4+QoiMmzbNtl4jQLVq0KSJaekIcVeOFm/NgWeBOCyF2D4s+5V2xnJX7UVrTGHZRmsYlq2yVmNcw81umLcQnit3bsvG1SlNmmRKKkKITEhrosLTT8tEBeG+HC3e/gbGYlnkd6bWuo7W+nOt9TKt9VLr93WA2UAe4E1gsda6HfBVitd5OAu5C+F2hgwxtjdvhoMHzclFCJExGzfC0aO2tr8/PPmkaekIcU+OFm9vAsWt339yl+M+sn4tBbxl/f4D61cFVHDw/YVwS5UrQ2ioMSYTF4Rwb/b/Rrt1Mw6BEMLdOFq8tc/gcYEpvu8EoLU+C1yzxgo4+P5CuC37Qc7Tp8OdO+bkIoS4u8hI4/Z2kPoOuhDuxtHi7T5ss0dfuMtxI61fFVAyRTzG+lXm4okcp2tXKFrU1r56FRYuNC8fIUT6fvoJYmNt7YoVU989F8LdOFq8RVi/KqC/UmqnUuo5pVQHpVQ7pdQIpdQfQG9sRV4kgFLKFyhijUfYv7AQni4gIPWOCzJxQQj3o3XqLtOnnwYf2XtIuDlH/4quxLjsR13gM+AXYBnwJdAI4/Igy63n1gH8rN8fcfD9hXBr9t0uv/0Gf/9tTi5CiLRt2mT8d+nrm3rGuBDuyNHibSxw2fp90gK8aa3xlnTX7TLwjvX7XileZ6OD7y+EW6taFR591BiTiQtCuJdvvjG2u3SBoCBzchEiMxwq3rTWF4AWwCmMhVrKR1IRdwJoaT0H4BzwPjAOkCVMRY5lP3Fh2jTZcUEId3HuHCxebIw9+6w5uQiRWQ737Gut9wPVgVeAXUACtoItAdgBvATUsB6bdN5ErfWb1seJrCQvhDvr3h2KFLG1r1yBuXPNy0cIYTNlSuodFZo1My8fITIjS8Mytda3tdafaq0bYFmM9z4ss0rzaK0baq0/01rLvQbhlQICYPBgY+xr2dFXCNPFx6eeRDRihOyoIDyHQ8WbUuqHFI9eAFrreK31Ja31Ra11/L1eQwhv8Mwzxv8QduyAP/80Lx8hBCxbBmfP2tp58kD//ublI0RmOXrn7Uks+5IOAK47Lx0hcpby5aFtW2NM7r4JYS77iQr9+kHBgubkIoQjfB087xK2hXqPOS8dIVL7aMtH7Di/g4vRF4m4FUFsQiwJiQkk6kTy+uelaGBRigQWoVT+UlQpVoUqRatQM6gm9+e/3+zUAcsg6JUrbe25c+GTT2T7HSHM8M8/sH69MfbMM+bkYk9rzZkbZ9h9YTdHrxzl2JVjnLx+kqu3r3I95jpRMVH4KB8G1RnE26Fvp/kacQlx+OXyS/M5kXM4WrxtxLIAL8ADyHptIovu9oGz4/wO5v01L9OvWbZgWV5/5HWGhJi7102bNlCuHJywTs+JiYEffoBXXzU1LSG80nffGdsPPwx16piTC8DJaydZcXgFG068SgmEAAAgAElEQVRuYNuZbZyLOnfPc67HpN/hVf2b6vjn8qdFuRa0LNeS0OBQCgbIbcWcxtHibTzQFfAHXldKbZJxbiKzIm9FsvDgQhYeWsilm5fYM3xPmsfVKF6DeWS+eDt1/RS5fHJlNc0sy5XL8pt9ymLt22/h5ZctzwkhssfNm/Djj8bYiBHm5DJr/yzGbx7PgUsHMn2ufy7/NONRMVEcuWK5l/JXxF98+eeX+Pn40aZiG3pV70WnKp0okFu2FM8JHB3zdh3LMiCJQDPggFJquFLqYaVUsFLqgbQeTstaeCytNb+f+p2+i/pS6tNSDF8xnHXH17H34l4ORRxK85zqJao7/H5NyjRJM37tzjUWHVpEfGL2/M4xeLBl9mmSkydh1apseWshhNWcOXA9xU2rYsWgRw9zcvFRPg4VbpB+8bb/0v5UsbjEOJYfXk7/xf257+P7eHrp0+w+v9uh9xXuw9E7byex7Z6ggMrAvYZh6yy8n/BwCYkJLDi4gPGbx7P34t40j1l4aCFvFH8jVfyRBx7h564/E5QviBJ5S5DHLw8+yvJ7R3RsNFduXyHiZgTHrh7j8OXDHIw4yO4LuymQuwCVi1ZO871m7Z/FsyufpVyhcrzc+GUG1R1EHr88zrtgO0WLQu/eloV6k3z9NXTo4LK3FEKkoHXqiQpPPQW5c5uTT+cqnSmYu2CqLtAA3wBCSoZQo0QNKhSuQPnC5SmRtwQFAwqS3z8/QLp3z05cPYFCoZP/eza6HX+bqbunMnX3VJqUacJrTV+jXaV2KFkjxeNktZhK2rc06fssU0qVAX7CMiEiEZiktf5cKVUEmAsEYykee2qtrzrjPYXrJOpEft73M+///j6HLx++67H7Lu5LM148b3H61uqbqfe9E3/H8kGWzofSlF1TADhx7QQjV43knU3vMKbpGEY0GEGAb0Ca52TViBHG4m31ajh6FCpWdMnbCSFS2LoVdu2ytZWCYcNc935RMVFM3DaRqsWq0rN6z1TPB/oF0qt6L0sh9UAT2ldqT8tyLakVVMvhCQd9a/WlQ+UObDq1iV+P/8qqo6uSu1Htbfl3Cx1md6BeyXq89ehbdKrSSYo4D5KlRXrBUN7bb4+V8pEZ8cDLWutqwEPAs0qpB4ExwK9a60rAr9a2cGMbTmwgZFIIA5YMSLdwq1C4Av9t/l8OPXuIeWGZH9eWngDfAKoVr5bmc7vO72L3BWO3QcStCF5e+zJVvqrCT3t/IiExwWm5JGnQwPJI6dtvnf42Qog0fP65sd2unWUikbPFJcTx+bbPKf9Fed7e+Daj148mNiE2zWPHho7l0qhLbBq4iVebvErI/SFZnilaMKAgnap04vO2n/PPyH/YNXQXo5uMpnSB0mkev+v8LrrM7cKnWz/N0vuK7JWV4s1+I/q7PTJMa31ea73L+n0UcAgoBXQGplsPmw50yULuwoWOXjlK5zmdaflTS/ZcSD0JQaHoWrUra/ut5fBzh3nj0TeoWqxqtuVXKKAQT9d9Os1xI6evn2bAkgE0ntqYXed3pXF21tjvnfjDD5ZB1EII1/n3X1i40Bh7/nnnv8+mk5uo+31dXljzApG3IgHLbNLJOyeneXzJ/CUpElgkzeecQSlF3ZJ1mdBqAieeP8HiXotpVb5VquMKBRRiYJ2BLstDOJ+jxVs5Bx7lM/smSqlgoC7wPyBIa30eLAUeUMLB3IULRcdG02hKI5b+szTVc74+vgysM5BDzx5iUa9FPFbhseSxa9mpfOHyTO40mZPPn2R0k9HJ40hS2n5uOw0mN+D5Vc9zI+aG0967Vy/L+Lck167BjBlOe3khRBq+/RYSUtxMf/BBaJW6hnHYhegL9FvUj9DpofwV8Vfq99/xLVpnthPKuXx9fOlStQvr+q9j97DddK/WPfm5tx59i6J5it7lbOFulNl/odKjlMoHbALe11ovUkpd01oXSvH8Va114TTOGwoMBQgKCgqZM2eOS/OMjo4mX758Ln0Pd5bW9c8+PZtJJ4wbB7Yo3oKnyz1NycCS2ZlehlyLvcbM0zNZcm4J8WmseFPMvxijqoyiYZGGhrijP/spU8oxc2bZ5PYDD9zkxx+345P9dWyWePPffbl2z7n2mBgfevZszI0btu7IF1/8h06dzjv0evbXvzFiIxMPT+RGfOpf8gJ8AggrHUbPMj3J5+t+f2Ynbp5gydkljKw4Ej+ftLtrr8ZepbC/5b9aT/vZO1t2XH/z5s13aq3r3/NArbXbPQA/YA3wUorYP0BJ6/clgX/u9TohISHa1cLDw13+Hu4sreuPS4jT9b6vpxmLbjylsd7679bsT8wBx68c193ndteMJc3HyBUj9a3YW8nHO/qzP3NGa19frS3z3yyPVaucdBHZyJv/7su1e47Jk43/1goV0jo62vHXS7r+K7eu6CcWPpHu58XAJQP1hagLzrkIk6w+slrneT+PnrRjkk5MTPS4n72zZcf1Azt0BuqkLP+ur5TKp5QapJSaqpRaoZT6VSlVQilVKMUab8Uz8XoKmAoc0lqnHEG5FMteqli//pLV3IVr+Pr4MrXTVKZ1nsaWwVt4qPRDZqeUIeUKl2NBzwWseGIF5QqlHsm89vjadKfgZ0apUhAWZox99lmWX1YIYUfr1BMVhgyBvHmz9rqbTm6ixrc1mLV/VqrnagXV4vdBv/Nj5x8JyheUtTcyUXRsNMOWD+NW3C2GLh9KzwU9iYqLMjstYZWl4k0p1RfLsh1TgIFAWyAUCMCyeO8J6+OAUiqjy5I0AfoDLZRSe6yPdsAE4DGl1BHgMWtbmGTVkVV0nduVBJ32rMw699VhQJ0BHjn1vF2ldhwYcYAxTcYkj8nz9fHl564/O20tuBdeMLbXrIFDaa9RLIRwUHg4HEixDq6PT+pJQ5mRqBOZfXo2LX5qkWobK/9c/kxoOYGdQ3fS9IGmjr+Jm3hjwxucun4qub3g4AKG7BzC1n+3mpiVSOJw8aaUGo5lPbYipD2rdClw1hovBrTOyOtqrTdrrZXWupbWuo71sVJrfVlr3VJrXcn69YqjuQvHJepE3vvtPdrPas+Sv5cw41TOHG2fxy8P41uN57eBv1GuUDneevQtGpRqcO8TM6hhQ2jc2Bj74gunvbwQgtT/prp0gbJl0z42I1YfXc2kE5NI1ImGeK2gWmwfsp3RTUfj65Mz1qKvHVSbvH7GW5QXYy7SbFozvt/xvUlZiSQOFW9KqfLA5xgX6TX0J1n7bhelCLVx5L2E+4iKiSJsfhhvhr+Z3H0449QMfj/1u8mZuU6TB5qwd/heXnvktXSP0Q5O+rG/+zZ9OlyRX0mEcIrjx2Gp3aT3rC4P0rZiWx4LeswQG91kNH8+/Se1gmpl7cXdzKC6g9g1bBd176triMclxjF8xXCGLRtGTHyMSdkJR++8PY9lUoHGUsD9TtrruW1J8f29Z08It3X86nEemvoQiw4tSvWco/vzeYr8ufOn+9v0xeiLPPzDw2w/uz3Tr9utG5QpY2vfvg2T014OSgiRSV99ZRnzlqROHXjkkay9plKKFyu9SPXi1SkSWISVT6xkQqsJ5PY1aY8tF6tctDJbn9rKSw+9lOq5Sbsm0Xx6cy5GXzQhM+Fo8dYyxfffaq2bpXNc0rL6CpBNgDzU9rPbaTy1MQcjDhriRQOL8nGtj3mmwTMmZWaumIQYOs/pzLYz22g2rRkLDy6890kp+PqmHn/z1VcQF+fEJIXwQlFRMHWqMfb885YtsbIqMFcgi3stZtfQXbSt1DbrL+jmcvvm5pM2nzA/bD4BPsatA7ee2UrjqY3vufWhcD5Hi7cHUnz/w12OS7l2fKF0jxJua/nh5YROD+XSzUuGeJ376rBj6A7qFq6bzpk5W6JOZPw/4/nf2f8Blg2fe8zvwYdbPsxUN+qQIRAYaGufOQOLFzs7WyG8y9SpcCPFsmvFi0Pv3hk/P1En3nVgfqWilShbKAuD5zxQjwd78E29byhf2Lje/olrJ3h46sP88e8fJmXmnRwt3lL2Id26y3EpV2RNe3M34ba+3/E9ned05lac8Ufcq3ovtgzeQnChYHMScxOlAkqlio1eP5pX1r6SakBzeooUgQEDjLGJE52RnRDeKS4u9b+h4cMhICDt41OdnxDHwCUDafpj0zSHiXizcnnLsX3Idh4rbxz3d/n2ZVr+1FL+vLKRo8VbZIrv69zluG4pvr+U7lHCrWiteWfjOwxfMTxVETKmyRhmdZ/ltCUzPJWP8mFI+SFM7TQ11Xi4T7d9ylNLnyI+MfVuDWn5v/8ztrdtgz/kl1ghHLJgAZw+bWvnzg0jR2bs3Ftxt+g6tysz9s0gUSfSZ2Efwk+EuyZRD1UksAgrnljBoDqDDPE78XeYuX+m6duAeQtHi7ek0dkKeFcpVdnu+QCl1DBgBJZJDTrFOcKNaa0ZvX40YzeNNcR9lA/ftPuG8a3Gm7IfqbsaXHcwa/qtoWDugob4tD3TCJsfxp34O/d8jWrVoK3d0JmPPnJmlkJ4B63h44+NsQEDoEQGdsK+evsqrWe0ZsWRFcmx2IRYhi0fluFfxLyFXy4/pnaaythmY5NjD5V+iBldZ3jk2p6eyNH/hRdYv2osG84ftHt+H/ANlhmpST/JuQ6+l8hGL6x+gY/+MFYOgb6WAbreOjHhXlqUa8HGgRspkdf4P8SSv5fQflZ7bsbeTOdMm1deMbZ/+QX++ceZWQqR823cCLt22dpKwUupJ0qmcvnWZVr81IIt/24xxMsVKseqvqtyzNptzqSU4u3Qt5naaSpVi1Vlae+lXt8jk50cLd7mAnvTeR0F+GNbA04Du4AlDr6XyEZ1SxonIBTMXZBfn/yVTlU6mZSRZ6hzXx02D9pM2YLGQcwbTmygw+wO9yzgmjeHevVsba3hk09ckakQOZf9XbdOnaBKlbufE3krkpY/tWTPhT2GeK2gWmwZvIUKRSo4OcucZXDdwewdvpfieTO8C6ZwAoeKN611ItAdOI2xSLN/KOsxYVo6wj3CwDoD+brd14BlKZANAzbQuEzje5wlwDIDbcvgLTxY/EFDfOPJjfcs4JSCUaOMsZ9+gouyhJIQGfLXX7BypTFmf0fbXlLhtvfiXkO86QNN2TRwEyXzl0znTJGSfy7/dJ+7EH1BxsG5gMODl7TWx7EsvDsJiMG2RVbSI8b6XEOt9cksZyqyzYgGI/im3TdsGriJeiXr3fsEkaxUgVL8NvC3VKuSZ6SA69EDgoNt7ZgY+PJLFyUqRA7z6afGdqNG0KRJ+sdH3IygxfQW7Lu4zxBvHtyc1X1XUyhAVrfKqj0X9lDz25q8Ff6W2ankOFkaeW7db3Q4UBh4FOgF9MayKX0RrfVwrXVE1tMU2e2ZBs9QvUR1s9PwSEXzFGX9k+tTFXAHLh3g3xv/pnuer2/q8TnffAPR0a7IUoic4/x5+PlnY+yVV9JflPfq7au0mtGK/Zf2G+ItyrVg+RPLyeufN+0TRYZtP7udFtNbEHkrkvd+f4/3fnvP7JRyFKdMG9Rax1g3lJ+vtZ6ntf5da33vaXbCNFpr1hxdI7ezXaRIYBFDAVcsTzE2PLmBqsWq3vW8wYMta78luXo19UrxQgijL7+E2BQriZYvD127pn1sdGw07We1T3XHrVX5Vizrs0wG3TtBbEIsYfPDuHrnanLszfA3+WiLTKN3FlnzwUu9Ff4Wj898nNHrR0sB5yJJBVybCm3Y8OQGagbVvOc5efPCiBHG2MSJEC8rFQiRpuho+PZbY+yllyBXrtTH3om/Q9e5Xdl6xrh7QusKrWW2pBP55/JnXtg88vvnN8RfXf8qX//5tUlZ5SxZmv+slKoG9ABqYtn+6m6vp7XWLe/yvMgmn279lPd+t9zC/uiPj7gTf4fPH/9c1udxgSKBRVjdb3Wmzhk50rLOW0yMpX3qFMyfD336uCBBITzc99/DtWu2dpEiMHBg+sfn9TN2iT7ywCMs7rWYQL/AdM4QjmhYqiGr+62m9YzW3IyzjfV9btVzFM9bnJ7Ve5qYnedz+M6bUupDYD8wFsvM05ZYxrql9Qi1PoTJZu6byctrXzbEZuybwanrp0zKyLvFJaTehT4oKPWWWR9+aFk+RAhhc+dO6iV1Royw3MFOS4BvAPPD5tOvVj8AQkqGsPyJ5XLHzUUeLvMwK55YQaCvrTDWaPot6sf64+tNzMzzOVS8KaWGA69Yz5fbNR5i7bG1DPxloCGWzz8fa/qt8fp9Ss1w/c51Wv7Ukk/+SL2g28svGwdb79kDa9ZkY3JCeIDp0y2TFZLkyQPPP3/3c/xy+TG9y3Tea/4eq/utpkDuAq5N0ss1C27Gol6LDAsdxyXG0WVOF3ac22FiZp7N0TtvQ61fU67ndreHMNn2s9vpNrebYZsXPx8/FvdaTMNSDU3MzDtF3Iyg+fTm/H76d15Z9wrz/ppneL5yZejSxXjOe+/J3TchksTHwwcfGGPDhkGxYvc+10f58Pqjr1MsTwYOFln2eMXHmdZ5miF2M+4mbWe25fDlw+Yk5eEcHfNWBVvRpoFlwGHgNpDgnNSEsxy5fIR2s9oZxh0A/NT1J1qVb2VSVt5La037We3ZfWF3cqz/4v7cn/9+mj7QNDn2n//A4sW287Zsgd9+g2bNsjNbIdzT3Llw4oSt7ednuWOd0q24W9Il6ib61urLpZuXeGmtbT2kyFuRtJ7Rmm1Pb+O+fPeZmJ3ncfTOm3UoNRoYrbXurLUepbV+S2v9TnoPJ+UsMiHyViRtZ7Yl8lakIf7545/Tu0Zvk7Lybkopxrccj5+PX3IsNiGWznM680+kbUPT+vWhTRvjue+/n11ZCuG+EhNh/HhjbOBAKFXK1t7671bKfV6OdcfWZWtuIn0vNn6R0U1GG2Knrp+i0+xO3Iq7ZVJWnsnR4m0ntu7Q5U7KRThZTHwMXeZ04djVY4b4mCZj+L9G/2dSVgKgZfmWTOk0xRC7cvsKbWe25WK0bU+sN94wnrduHfz5Z3ZkKIT7WrbMsh1WEh8fePVVW/vI5SN0nN2RSzcv0W5WO6btmZbtOYq0jW85nkF1Bhli289tZ/S60emcIdLiaPH2VYrv6zsjEeFcWmsGLx3Mln+3GOIDag9gXMtxJmUlUnqy9pO8G/quIXbi2gk6zu6YvI1W06bw6KPG8+Tum/BmWsM4u4+wXr2gYkXL9xE3I2g7sy2Xb18GID4xnkG/DGL3+d0I8ymlmNRxEm0q2LoVGpVqxBuPvnGXs4Q9Rzem/wXLvqUK+Fwp9YRSKo0lEYVZ3t30LrP2zzLEmgc3Z1LHSbKemxt549E3GFxnsCG2/dx2+i3uR6JOBOD1143nLF0K+427+gjhNTZsSH33ecwYy9eY+Bi6zeuWqrfhzUffpG5J43Z1wjy+Pr7MC5tHzRI1CXswjPAB4QTlCzI7LY/i6FIhG4CqWMa8FQZmAJFKqT1KqQ3pPH51Yt7iLnac28HYTWMNsSpFq7Cw50L8c/mbk5RIk1KK7zp8R+sKrQ3xJX8v4c0NbwLw2GPQoIHxPPs7D0J4C/u/+x07Qq1alt6GZ1Y8w+bTmw3PD6g9gHdCZci1uymQuwDhA8KZ02OOLJDsAEe7TUOBR6zfJ806LQjUQhbpNV39++vzxeNf4KMsP96igUVZ/sRyCgcWNjkzkRa/XH7MD5tP7aDahvi4zeOYtX8WSqW++zZ3LhyWGfbCy2zdarnzltJ//mP5OnHbRH7c86PhuRblWkhvgxsrmqdo8v9TInOc9aemUzyyRCn1g1LqklLqQIrYWKXUWeudvT1KqXZZfZ+c7rlGz7G091KKBhZlSe8lVCxS0eyUxF0UyF2AZX2WEZTX2HUw+JfB/Hn2Tzp2hJoptkbVGiZMyOYkhTDZ2LHGdvPm8NBDsPLISkatG2V4rmKRiswPmy+9DR7qXNQ5rt6+eu8DvVRWird7Lczr6CK904DH04hP1FrXsT5WOpq0N2lfuT0nXzhpWDtMuK8yBcuwpPcSw382MQmWGcPno88m32FIMmOGcZ0rIXKyP/6AtWuNsTfegIMRB+m9oHfyGFGAgrkLsqzPMooEFsnmLIUzbDuzjfqT6tN7YW/DwvLCxtFFel02gEBr/ZtSKthVr+9t8vnnMzsFkQkPlX6IyR0nM2CJbXPTW3G3OH71OGFhpXjrLThyxBKPj7fMPJ0yJZ0XEyIHecfuf51HH4WajSJ5aGpHomKjkuM+yoc5PeZQtVjVbM5QOMP0PdMZunwosQmxnI8+z5j1Y/i49cdmp+V2HCreTFpwd6RS6klgB/Cy1lrup1odijhEteLVzE5DOMmTtZ/kwKUDfPTHR1QqUollfZZRpVgVwHKnIeWm9dOmwWuvQYUK5uQqRHZI667bm2/H0XNBGMevHjfEP239KY9XTKvzRri7hMQEJu2aRGxCbHLsk62fUDuoNv1r9zcxM/ejtBtulmi987Zca13D2g4CIrGMqfsvUFJrPTidc4di3Xs1KCgoZM6cOS7NNTo6mnz5zLu79eeVP3lt/2t0K9WN4RWGkyubV2wx+/rN5MprT9AJ/HzqZ7qV6kZ+v/y2eIJi0KAG/Puvbcuf1q0v8Nprf7skj7uRn71ce3YZNaoWO3bYukBr175GpZFDWHB2geG49ve15+XKL7t0goL87F177VdirzBs5zAiY227AvkpP76o8wVVC5h7NzU7rr958+Y7tdb3XD83Q8WbUirlcvw/aK2jM5KEUqo48L21qbXW3TN4XjApireMPmevfv36eseOHRl5S4dt3LiR0NBQl75Heo5eOUqDyQ24ducaAC3LtWRuj7kUzVM023Iw8/rNZta1z5oFffva2j4+cPAgVKmSvXnIzz7U7DRMkd3XvmWLZbHqlNb9GseHZ9uz7rht66tHyz7Kuv7rXD5BQX72oS5/nx3ndvDIj49wJ/5Ocuz+/PezY8gOSuYv6fL3T092XL9SKkPFW0YnLHwGTLQ+DCNAlVIJ1ke8UuoBu/PyAF2AztavDlFKpfxpdQUOpHest4iKiaLznM7JhRtA+Mlw9lzYY2JWIjv06gXVUvSSJybCu++mf7wQnsx+hmloKLRq4ceqvqsY08SyOm+ZAmVYELZAZpbmEPXvr8/kjpMNsXNR5+g+r7uhS9WbZWa2aXr3oTMyqzTD97CVUrOBrUAVpdQZpdRTwIdKqf1KqX1Ac+DFjL5eTqS15sklT3Iw4qAh/kGrD2hZvqVJWYnscjP+BpVHjAFf22+ls2db7r4JkZNs3gzr1xtjScVcLp9cjG81ngVhC1jYcyHF8xbP9vyE6/Sr1Y9XGr9iiG09s5WX17xsUkbuxdHZpvacNnBOa90njfBUZ71+TvDJ1k9Y8vcSQ6xvzb683Fj+Uud0ByMO0nVuVw5fPkyhvpe4Nn0qoNDaMhtv7lyzMxTCed5+29hu3hyaNTPGuj+YodE4wgNNaDWB/Zf2s+bYmuTYV9u/4qHSD9G3Vt+7nJnzOWuRXlm+OptsOb2FMevHGGL1StZjcsfJsop4Dvf7qd9pOLkhhy9btla4Vu5HCJmU/Py8ebLnqcg51q9PvZuCfTEncrZcPrmY1X0WwYWCDfEhy4aw/6J3f9jJvhQeJOJmBL0W9CJBJyTHCgcUZlHPRbI3nBeoFVSLUgVKGWKq/XNQelty2358kBCeSGuMi1JXWkGd7mtS3XUTOV+RwCIs7LmQ3LlyJ8dux9+m27xuXL9z3cTMzCXFm4dI1In0W9yPs1FnDfGfuv5E2UJlTcpKZKeCAQVZ3Gsxef3yJse0Txz07AF5LwKwaBHs3GlWhkI4x5IlsH27tVH0MHR/gr012zLu93GGnRSEd6hXsh7ftP/GEDt65SgDlgzw2r8PUrx5iHG/j2PtMeMqla8+/CodKncwKSNhhgeLP8iPnY2bb1PgLIT1Ah/LNjKvvWZCYkI4SUKCZTFqAPxuQc/uEHADjeb1Da/Ta0Ev3HF9UuFag+sOZki9IYZYxK0IomKi0jkjZ8tM8Zb0r2WOUmpD0sPuGPvnZjsnTe8WfiKctzcaB3s0faAp77V4z6SMhJnCqocx6mHjJtwEb4LmbwKwbh38+qsJiQnhBD//nGLmdLtnIci4MtQjDzwi43u91BdtvyCkZAgA/9fw/wgfEE7BgIImZ2WOzM42VUCjTD6nkQkNDrsQfYE+C/sYbg0Xy1OMOd3n4JfLz8TMhJnGtRzHjnM7CD8Zbgs+MgFON4Uj7RkzBv78E+T/OOFJYmJSTEqo8yPUnWZ4vk+NPjzX8Llsz0u4hwDfABb2XMjWM1vpXaO32emYKrPdpmndq9YpHsLJfjv1G5G3bNuEKBQzu81MNXBdeBdfH1/m9JjD/fnvNz7RrT8UPMWOHbBgQdrnCuGuJk2CU6eAoH3QfoThuarFqjKp4yS56+blyhYq6/WFG2S+eFMOPoSDelbvycaBG5P/k37j0TdoXaG1yVkJd1AibwnmdJ9j3M828Kpl/FuuWF5/HeLizMtPiMy4eRPeew/wj4KwMPCzLUId6BvIgrAF5PP3zj1FhbCX0W7T35A7a6Zp+kBTdg/bzefbPuftZrLQkbB5pOwjjGs5jtHrR9uCpf8HrUZzZM1EfvgBhg0zLz8hMurTT+HSJQ09hkCxw4bnvm3/LdVLVDcpM+Eptp3ZxrU713i84uNmp+JyGSretNahLs5D3EOJvCV4v+X7Zqch3NArD7/C76d/Z/nh5bZg48/gdFPeeac7/ftDnjzm5SfEvVy4AB98ADT4FmoYtwl5qu5TDKgzwJzEhEfQWvPZts94df2r5PPPx+5hu1Mt7JvTyFIhQng4H+XD9C7TeaDgA7bgxZpwqQbnz8Nnn5mXmxAZ8fbbcLPgDmhj3La6VlAtvmz7pUlZCU+gtab3wt68tPYl4hPjuXbnGr0W9MrxG9hL8eZmVhxeQVyCDFQSmVMksAjzeszDz8ePmvGDYMo2uFwFgAkT4OJFkzhHYMoAACAASURBVBMUIh1//QWTf75qGefma/sPN79/fuaHzZfdY8RdKaVocH8DQ+zPs3/y6rpXTcooe0jx5kaW/rOUDrM7EDo9lDM3zpidjvAwjUo3Yt8z+9j00g8UzmfrJ42Kkj0hhfsa9apGdxoEhU8a4lM7TaVy0crmJCU8ysuNX6Zj5Y6G2Of/+5xFhxaZlJHrSfHmJk5eO8mAJZZxHX/8+wd1v6/Lr8dlpVWROVWLVaVw4dTF2uTJsmm9cD/r18OqVYmWbv4Unmv4HGHVw0zKSngapRTTukyjbEHjVpGDfxnM8avHTcrKtaR4cwOxCbH0nN+Ta3euJceu3bkm3QXCYc88A5Uq2dqJifDyy5YNv4VwBwkJ8MorgM4F4f+Fn1fhG1uUBvc34KPHPjI7PeFhigQWYW6Pufj52Bavvx5znZ7zexITH2NiZq4hxZsbGLV2FNvPbTfEJrScwMNlHjYpI+Hp/P3h449TBIL2sa5INxYvv2laTkKkNGMG7N2bInD0cRa13s38sPnk9s1tWl7CczUq3YgPH/vQENt5fievrH3FpIxcR4o3ky04uIAv/vzCEOtcpTMvNX7JpIxETtGxIzRvoaHeFHi6EVRbzOAFI2XhXmG66Gh4/XVjrE8f6NisDGULlU37JCEy4PlGz9O1aldD7KvtXzH/r/kmZeQaUryZ6OiVowz+ZbAhFlwomB87/yhbwIgsUwqaPjcFOg1JXq3+evlpDPriR5MzE95u3Dg4d87W9ve3xITIKqUUP3T+gXKFyhniTy19iqNXjpqUlfNJ8WaS23G3CZsfRlRsVHLMz8ePeT3mUTiwsImZiZzk1XZ9KBhX1RCbefVZthw9YFJGwtvN+WMzH259H1RicuzFFyE42LycRM5SKKAQ88Pm45/LPzkWFRtF2Pww7sTfucuZnkOKN5O8sPoF9lzYY4h92uZTGpRqkM4ZQmRePv98LHliPsSlmPzid5uO08OIjo02LzHhlSJvRTJoRW8SQt+Avm0h7yXuvx/eeMPszEROE3J/CJ+2/tQQ23NhDy+ufjGdMzyLFG8m+Hnfz0zaNckQC3swjGcbPGtSRiInC32wBt1yf2OIXfX9m14zhqNl+qnIJok6kbaTnuSO/1lLoOJaGFaPseOvk0/2mxcuMKLBCMIeNC45E+AbQKJOTOcMzyHFWzY7FHGIYcuNO4VXLFKRKZ2myDg34TIzRw0k39GBhtjKMzOZvGuKOQkJrzPht4/YcX2VIXb/5b483b+gSRmJnE4pxZROU6hYpCIFcxdkUc9FTHx8Ij7K80sfz78CD3Iz9iZh88O4FXcrOZY7V24WhC2gQO4CJmYmcrqAAPgx7Gu4VN0QH7niuVTd90I42+bTm3lzo9300tMPs2jke8jvrMKVCuQuwOJei9k1bBddq3W99wkeQoq3bHT6+mnDQrwAX7b9ktr31TYpI+FNenTKQ7NL8yE2b3IsTsfQfW4YN2JumJiZyMkib0XSc15vEkmwBW8V4Qn/OTSq75f+iUI4SY0SNShfuLzZaTiVFG/ZqFrxauwetps2FdoA0K9WP56u97TJWQlv8sMH1fBd/b0hdvzaUYYsGyLj34TTJepEnlz8JOdvnjXE866bzuf/LWNSVkJ4Prcr3pRSPyilLimlDqSIFVFKrVNKHbF+9di1NIrnLc7Kviv5qu1XfNv+WxnnJrJV+fLwnw59YecQQ3zeX/P4dse3JmUlcqqP//iYVUeN49zYMooJgztQrJg5OQmRRGvNxK0TORRxyOxUMs3tijdgGvC4XWwM8KvWuhLwq7XtsXyUD882fJZ8/jLFSmS/MWPggYOfwwVjd/2La16U8W/Cabac3sJ/fv2PMfhvY2pHvs/w4ebkJESSq7ev0mVuF15a+xJh88O4GetZWwe6XfGmtf4NuGIX7gxMt34/HeiSrUkJkYMEBsIXnwTC/HkQY/sFomHu/lQuWtnEzEROEXkrkt4Le5OgjePcWDCHSd/54etrXm5CRNyMoN6keiz9ZykAf0X8xchVI03OKnPcrnhLR5DW+jyA9WsJk/PJkMWHFvPv9X/NTkOIVDp1gnaNKsPSKRCbBxZP58C4Kdy4nMfs1ISHS9SJDFgygDM3zhifWDKdZ/s9QMOG5uQl/r+9+46Pqkr/OP55Qm8qglIsgAUVKYuAuhYEUcSKuEvRdS2oKK64uuJaV/nZdi3YC4oCCgoYBBZQpEgUFgVEQIqAINKbAgKhJzm/P+4NzEwmyQjJ3JnM9/163VfmnnPuzHPmZjJPbjlHclWvWJ3zjj8vrGzAnAEMmDMgmIAOgiXiRcpmVhcY45xr6K//5pw7IqR+i3Mu6nVvZtYN6AZQo0aNZkOGDCnWWDMzM6kcZYTJxdsX02N2DyqUqsDDpz7MWdXOKtY4gpJf/1NBsvd9/fry3HxzC3aX/gUyawLQqtVGHn/8h5i2T/b+Hwr1Pf++D145mHd+Dh+EnKk9qTbrKQYMmEHlytnRN0wS2vclo++7sndxx6w7WLlz5f6ycmnleOuMt6hXqV7UbeLR/9atW3/nnGteaEPnXMItQF1gfsj6YqCW/7gWsDiW52nWrJkrbhkZGXnKtuza4k545QRHL/YvT331VLHHEoRo/U8VJaHvvXs7B+HL6NGxbVsS+n+w1Pf8jV0y1lV+ovqBv3+3nO1I2+uGDo1PfMVN+77kmLdhnqvwVIWw7+pTXz/Vbd+zPWr7ePQfmOliyG+S5bTpKOBG//GNwH8DjKVAzjluGnkTy7YsCys/6ciTAopIJH933w3NmoWX3XknbN/uPXYJeGReEtsZh7Wj9LtzYMX5sKsqDBtKu7Zl6Nix8G1F4qnh0Q158/LwqQMX/bqI7p92T/i/fQmXvJnZYOAb4BQzW21mtwD/AS42syXAxf56Qur9TW/+uzg8t7yz+Z10btg5oIhE8le6NPTtC6VKHShbtQoe/Zej73d9ufaTaxP+j5gklr/9DX5beQy8Pwn6TaH8nuN54w00k4IkpJv+cBM3/eGmsLJBcwfx3uz3ggkoRgl3z49z7tp8qtrENZCDMGXFFB6cGD6KSfPazXnxkhcDikikcE2bwr33wgsv+AVlM3l1ZXcYMwiAFrVbcN859wUXoCSN9HQYNsxfySkNv5xOr/944wuKJKo3LnuDb9d8y4JfFuwv6zG2B2cecyaNazQOMLL8JdyRt2S1IXMDnYd1Drs1vmr5qqR3TKdc6XIBRiZSuF69oF7uNbpX3AFNBu2ve2DiA3y96utA4pLk8csv3lG3UM2bw33K+yXBVSxTkfSO6VQqc2DqwN1Zu+mY3pHte7YHGFn+lLwVgeycbK4bfh3rMteFlQ/sMJC6R9QNJiiR36FSJejTx1+Z9BTs2n9zN9kum87DOvPrzl+DCU4S1ppta+iU3okNmRu4+24vgctVpgz074/GdJOkcNpRp9Hnij5hZT9u+pFuY7ol5KUjSt6KQK8vezHp50lhZQ+d9xCX1788oIhEfr+2beGWW4Df6sLI98PqVm9bzQ0jbiDH5QQSmySefdn76DSsE+k/pHPaK00Z8vWUsPrHHoOGDQMKTuQgXN/4em5tGj7f+JD5Q3j7u7fz2SI4St4O0fRN03lqylNhZa3qtuKJ1k8EFJHIwevdG447Dlh8FXwdfr5r7NKxPDf1uWACk4Tzzwn/3H86fUvWOripNRz7DeBdR/nAA0FGJ3JwXr301bDr3I4ofwS1q9QOMKLolLwdghW/reCZRc+EldWsXJPBfxpM6TSdK5Dkc/jh0K+fvzLx37Dqj2H1j056lCkrpuTdUFJK+oJ0Xp7+cnjhsotgzVmULu2dLi1TJpjYRA5FhTIVSO+YTuWylWlRuwWzus3iqlOuCjqsPJS8HaS92XvpNKwT27K27S8rZaUY+ueh1KxcM8DIRA7NRRdB9+5AThlIH+rNSenLdtl0+aQLG3dsDC5ACdTKnSvpOqpreOHW42D4IHBpPPIINGkSTGwiRaF+tfpMumESU26eQr2q0WdbCJqSt4O0O2s3R1U8Kqzs6QufpmWdlgFFJFJ0nnvOH95h23EwYmBY3drta+kyLGLScUkJO/bu4PEFj5O5N/NAYXYZ+HgY7KxOkybw8MPBxSdSVFoc0yKhR4pQ8naQDit3GKOuHcVt9W4jzdK4sv6V3H/u/UGHJVIkKlf2Tn2ZAUsugynh4xdmLM/g7WWJdxGvFB/nHHd8egfLdy4Pr/j8ZVhzJuXLw0cfQdmygYQnklKUvB2CNEvjuuOvI+PGDN6/+n3STG+nlBwtW8I99/grGU/C8gvC6tNXpzN43uD4ByaBeH3G6wyaOyi8cO518G13wDta26BBAIGJpCBlG0WgZZ2WVK1QNegwRIrcM89A48Z4o+WnD4Wtx4bV3zr6VtZnrg8mOImbL5d/yb3j7g0v3NgARr8DGJdckneAXhEpPkreRCRf5cvD4MHeT3bUgKHDIcu7DqR8WnkGtB+gG3RKuJVbV9IxvWP4NY57qsDHn8C+SlSr5t2hnKZvE5G40cdNRArUoAG89JK/srYFfPombDqJC5f9l46ndww0Nileu/btosPQDnln1xg+CH49FYB33oHaiTcMlkiJpuRNRAp1++1w9dX+yuyu8NZcPhvQlrFjAw1Litmjkx5l1rpZ4YUZ/+cN4gzcdhtcc00AgYmkOCVvIlIoM3j33ZAjLFkVALj+elixIri4pHg9dP5DXFjvwgMFC6+GyY8C0KgRvPJKQIGJpDglbyISk2rV4MMPw69t2rwZOnWCPXu89eycbFZtXRVMgFLkqleszrD24zhi4b3wy2kw4gNwaVSqBOnpUKFC0BGKpCYlbyISs1at4Omnw8tmzID77oNte7bRfkh7zu13ru5ALSGcgzu6lea3oS9C3xmwtwoAb78Np5wScHAiKUzJm4j8Lv/8J1x5ZXjZGx8up+GL5/Lpkk9ZtW0VVw+5mt1Zu4MJUIrM88/Dxx/7K3srA3D55Wv5y1+Ci0lElLyJyO+Ulgbvvw+1au06UNjsHVbtnb9/dfqa6dwy6haccwFEKAcjKyeLpZuX7l8fPx4eeii8TaNG0KPHUkQkWEreROR3q1oVevVaQLncqf8ynoClbcPafDTvI56e8nTejSXhOOe4e+zdNHunGeOWjuOnn6BLF8jJOdCmalUYMQLKlcvJ/4lEJC6UvInIQalfP5PXXvNXckrDsKHwy6lhbf6V8S+G/TAs/sHJ7/L6jNd5a+ZbbNuzjcs/upyW973Jli0H6tPSvMGaTzwxuBhF5AAlbyJy0G67Dbp391d2HwGDR8POI8Pa3DDiBmaunRn/4CQmY5eM5Z5x9+xfz3bZrK33LJTdvr/smWfgkkuCiE5EolHyJiKH5JVXvLtQAdh8kjdtUnbp/fW7snZxxUdX8POWnwOJT/I3d8NcOg/rTI4LORW6pzJ8NGb/naWdOnk3qYhI4lDyJiKHpEwZb8yvevX8guWt4NO3wtps2LGBdh+2yzvNkgRm5daVXPrhpWzfe+AIGzlpMGwIbGwEeDco9OvnDdIsIolDyZuIHLLq1WHUKKhc2S+YdStM7RnW5sdNP3Ll4CvZuW9n/AOUMJt3babdoHas3b42vGJ8b1hyOQA1a8KYMVCpUgABikiBlLyJSJFo2BAGDQo5SjPxWZjXJazNtNXTuPaTa8nKyYp/gAJ4k81fNfgqFv66MLxi2t0w7e+AN3PC6NFw/PEBBCgihUqq5M3MlpvZPDObY2a6AlokwbRvHzLfpUuDkQPg59ZhbUYtHkXP8T3zbCvFLzsnm+uGX8fUVVPDKxZ0hHEvAYaZNw1a8+aBhCgiMUiq5M3X2jn3B+ec/rSIJKAePaBnbm6WXQ6GjIANjfbXH13paK5vfH0wwaUw5xx3fXYXIxeNDK9YfsH+OUsBXngBOnQIIEARiVkyJm8ikuCefdYb5BWAPYfDoLGw9Tgq7jqJjOu/pnlt/e8VT845/jnhn/T5rk94xcbTYchIyCoPwJ13wr33BhCgiPwuyZa8OWC8mX1nZt2CDkZEoktLgwED4IIL/ILtx8AHE9j5+lQevuNE9u0LMrrUM3zhcF745oXwwq3HwqDPvfH5gM6d4dVXdWepSDKwZJp70MxqO+fWmtnRwASgh3NuckSbbkA3gBo1ajQbMmRIscaUmZlJ5f232KWeVO5/KvcdYut/ZmZp7r23CUuXVgkrv/DCDTz88EJKlSrOCItPsu37bJdN7x97M3b9WK9gR3UY8BX80gCAM8/cxFNPzadMmcK/D5Kt70Utlfufyn2H+PS/devW38V0WZhzLikXoBfQs6A2zZo1c8UtIyOj2F8jkaVy/1O5787F3v+NG5077TTnIHzp2tW57Gyvzaadm9zEnyYWX7BFLBn3/Y6d2e742+92PHi4o+as/fvhnHOcy8yM/XmSse9FKZX7n8p9dy4+/QdmuhhyoKQ5bWpmlcysSu5joC0wP9ioRKQwRx0FEybACSeEl/frB127wprfNtBqQCsu++gyRi8eHUyQJdyuXdDh6jRWvv0yvPU9rG8KeIPwaiw3keSTNMkbUAP4n5l9D8wAPnXOfR5wTCISg2OOgS++gGOPDS9/f8QqTnuuJfM2zmNv9l6u+fgahi8cHkyQJdSuXd4QLuPHAxhsrQNAgwZeUl21aqDhichBSJrkzTm3zDnXxF9Od849HXRMIhK7unW9BK5WrZDC46eyvdyP+1ezcrLolN6JofOHxj2+kuK16a/Rb3Y/ALZtg8sv95K0UKefDhkZUKNGAAGKyCErXXgTEZGiUb8+TJ4MbdrAypXA/C5QNhOu7AbmXSyf7byBZPdm7+WvTf4abMBJ5oWvX+D+CfdjGDszy9Dv739l9uzwNo0aeUn0UUcFE6OIHLqkOfImIiXDSSd5CdyJJ/oFs26Fkf3BHRijIsflcOPIG3l9xuvBBJlknHM8lvEY90+431vH0WPiTczeG34Es3FjJW4iJYGSNxGJuzp1vATu1FP9gu9vhOGDIOfA2CEOR4+xPXjki0dy7zCXKLJysrht9G08OfnJ8IrssrDryP2rZ50FkyYpcRMpCZS8iUggateGr76Cpk39gnnXwbDBkB1+Nccz/3uGW0bdwr5sjewbaee+nXQY2oH3Zr8XXrG3Inz4GSy7GIB27bwjbtWqBRCkiBQ5JW8iEpijj/YSuHbt/IIfOsLgUV7yEaL/nP5cPfRqMvdmxj/IBPXrzl9p80Ebxvw4JrxiZzX44AtY3hqAv/wFRo3ScCAiJYmSNxEJVJUqXnJxyy1+wdJL4f0MbxaAEJ8t+Yxz3juH5b8tj3uMiWbuhrm06NuCaaunhVf8VgfemwqrzwagZ0/44AMoUyaAIEWk2Ch5E5HAlSkDffvC//2fX7DmTOg3FbbUDWs3b+M8Hpz4YNzjSyQjF42MnsSubwLvfQ2bTqFMGXjvPXj+eW+eWREpWfSxFpGEYAaPPQbDhvmn+DbV95KRdU33t6lV9iTevPzN4IIMUI7L4YmvnqDD0A7s2LcjvHLZhdD/K9hem2rVvHHdunYNJk4RKX5K3kQkofzpTzBtmj+dVmYt6DcFfvgT7D6MdS+O4tH7jmTXrqCjjL8uw7rw+JeP5634tjsM+hz2HE6jRjB9OlxwQfzjE5H4UfImIgmnYUP49lv/RoZ9lSD9Y+j7Lfx6Gm+9BWecAd98E3SU8dXp9E7hBdmlYcyb8OmbkFOGm2/2kt794+eJSIml5E1EEtKRR8Knn8Jzz0HpUmneaVTfokVw7rnwj3/Azp3w4dwPefZ/z5KVkxVgxMVn82YY//KfYcadXsGO6jBwPMzsTvny0K+ft1SsWPDziEjJoOmxRCRhpaXB/fdDq1Zw7bXw008H6pyDl16C9IxF/HrN7ezO2cHwRcPp374/DY5qEFjMRck5727R+++HX34BSvcGy4HJj8L2Y2jSBAYO9Ka8EpHUoSNvIpLwWrSAWbNChhPJVXoXq//Yid053gX8M9bMoOnbTXlq8lPsztod/0AP0fY923lo4kOs2rqKmTO9a9duuslP3ACyysOnb5G24xgefhhmzFDiJpKKlLyJSFI47DB4910YP96bXguAo+dDlTVh7fZm7+VfGf/i9DdPZ+SikUkxtZZzjoHfD6T+6/X5z9T/cOaT3WjRwjFlSt629evD1Knw9NNQtmz8YxWR4Cl5E5GkcvHFMH8+9OgBaetbwBs/wMIOedot27KMDkM7cMmgS/hu7XcBRBqbST9P4px+53DDyBtYn7kegPVVPoc/DAhrV748PPkkzJ0LZ58dQKAikjCUvIlI0qlcGV59FWbPhlYtasDQT7x5UXfmnbxzwrIJNO/bnKsGX8WsdbMCiDYv5xyTV0zmwvcvpM0HbfLOlADwx5e869uAyy6DBQvg0UehXLk4BysiCUfJm4gkrcaNYdIkGDbMqJvZBV77EabfBTml8rQd/eNomr3TjAv6XciIhSPIzsmOe7z7svfx4dwPOaPPmVww4AIylmfkbZRVFiY/Au9+Q9M/pDFuHIwZ4497JyKCkjcRSXJm3sC+ixfD2y8fyfELXoM+c7xZB6KYvCqDaz6+ht5DviUzDvPcO+eYuXYmd4y8h+r/PpbrR1zPnI0zozde1B7e+IETVzzF4A8qMXMmtG3r9VFEJJeSNxEpEcqWhW7dYMkS6PNEQ+pOmQgDP4fVZ+VtvLYZD/zlLKpVgzZtvDlAp0+H3bu9aaiKwq5d8NVXcPIT7WjRtwVvf/8K27I3Rm/808XQdxpNF49k8JsnsmgRdOmieUlFJDqN8yYiJUrZsnD77XDrrcZnn13CK6+25Ysvx8H5z0Ad//bN6XcDxt693mnXSZO84tJlcrB/1OGwtBrUK38GDY9uzKk16lC/5nGcckxNjqxSkcrly7M3K5u1m7eyfvN2Vm36lbmrfuaozFZsWlOVBQtg3jxvIOGsLKDdqXD2+LyBOoMfr8C+6cmlDVpyT3+46CIdZRORwil5E5ESqVQpuPJKuPJK44cf2jFwYDsGjPye9bXehfmdo26TVX0OVFjNJlazyX3HzA3ABmBulMZTI9bf/wJ+jnKqdumlcParB9Z3Hw5zr+e4NX/n9o4nc+NzcOyxB9lJEUlJSt5EpMRr0AD+/W94+ukmfP31aww9EcaODZ+xAYATJhz8ixyxPHr58gu8hG1FS47d/Feua3Ylf+5VnmbNdFpURA6OkjcRSRlpaXDeed4CsHQpjBvnXZv27bewvOacg3/yI37OU1S3LrRsWYFzTtzIRbeW1aTxIlIklLyJSMo66SRv+dvfvPWNGweTMeNlJi+ZzZwNs1m1YylbWcWu0qvIKrsJV2o3lN7ljb+2rzJpWZUote9wKu6rw8knnsD5f/Cer1EjaNgQqlbNfSVNhSAiRUfJm4iI7+ijofMVNehMO6Bdvu0yMjJo3bp1/AITEQmRVFdcmFk7M1tsZkvN7MGg4xGR1GS6JVREApQ0yZuZlQLeAC4FGgDXmlmDYKMSERERia+kSd6AM4Glzrllzrm9wBCgfcAxiYiIiMRVMiVvxwCrQtZX+2UiIiIiKSOZbliIdpGJy9PIrBvQzV/NNLPFxRoVVAd+LebXSGSp3P9U7jukdv/V99SVyv1P5b5DfPpfJ5ZGyZS8rQaOC1k/Flgb2cg59w7wTryCMrOZzrnm8Xq9RJPK/U/lvkNq9199T82+Q2r3P5X7DonV/2Q6bfotcLKZ1TOzskAXYFTAMYmIiIjEVdIceXPOZZnZXcA4oBTQzzm3IOCwREREROIqaZI3AOfcZ8BnQccRIW6naBNUKvc/lfsOqd1/9T11pXL/U7nvkED9N+fyXPMvIiIiIgkqma55ExEREUl5St5iYGYdzWyBmeWYWfOIuof86boWm9kl+Wxfz8ymm9kSMxvq33CRlPz45/jLcjObk0+75WY2z283M95xFgcz62Vma0L6f1k+7UrcNG5m9ryZLTKzuWY2wsyOyKddidrvhe1LMyvnfyaW+p/xuvGPsuiZ2XFmlmFmC/2/fX+P0qaVmW0N+Tw8FkSsxaWw32XzvOrv+7lmdkYQcRY1MzslZJ/OMbNtZnZPRJsSte/NrJ+ZbTSz+SFlR5rZBP97e4KZVc1n2xv9NkvM7Ma4Be2c01LIApwGnAJ8CTQPKW8AfA+UA+oBPwGlomz/MdDFf9wH6B50n4rofekNPJZP3XKgetAxFnF/ewE9C2lTyv89OAEo6/9+NAg69iLoe1ugtP/4WeDZkr7fY9mXwJ1AH/9xF2Bo0HEXUd9rAWf4j6sAP0bpeytgTNCxFuN7UODvMnAZMBZvDNKzgelBx1wM70EpYD1QpyTve6AlcAYwP6TsOeBB//GD0f7mAUcCy/yfVf3HVeMRs468xcA5t9A5F22w3/bAEOfcHufcz8BSvGm89jNvBusLgWF+0fvA1cUZbzz4/eoEDA46lgRTIqdxc86Nd85l+avT8MZZLOli2Zft8T7T4H3G21gJmLXeObfOOTfLf7wdWIhmtInUHvjAeaYBR5hZraCDKmJtgJ+ccyuCDqQ4OecmA5sjikM/2/l9b18CTHDObXbObQEmAO2KLdAQSt4OTSxTdlUDfgv54isp03qdD2xwzi3Jp94B483sO3/Wi5LiLv8USb98DqOnwjRuXfGOOERTkvZ7LPtyfxv/M74V7zNfYvingpsC06NU/9HMvjezsWZ2elwDK36F/S6nwme9C/n/g16S9z1ADefcOvD+mQGOjtImsN+BpBoqpDiZ2USgZpSqR5xz/81vsyhlkbfvxjStVyKJ8b24loKPup3rnFtrZkcDE8xskf/fTUIrqO/AW8CTePvvSbzTxl0jnyLKtgm9v3PFst/N7BEgC/gwn6dJyv2ejxL5+f49zKwy8Alwj3NuW0T1LLzTaZn+9Z8jgZPjHWMxKux3uaTv+7LAVcBDUapL+r6PVWC/A0refM65iw5is1im7PoV73B6af8/3ZOEUwAACRxJREFU86jTeiWSwt4LMysNXAM0K+A51vo/N5rZCLxTUAn/JR7r74GZ9QXGRKmKaRq3RBTDfr8RuAJo4/wLPqI8R1Lu93zEsi9z26z2PxeHk/f0S1IyszJ4iduHzrnhkfWhyZxz7jMze9PMqjvnSsTclzH8LiftZz1GlwKznHMbIitK+r73bTCzWs65df7p8I1R2qzGu/4v17F418YXO502PTSjgC7+HWf18P7zmBHawP+SywD+7BfdCOR3JC9ZXAQscs6tjlZpZpXMrEruY7yL3edHa5tMIq5n6UD0PpXIadzMrB3wAHCVc25nPm1K2n6PZV+OwvtMg/cZn5RfYptM/Ov23gMWOudezKdNzdzr+8zsTLzvk03xi7L4xPi7PAq4wb/r9Gxga+5pthIi37MrJXnfhwj9bOf3vT0OaGtmVf3LaNr6ZcUvHndFJPuC90W9GtgDbADGhdQ9gndH2mLg0pDyz4Da/uMT8JK6pUA6UC7oPh3i+zEAuCOirDbwWUh/v/eXBXin3QKPuwj6PRCYB8zF+2DXiuy7v34Z3t15P5Wgvi/Fu7Zjjr/k3mFZovd7tH0JPIGXxAKU9z/TS/3P+AlBx1xE/T4P7/TP3JB9fhlwR+5nH7jL38/f493Eck7QcRdh/6P+Lkf034A3/N+NeYSMRJDsC1ARLxk7PKSsxO57vCR1HbDP/66/Be/a1S+AJf7PI/22zYF3Q7bt6n/+lwI3xytmzbAgIiIikkR02lREREQkiSh5ExEREUkiSt5EREREkoiSNxEREZEkouRNREREJIkoeRMRERFJIpphQUT2M7MvgQuiVDV2zs3LZ5vGeOM9RfrKOdeq6KJLHWZ2E1A3pOhL59yXgQQjIglHyZuIxOJOoHs+dX+LZyAp4ibyJtFfxj8MEUlEOm0qIrG43swOiyw0syOAvwQQj4hIylLyJiKxqAzcEKX8JqBSfEMREUltSt5EpCCh8+fdGVrhT0x9Zz5t82VmZ5pZXzNbZGbbzGyPma01s0/N7BZ/Evho2w0wMxeyDDCzsmb2kJktNLNdZrbCzF7yJ4nO3a6NmY03sy1mtt3MpprZnwqJsbyZ3W5mn5nZOj/G38xslpk9Y2Y189muVUSMzi9vZGYfmdl6/7mWmdlzuZOfh2z/pb9N5CnTxyOed3nkNiFLryhxFdjGzHpF1H/pT7je3e/zTn8f9TOz40K2a2Zmw83sF7/NLDO7vaD3VkQOna55E5GCTAQu9h+fZmYXOucm+ettgZND2k7wy6Lyk7LXgG5Rqmv5y2VATzPr4JxbVEhsFYFJwLkhZccD9wDtzOxs4FbgebxJxHOdA5xjZj2cc69HifMMYBhQL6KqLNDUX3qY2Q3OuRGFxJh780Ffwv/e1gPuB843s5bOuX2FPU+clQLSgdAktwJwM957ew5wNvA+3vuSqynQx8xOds71jFewIqlGR95EpCBfA7ND1kOPtN0V8ng28E0hz9WH6IlbpFOBifkd3QrxZ8ITt8jnGE3exC3Uc2ZWLbTAzE7GS1gjE7dIlYGPzax1Ie0A+pH/P8q5CWaiOZfwxC1ULWAo0J/wxC3UP8zs9OIITESUvIlI4d4IedzezI4xs7p4R8ly5TmCFcrMzsc7ahNqCt6RumbAk4Sfdj0GeKqQuAyYC7Tyn+N/EfXn+z8fBRoAd0fUVwCuiCh7Dagasj4HL4k5zX++T0LqSuMdZSpVSJzg9aWh/1xbIuo6hTzugpc4To9o84pfnrucF8NrHgoDVgKXA00I7zfAmUB5vPerId5NK3sitv9zMccokrJ02lRECvMR3hGsqnh/M27H++LO/edvCzAYeKCA57gtYn0dcLFzLvcLf5Z//dc9IW2u909t7irgebs45xYCmNm/gU8j6j92zj3tP17on8I8I6S+Ue4DPyG9JKRuJ9DGObc5pM3XwE8cGIOtPl7y+EUBMfZ3zv3Lf7zAf53e0WJwzq33X2d3xHP85pxbXsBrFIfbnXOf+/E8Rt4jcdOdc7kJ8QL/OsJrQuobISLFQkfeRKRAfvLUP6ToNqBryHq/QhIsyHukaEhI4parf8R6OaB5Ac85Jzdx862I0mZwxPrSiPUjQh6fH1FXEdgUcfNBNuGD50LhR8HeiVj/sYAYEsVmYHzI+qG+tyJShJS8iUgs3uTAac2aQO61Yg54K4btI69f+zlKm+VRymoV8JyR7XdGaROZdEQmmaFnHwp6rYIUdm3ekkJiiOW0a7ytdM7lhKwf6nsrIkVIyZuIFMo59xMwLkrV535dkbxMjGW5tsbQ9rff8fr53dhQmAoFVYaedvVlH+TrxCpaMlgtSllBwt5b59yhvrciUoT0n5GIxOp1oF2UslisJ/wOzmh3c0YrWx/j8xeFdVFe+48xbJdZDLH8HlkR6xVDV8ysDFAnfuGISHHTkTcRidVYwk93LgM+j3HbyDtBu5hZuYiyyLtR9wAzYw/vkE2JWK8JnOacWx5tAdYCLZ1zvxZDLJHjvhV0dC/yCNgpEevXAlUQkRJDR95EJCbOuRwz+zsHRv//KuK6qIL0Bf4asl4LmGBmTwCbgA7A3yO2GRTDjRBFxjn3s5mNJ3yg4Y/N7EW8i/c3AofhDRtyAXA1UB34oBjC+SVivb2ZjcJLGB3e3ae5Sdt8wu8EvczMHsAb56453jAjIlKCKHkTkZg550bjJQW/d7spZtaf8KNr5+PNyhDNGrzx2eLtbmAaB+6UrAw85i/xNA3viFmuUwg/evk0B96fdLz4cq/ZM+A//pLLcfDX9IlIgtFpUxGJlzuAd2NotxhvDLh4Xu8GgHNuMdAG75RwLNYUUygD8Y6yFco5twB4qYAm75H3tLWIJDElbyISF865vc652/CmhHoPb7yzHXjXd63Hu37uNqBJxPht8Y5zFt6MDF2BUcBqYDewF9iAd23cC3hJ3vHFFMMWvCmqBgCryHsNXKSeQHe8GSF2A9uAL4E/OeduBWI9vS0iScCi3wEuIiIiIolIR95EREREkoiSNxEREZEkouRNREREJIkoeRMRERFJIkreRERERJKIkjcRERGRJKLkTURERCSJKHkTERERSSJK3kRERESSiJI3ERERkSSi5E1EREQkifw/IGVwLu8oxjIAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "\"\"\"Plotting the continuous and lattice dispersion relations. \n", "See writeup/slides for derivations of these.\n", "\"\"\"\n", "ks = np.linspace(-10.0, 10.0, 1000)\n", "m = 1.0\n", "cs = m**2 + ks**2\n", "ds = m**2 + 20 * np.sin(ks / 4)**2\n", "\n", "plt.figure(figsize=(10, 5))\n", "plt.plot(ks, cs, color=\"b\", linewidth=4, label=\"Continuous\")\n", "plt.plot(ks, ds, \"--\", color=\"green\", linewidth=4, label=\"Lattice\")\n", "plt.grid()\n", "plt.legend(loc=\"upper center\")\n", "plt.ylim((0, 40))\n", "plt.xlabel(\"Momentum\", fontsize=24, fontweight=\"bold\");\n", "plt.ylabel(\"Energy\", fontsize=24, fontweight=\"bold\");" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We now discuss our choice of variational ansatz for the VQE algorithm." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##

Variational Ansatz

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The variational ansatz is key to the success of VQE. Here we consider a simple tensor product ansatz that consists of Pauli-$X$ rotations about each qubit by independent angles. A more sophisticated ansatz, for example one with entanglement, may be required to reach the true ground state energy." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "\"\"\"Define the ansatz circuit.\"\"\"\n", "def ansatz():\n", " \"\"\"Returns a circuit with a product state ansatz.\"\"\"\n", " # Get a circuit and classical memory register\n", " circ = Program()\n", " creg = circ.declare(\"ro\", memory_type=\"BIT\", memory_size=3)\n", "\n", " # Define parameters for the ansatz\n", " angles = circ.declare(\"theta\", memory_type=\"REAL\", memory_size=3)\n", "\n", " # Add the ansatz\n", " circ += [RX(angles[0], 10), RX(angles[1], 11), RX(angles[2], 17)]\n", " \n", " return circ, creg" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that the odd qubit indexing (10, 11, 17) is for the quantum computer we'll use. One has to explicity use the right qubit indices unless Rigetti QCS with throw an error instead of, say, translating to the usable qubit indices...\n", "\n", "In the code below, we call our ansatz function and print out the circuit." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "DECLARE ro BIT[3]\n", "DECLARE theta REAL[3]\n", "RX(theta[0]) 10\n", "RX(theta[1]) 11\n", "RX(theta[2]) 17\n", "\n" ] } ], "source": [ "\"\"\"Get an example of ansatz.\"\"\"\n", "circ, creg = ansatz()\n", "\n", "print(circ)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This notation for representing quantum circuits is known as Quil, the Quantum Instruction Language, which was developed by Rigetti. Other \"quantum assembly languages\" exist such as OpenQASM by IBM and Blackbird by Xanadu." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##

Qubit Hamiltonian

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We use the form of the qubit Hamiltonian presented in [4] which is written\n", "\n", "\\begin{equation}\n", " H = H_{\\text{basis}} + \\delta H\n", "\\end{equation}\n", "\n", "where \n", "\n", "\\begin{equation}\n", " H_{\\text{basis}} = \\omega_\\phi [4 I - 2 Z_0 - Z_1 - \\frac{1}{2} Z_2 ]\n", "\\end{equation}\n", "\n", "and\n", "\n", "\\begin{equation}\n", " \\delta H = \\frac{1 - \\omega_\\phi^2}{\\omega_\\phi} [ a Z_0 X_1 Z_2 \n", " + b X_0 X_1 \n", " + a Y_0 Y_1 Z_2\n", " + b Y_0 Y_1 \n", " + c Z_0 X_1 Z_2\n", " + d Z_0 X_1\n", " + e X_1 Z_2 \n", " + f X_1 \n", " - Z_0\n", " - \\frac{1}{2} Z_1\n", " - \\frac{1}{4} Z_2\n", " + 2 I\n", " ]\n", "\\end{equation}\n", "\n", "and coefficents are given by\n", "\n", "\\begin{align}\n", " a &= \\frac{ \\sqrt{3} - \\sqrt{5} }{8} \\\\\n", " b &= \\frac{ \\sqrt{3} + \\sqrt{5} }{8} \\\\\n", " c &= \\frac{1 - \\sqrt{3} + \\sqrt{21} - \\sqrt{15}}{8 \\sqrt{2}} \\\\\n", " d &= \\frac{1 + \\sqrt{3} - \\sqrt{21} - \\sqrt{15}}{8 \\sqrt{2}} \\\\\n", " e &= \\frac{1 - \\sqrt{3} - \\sqrt{21} + \\sqrt{15}}{8 \\sqrt{2}} \\\\\n", " f &= \\frac{1 + \\sqrt{3} + \\sqrt{21} + \\sqrt{15}}{8 \\sqrt{2}} \n", "\\end{align}\n", "\n", "Here, $\\omega_\\phi$ is considered a tuning parameter for \"how much $\\delta H$ to include.\" It is related to the coefficient strength $\\lambda$ of the field theory.\n", "\n", "The cell below defines these coefficients in code. Here, we store coefficients in a Python dictionary for easy access in the VQE algorithm. The format of the dictionary is \"term of Hamiltonian\" --> \"value of coefficient.\" We number the terms of the Hamiltonian starting with zero in the $H_{\\text{basis}}$ term, ignoring the trivial identity terms, then going through to the $\\delta H$ term, again ignoring identity terms." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "\"\"\"Defining coefficents of Hamiltonian in a dictionary. \n", "\n", "key = which term of Hamiltonian, value = coefficient.\n", "\"\"\"\n", "\n", "# \"Global\" coefficients on H_basis and \\delta H\n", "Cbasis = omega\n", "Cdelta = (1.0 - omega**2) / omega\n", "\n", "# Numerical values of coefficeints above\n", "a = (np.sqrt(3.0) - np.sqrt(5.0)) / 8.0\n", "b = (np.sqrt(3.0) + np.sqrt(5.0)) / 8.0\n", "c = (1.0 - np.sqrt(3.0) + np.sqrt(21.0) - np.sqrt(15.0)) / 8 / np.sqrt(2.0)\n", "d = (1.0 + np.sqrt(3.0) - np.sqrt(21.0) - np.sqrt(15.0)) / 8 / np.sqrt(2.0)\n", "e = (1.0 - np.sqrt(3.0) - np.sqrt(21.0) + np.sqrt(15.0)) / 8 / np.sqrt(2.0)\n", "f = (1.0 + np.sqrt(3.0) + np.sqrt(21.0) + np.sqrt(15.0)) / 8 / np.sqrt(2.0)\n", "\n", "# Dictionary of coefficients, starting numbering with H_basis and then \\delta H\n", "coeffs = {0: -2.0 * Cbasis,\n", " 1: -1.0 * Cbasis,\n", " 2: -0.5 * Cbasis,\n", " 3: a * Cdelta,\n", " 4: b * Cdelta,\n", " 5: a * Cdelta,\n", " 6: b * Cdelta,\n", " 7: c * Cdelta,\n", " 8: d * Cdelta,\n", " 9: e * Cdelta,\n", " 10: f * Cdelta,\n", " 11: -1.0 * Cdelta,\n", " 12: -0.5 * Cdelta,\n", " 13: -0.25 * Cdelta}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We now define the basis measurements for each term in the Hamiltonian, using the same indexing scheme as above. These measurements are explained in detail in my project write-up and slides. Essentially, we rotate to the eigenbasis of the particular Pauli operator we want to compute an expectation of. Measuring in the computational basis then allows us to approximate the expectation value by classical post-processing." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "\"\"\"Defining rotation operators in a dictionary. \n", "\n", "key = which term of Hamiltonian, value = which basis to measure in.\n", "\"\"\"\n", "# Helper function\n", "def meas(pauli, qubit):\n", " \"\"\"Returns a pyquil.Program with the correct basis measurement \n", " for the given Pauli operator and qubit.\n", " \n", " Args:\n", " pauli : str\n", " Either \"X\", \"Y\", or \"Z\".\n", "\n", " qubit : int\n", " Index of qubit in the Hamiltonian.\n", " Note: This should be an actual physical qubit index\n", " on the qubit lattice being considered if running\n", " on a quantum chip.\n", " \"\"\"\n", " # Get the index of the classical register for the given qubit index\n", " if qubit == 10:\n", " ind = 0\n", " elif qubit == 11:\n", " ind = 1\n", " elif qubit == 17:\n", " ind = 2\n", " else:\n", " raise ValueError(\"Unsupported qubit index for computer. Rigetti will let you know about this...\")\n", "\n", " # Do the appropriate basis measurement\n", " if pauli == \"Z\":\n", " return Program(MEASURE(qubit, creg[ind]))\n", " elif pauli == \"X\":\n", " return Program(H(qubit), MEASURE(qubit, creg[ind]))\n", " elif pauli == \"Y\":\n", " return Program(S(qubit), H(qubit), MEASURE(qubit, creg[ind]))\n", " else:\n", " raise ValueError(\"Unsupported operator. Enter X, Y, or Z.\")\n", "\n", "\n", "# Dictionary\n", "measure = {0: meas(\"Z\", 10),\n", " 1: meas(\"Z\", 11),\n", " 2: meas(\"Z\", 17),\n", " 3: meas(\"Z\", 10) + meas(\"X\", 11) + meas(\"Z\", 17),\n", " 4: meas(\"X\", 10) + meas(\"X\", 11),\n", " 5: meas(\"Y\", 10) + meas(\"Y\", 11) + meas(\"Z\", 17),\n", " 6: meas(\"Y\", 10) + meas(\"Y\", 11),\n", " 7: meas(\"Z\", 10) + meas(\"X\", 11) + meas(\"Z\", 17),\n", " 8: meas(\"Z\", 10) + meas(\"X\", 11),\n", " 9: meas(\"X\", 11) + meas(\"Z\", 17),\n", " 10: meas(\"X\", 11),\n", " 11: meas(\"Z\", 10),\n", " 12: meas(\"Z\", 11),\n", " 13: meas(\"Z\", 17)}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##

Computing an Expectation Value

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can now do the VQE algorithm. We first write a helper function which computes the expectation value of one term in the Hamiltonian, for a given set of angles, on a given computer. The number of `shots` is the number of times to sample from the circuit in order to estimate probabilities. The `verbose` option is a flag for printing out the circuit that is being executed, which is helpful for debugging." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "def expectation(term, angles, computer, shots=10000, verbose=False):\n", " \"\"\"Returns the expectation value .\"\"\" \n", " circ, creg = ansatz()\n", " \n", " circ += measure[term]\n", " \n", " # Set the number of shots\n", " circ.wrap_in_numshots_loop(shots)\n", " \n", " # Verbose option\n", " if verbose:\n", " print(\"Circuit:\\n=======\")\n", " print(circ)\n", " \n", " # Execute the circuit\n", " executable = computer.compile(circ)\n", " res = computer.run(executable, memory_map={\"theta\": angles})\n", " \n", " # Do the postprocessing\n", " tot = 0.0\n", " for vals in res:\n", " tot += (-1)**sum(vals)\n", " return tot / shots" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We use the above function to compute the expectation for a given term in the Hamiltonian and an arbitrary set of angles in the ansatz. One can vary these to see how the expectation value changes." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Circuit:\n", "=======\n", "DECLARE ro BIT[3]\n", "DECLARE theta REAL[3]\n", "RX(theta[0]) 10\n", "RX(theta[1]) 11\n", "RX(theta[2]) 17\n", "MEASURE 10 ro[0]\n", "\n" ] }, { "data": { "text/plain": [ "1.0" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\"\"\"Example of computing an expectation.\"\"\"\n", "term = 0\n", "angles = [0, pi, 0]\n", "\n", "expectation(term, angles, computer, verbose=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##

Computing a Weighted Expecation Value

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The above function didn't take into account the coefficient of the term in the Hamiltonian. We write a function below that takes care of this for us." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "def weighted_expectation(term, angles, computer, shots=10000, verbose=False):\n", " \"\"\"Returns coeff * .\"\"\"\n", " return coeffs[term] * expectation(term, angles, computer, shots, verbose)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As above, we compute an exampled \"weighted expectation\" for the above `term` and set of `angles`." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-1.0" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\"\"\"Example of computing a weighted expectation.\"\"\"\n", "weighted_expectation(term, angles, computer, verbose=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##

Computing the Total Energy

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "With the above helper function, it is now easy to loop over all terms in the Hamiltonian and add up the weighted expectation values to get the total energy for a given set of angles. The below function does this operation. Note that we add the coefficients of the identity operators outside of this loop. (We don't need a quantum algorithm for this! It's just a constant offset.)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "\"\"\"Define a function to compute the energy for a set of angles.\"\"\"\n", "def energy(angles, computer, shots=10000, verbose=False):\n", " \"\"\"Returns the energy .\"\"\"\n", " # Variable to store the total energy\n", " tot = 0.0\n", " \n", " # Loop over all terms and add the weighted expectations\n", " for term in coeffs.keys():\n", " tot += weighted_expectation(term, angles, computer, shots, verbose)\n", " \n", " # Add in the constant values from the Hamiltonian\n", " tot += 4 * Cbasis\n", " tot += 2 * Cdelta\n", " \n", " return tot" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And again we'll compute the energy for an example set of angles, this time a randomly generated set of three angles." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1.0604309266122893" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\"\"\"Compute the energy for a random set of angles.\"\"\"\n", "energy(np.random.rand(3), computer)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now that we have a function for computing the energy, we just need to vary the parameters to find the minimum. There are many methods for this. The simplest, and most computationally expensive, is a grid search over the angles. Below we use a minimization algorithm known as Constrained Optimization BY Linear Approximation (COBYLA) which is implemented in Scipy Optimize." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#

Minimizing the Total Energy

" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "\"\"\"Define a list to store the objective function value at each iteration (for plotting).\"\"\"\n", "OBJVALS = []" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "\"\"\"Define the objective function.\"\"\"\n", "def obj(angles):\n", " \"\"\"Returns the energy for a given set of angles.\"\"\"\n", " val = energy(angles, computer, shots=10000, verbose=False)\n", " OBJVALS.append(val)\n", " print(\"Current energy =\", round(val, 7), end=\"\\r\")\n", " return val" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Total runtime = 5.8602989435195925 minutes.\n" ] } ], "source": [ "\"\"\"Do the minimization.\"\"\"\n", "start = time.time()\n", "res = minimize(obj, np.random.rand(3), method=\"COBYLA\")\n", "end = time.time()\n", "print(\"Total runtime = {} minutes.\".format((end - start) / 60))" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " fun: 0.6685095783672974\n", " maxcv: 0.0\n", " message: 'Optimization terminated successfully.'\n", " nfev: 43\n", " status: 1\n", " success: True\n", " x: array([-0.17313439, -0.03250566, 0.22492333])\n" ] } ], "source": [ "\"\"\"Print out the final result.\"\"\"\n", "print(res)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##

Plotting the Energy vs Iteration Curve

" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmgAAAFECAYAAACTacKZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzt3Xt4lNW5///3nQMkBEgIJ81BgooIAoIERME2oAi2UvFABfEAVun1Vdu9tV9a2LsqdXtoxVZbtVZaFf25BS1a9Ke2iELqoaKgIAiIIqIkWEEgSCQJOazvHzMZJskkmUkyh0w+r+uayzzP3PM8d7KA3K71rLXMOYeIiIiIxI6EaCcgIiIiInWpQBMRERGJMSrQRERERGKMCjQRERGRGKMCTURERCTGqEATERERiTEq0ERERERijAo0ERERkRijAk1EREQkxiRFO4HW6tWrl8vLywvrPb799lvS0tLCeg+JPLVrfFK7xie1a3zqiO363nvvfe2c691cXLsv0PLy8li3bl1Y71FYWEhBQUFY7yGRp3aNT2rX+KR2jU8dsV3N7PNg4jTEKSIiIhJjIlagmdmjZrbHzD5s5H0zsz+Y2XYz22hmp0UqNxEREZFYEsketMXA5CbePw8Y4H3NAR6KQE4iIiIiMSdiz6A55143s7wmQi4AnnDOOWCNmWWY2bHOuS8jkqCIiEgMqKyspKioiPLy8minEnbp6els3bo12mmERUpKCjk5OSQnJ7fo87E0SSAb2OV3XOQ9pwJNREQ6jKKiIrp160ZeXh5mFu10wurQoUN069Yt2mm0Oecc+/bto6ioiP79+7foGrFUoAX6U+gCBprNwTMMSt++fSksLAxjWlBaWhr2e0jkqV3jk9o1PnWkdk1PT6dnz56UlpZGO5Wwq66u5tChQ9FOIyw6depESUlJi//cxlKBVgTk+h3nALsDBTrnFgGLAPLz8124p+h2xGnAHYHaNT6pXeNTR2rXrVu30r1792inERHx2oNWKyUlhREjRrTos7FUoL0A3GBmS4HTgYPRfv5s+fpiFq7YRnFJGdlrVjF30kCmjshuNn53SRlZGantKj7Ua4uIiEj4RKxAM7MlQAHQy8yKgFuBZADn3J+Al4HvAduBw8DsSOUWyPL1xcx/bhNlldUAFJeU8YtnN7L3UAXnDO7bIP7VLV9xzyvbqKiq8cXPf24TAGee0JNvj1Q3G/+LZzdy+EgVl53er07s7pIyXtr4ZcD4+vn07taZrp2TQsq/qdxVpImIdCwFBQXMnz+fSZMm+c7dd999fPzxx/zxj39k8+bN/OQnP6GoqIjq6mouv/xybr31VhISEli8eDFz584lO/vo746nnnqKwYMH17lHYmIiQ4cOpaamhoSEBKZPn868efMi9j22B+aZNNl+5efnu3DsJDD216soLilr9XWyM1IZflwGL20MrjMwPTWJD26dVOfctD/9i7U7DwT1+ftnjGDKqVltkn92RipvzZvQqmvEso40ZNKRqF3jU0dq161btzJo0KCg49t6BOThhx9mzZo1PPbYY75zY8aMYeHCheTn5zNkyBAeeughzj33XA4fPszFF1/Mueeey4033sjixYtZt24dDzzwQJP36Nq1K6WlpW06xFlVVUVSUiwNDAZuSzN7zzmX39xntZNAI3a3QXHWkuscLKuKyn3DdQ0REQmf2tGS4pIyHEdHQJavL27xNS+55BJefPFFKioqANi5cye7d+9m3LhxPPXUU4wdO5Zzzz0XgC5duvDAAw+wcOHCtvh2yMvL49Zbb+W0005j6NChfPTRR4Bnz86rr76aUaNGMWLECJ5//nkAFi9ezLRp05gyZQrnnnsuNTU1XHfddZxyyimcf/75fO9732PZsmW89tprXHjhhb77rFy5kosuuqhNcg6X2Co1Y0hWRmrAHqjEBCO3R2qD87sOlFFd07A3Misjld5dO5PXs0tQ8RldGq6Xckx6KokJJQHj6+eT1jkx5Pybyl1ERKLr3pUf8/vXPgk6vqyymoUrtvl60eY/t5El7x5dxeo/zh7AjRNPavTzPXv2ZPTo0fzjH//gggsuYOnSpVx66aWYGZs3b2bkyJF14k844QTKysooKSkB4Omnn+bNN9/0vf/222+Tmlr390lZWRnDhw/3DXHOnz+fSy+9FIBevXrx/vvv88c//pF77rmHv/zlL9xxxx1MmDCBRx99lJKSEkaPHs0555zju/7GjRvJzMxk2bJl7Ny5k02bNrFnzx4GDRrE1VdfzYQJE7j++uvZu3cvvXv35rHHHmP27Kg+SdUsFWiNmDtpYJ1nuABSkxO566KhAbuO6z/zVRt/tKv5lKDiF0ypGweeYcuzT+4TUj6h5N9U7iIi0v60dgRk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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "\"\"\"Plot the energy vs iteration\"\"\"\n", "# Only include the decreasing costs, since the optimizer tries random values occasionally\n", "energies = [OBJVALS[0]]\n", "for x in OBJVALS:\n", " if x < energies[-1]:\n", " energies.append(x)\n", " else:\n", " energies.append(energies[-1])\n", "\n", "# Do the plotting\n", "plt.figure(figsize=(10, 5))\n", "plt.plot(energies, \"--o\", linewidth=3, label=\"VQE Energy\")\n", "plt.xlabel(\"Iteration\", fontsize=14, fontweight=\"bold\")\n", "plt.ylabel(\"Energy\", fontsize=14, fontweight=\"bold\")\n", "\n", "# Put a line at the actual ground state energy (see below)\n", "GSENERGY = 0.53232723\n", "plt.plot(GSENERGY * np.ones_like(energies), linewidth=3, label=\"Analytic Energy\")\n", "\n", "plt.grid()\n", "plt.legend()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##

Checking the Result

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is just an eight by eight matrix -- we can diagonalize this with classical methods. We just need to have a matrix representation of the Hamiltonian, which we obtain below." ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 0.625 +0.j 0. +0.j 0.43582678+0.j 0. +0.j\n", " 0. +0.j 0. +0.j 0.09450322+0.j 0. +0.j]\n", " [ 0. +0.j 1.875 +0.j 0. +0.j 1.0130619 +0.j\n", " 0. +0.j 0. +0.j 0. +0.j -0.09450322+0.j]\n", " [ 0.43582678+0.j 0. +0.j 3.125 +0.j 0. +0.j\n", " 1.3935413 +0.j 0. +0.j 0. +0.j 0. +0.j]\n", " [ 0. +0.j 1.0130619 +0.j 0. +0.j 4.375 +0.j\n", " 0. +0.j 1.5825477 +0.j 0. +0.j 0. +0.j]\n", " [ 0. +0.j 0. +0.j 1.3935413 +0.j 0. +0.j\n", " 5.625 +0.j 0. +0.j 2.1484628 +0.j 0. +0.j]\n", " [ 0. +0.j 0. +0.j 0. +0.j 1.5825477 +0.j\n", " 0. +0.j 6.875 +0.j 0. +0.j 2.3357744 +0.j]\n", " [ 0.09450322+0.j 0. +0.j 0. +0.j 0. +0.j\n", " 2.1484628 +0.j 0. +0.j 8.125 +0.j 0. +0.j]\n", " [ 0. +0.j -0.09450322+0.j 0. +0.j 0. +0.j\n", " 0. +0.j 2.3357744 +0.j 0. +0.j 9.375 +0.j]]\n" ] } ], "source": [ "\"\"\"Classically diagonalize the Hamiltonian.\"\"\"\n", "# Define the Pauli matrices\n", "I = np.identity(2, dtype=np.complex64)\n", "X = np.array([[0, 1], [1, 0]], dtype=np.complex64)\n", "Y = np.array([[0, -1j], [1j, 0]], dtype=np.complex64)\n", "Z = np.array([[1, 0], [0, -1]], dtype=np.complex64)\n", "\n", "# Helper function for doing three tensor products\n", "def kron(a, b, c):\n", " return np.kron(a, np.kron(b, c))\n", "\n", "# Initialize the Hamiltonian\n", "H = np.zeros((8, 8), dtype=np.complex64)\n", "\n", "# Add in each term of the Hamiltonian from above\n", "# H_basis terms\n", "H += 4 * Cbasis * kron(I, I, I)\n", "H += coeffs[0] * kron(Z, I, I)\n", "H += coeffs[1] * kron(I, Z, I)\n", "H += coeffs[2] * kron(I, I, Z)\n", "\n", "# \\delta H terms\n", "H += coeffs[3] * kron(Z, X, Z)\n", "H += coeffs[4] * kron(X, X, I)\n", "H += coeffs[5] * kron(Y, Y, Z)\n", "H += coeffs[6] * kron(Y, Y, I)\n", "H += coeffs[7] * kron(Z, X, Z)\n", "H += coeffs[8] * kron(Z, X, I)\n", "H += coeffs[9] * kron(I, X, Z)\n", "H += coeffs[10] * kron(I, X, I)\n", "H += coeffs[11] * kron(Z, I, I)\n", "H += coeffs[12] * kron(I, Z, I)\n", "H += coeffs[13] * kron(I, I, Z)\n", "H += 2 * Cdelta * kron(I, I, I)\n", "\n", "# Print out the matrix of the Hamiltonian\n", "print(H)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we can diagonalize it to see the \"analytic\" ground state energy, as well as the ground state wavefunction." ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Ground state energy: 0.53232723\n", "Ground state wavefunction:\n", "(0.9767324+0j)\n", "(2.7024597e-16+0j)\n", "(-0.21043499+0j)\n", "(-2.173432e-17+0j)\n", "(0.038632505+0j)\n", "(7.724141e-18+0j)\n", "(0.014783568+0j)\n", "(-2.3814741e-20+0j)\n" ] } ], "source": [ "\"\"\"Classically diagonalize the Hamiltonian.\"\"\"\n", "# Get the eigenvalues and eigenvectors\n", "evals, evecs = np.linalg.eigh(H)\n", "\n", "# Grab the ground state energy and wavefunction (evals/evecs are sorted)\n", "gs_energy = evals[0]\n", "gs_wavefunction = evecs[0]\n", "\n", "# Display them\n", "print(\"Ground state energy:\", gs_energy)\n", "print(\"Ground state wavefunction:\", *gs_wavefunction, sep=\"\\n\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The analytic ground state energy was included on the above plot. We can now also compare the ground state wavefunction found from the ansatz, which we do below." ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Ground state wavefunction computed:\n", "(0.98983115+0j)\n", "-0.11178974j\n", "0.016088976j\n", "(0.0018170598+0j)\n", "0.085901596j\n", "(0.0097015705+0j)\n", "(-0.001396267+0j)\n", "0.00015769187j\n" ] } ], "source": [ "\"\"\"Print out the ground state wavefunction found by the optimal angles in the ansatz.\"\"\"\n", "# Rx gate as a matrix\n", "rxmat = lambda theta: np.cos(theta / 2) * I - 1j * np.sin(theta / 2) * X\n", "\n", "opt = res[\"x\"]\n", "\n", "rx0 = rxmat(opt[0])\n", "rx1 = rxmat(opt[1])\n", "rx2 = rxmat(opt[2])\n", "\n", "mat = kron(rx0, rx1, rx2)\n", "\n", "vqe_wavefunction = mat[:, 0]\n", "\n", "print(\"Ground state wavefunction computed:\", *vqe_wavefunction, sep=\"\\n\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Comparing amplitudes is extremely fun, but we can also compute the overlap of the analytic and VQE ground state wavefunctions:" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Overlap = 0.9346626597205479\n" ] } ], "source": [ "\"\"\"Compute the overlap of the analytic and VQE ground state wavefunctions.\"\"\"\n", "overlap = abs(np.dot(gs_wavefunction.conj().T, vqe_wavefunction))**2\n", "\n", "print(\"Overlap =\", overlap)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The two have relatively high overlap, but of course the degree of accuracy needed depends on the particular application one is considering. We remark that this overlap could be made larger by considering a different ansatz, perhaps one with entanglement, and running the optimization algorithm longer (or using a better optimizer)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##

Running on a Quantum Computer

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This notebook was made into a script that could be run on Rigetti's Quantum Cloud Services. In particular, we used a three qubit lattice \"Aspen-4-3Q-A,\" the fidelity/noise characterization of which can be found online. In the cell below, we load energy vs iteration data that was computed using our VQE algorithm on this lattice. We then plot it against the simulator result to compare the difference." ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "scrolled": false }, "outputs": [ { "data": { "image/png": "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kVZzt40YMYLt2123FKL0QRNO8fXxJb5jPN8d+w6ArSe2Mil4Uv0HjZ1n3QcN6l95oHaftar4sfNc8A2EEKJ12X2h+1YUuGjP7jo/+/DDD0lNTaVfv3506NCBjIwMEhMTAdi2bRs//fQTXbp0YcSIEXz77bdceuml3HPPPcybZ/67+tZbb+WTTz5h4sSJljYvu+wy7r77bk6dOkXHjh155513uPPOO5k4cSIvv/yy3clqP/vsMz788EN++OEHAgMDycnJsZvvggULeOeddwAIDw9nw4YNAGRmZrJt2zb8/f3p378/s2bNIiAggCeffJJ169YRFBTEc889x4svvmjJ3Wg08s033wAQGxvLa6+9xvDhw62Kw+nTp7N06VL+/ve/s2/fPoqLi4mLi3P4Z98QuYMmnNZgP7TaHBghajc+pLN52y8EUubKAAEhhGhGy5Yt46abbgLgpptuYtmyZZbPBg8eTLdu3fDx8SE+Pp6DBw8CsGHDBoYMGcLAgQP58ssv+emnn6zaVEpx66238s4775Cbm8uWLVu48sor681j3bp13HnnnQQGBgLQoUMHu3E1H3FWFWcAY8eOJSwsDKPRyIABAzh06BDff/89u3btYsSIEcTHx/Pmm29aLfp+4403ApCbm0teXp6lP9xvf/tbS8wNN9zAJ598QmlpKf/617+444476v0ezpI7aMJpDvdDq6mBEaJ24/d8Ars+gpI88A9u+BghhBAucebMGb788kt27tyJUory8nKUUjz//PMA+Pv7W2INBgNlZWWYTCZmzpzJ1q1b6d69O2lpaZhMthOaV90xMxqNXHPNNbRrV38porVGVU3Z1Aj2ctVac8UVV1gVnTUFBQVZzl2XwMBArrjiCj766CPef/99XL0uuBRowmmxkbH4G/wpLi/mcN5hThaepFNgJ9efqGuyuUADyEq3XRNUCCHagPoeQ7rLypUrue222/jnP/9p2Td69GjLYz97qoqxyMhI8vPzWblyJddff71NXJcuXejSpQtPPvkkH374oWW/r68vpaWl+Pr6WsWPGzeOJ554gt/+9reWR5x13UVz1NChQ7n77rvZv38/ffr0obCwkKysLPr162cVFx4eTkhICN9//z1Dhw61GSwxffp0Jk6cyMiRI5ucU23yiFM4zc/gR4+QHvj6mP8junn1zaw+sNr1J+pWYynWrC2ub18I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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "\"\"\"Plot the QPU energy vs iteration data obtained by running on Rigetti QCS.\"\"\"\n", "# Read in the files\n", "qpu_energy1 = np.loadtxt(\"qpu-energy-iteration1.txt\")\n", "qpu_energy2 = np.loadtxt(\"qpu-energy-iteration2.txt\")\n", "\n", "# Do the plotting\n", "plt.figure(figsize=(10, 5))\n", "plt.plot(energies, \"--o\", linewidth=3, label=\"Simulator\")\n", "plt.xlabel(\"Iteration\", fontsize=14, fontweight=\"bold\")\n", "plt.ylabel(\"Energy\", fontsize=14, fontweight=\"bold\")\n", "\n", "plt.plot(qpu_energy1, \"--o\", linewidth=3, label=\"Raw QPU Run 1\")\n", "plt.plot(qpu_energy2, \"--o\", linewidth=3, label=\"Raw QPU Run 2\")\n", "\n", "# Put a line at the actual ground state energy (see below)\n", "GSENERGY = 0.53232723\n", "plt.plot(GSENERGY * np.ones_like(energies), linewidth=3, label=\"Analytic Energy\")\n", "\n", "plt.grid()\n", "plt.legend();" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##

Error Mitigation

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The QPU data above has a significant vertical shift from the simulator data, but generally the same \"shape.\" This shift is present because of decoherence, gate application errors, measurement errors, and other noise in the system. It can be accounted for by running a set of \"benchmark circuits\" on the QPU prior to running the actual algorithm. These benchmark circuits are simple circuits, such as NOT and MEASURE, for which one knows the actual output. The vertical shift in this benchmark circuit can then be tested for and subtracted from the final computed energies to get more accurate results. Other methods are also possible, and this is an area of active research.\n", "\n", "Here, we employ a similar idea, but instead of running a benchmark circuit, we just subtract off the difference of the initial energies on the QPU and on the simulator. The cell below implements this and plots the result again." ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "\"\"\"Plot the error mitigated QPU energy vs iteration data obtained by running on Rigetti QCS.\"\"\"\n", "# Constant shift amount. In practice, this would be obtained by running a \"benchmark circuit.\"\n", "# Here, we just set the value based on the above curves\n", "shift = 0.3\n", "\n", "# Read in the files\n", "qpu_energy1 = np.loadtxt(\"qpu-energy-iteration1.txt\")\n", "qpu_energy2 = np.loadtxt(\"qpu-energy-iteration2.txt\")\n", "\n", "# Subtract off the shift\n", "qpu_energy1 -= shift\n", "qpu_energy2 -= shift\n", "\n", "# Do the plotting\n", "plt.figure(figsize=(10, 5))\n", "plt.plot(energies, \"--o\", linewidth=3, label=\"Simulator\")\n", "plt.xlabel(\"Iteration\", fontsize=14, fontweight=\"bold\")\n", "plt.ylabel(\"Energy\", fontsize=14, fontweight=\"bold\")\n", "\n", "plt.plot(qpu_energy1, \"--o\", linewidth=3, label=\"Error Mitigated QPU Run 1\")\n", "plt.plot(qpu_energy2, \"--o\", linewidth=3, label=\"Error Mitigated QPU Run 2\")\n", "\n", "# Put a line at the actual ground state energy (see below)\n", "GSENERGY = 0.53232723\n", "plt.plot(GSENERGY * np.ones_like(energies), linewidth=3, label=\"Analytic Energy\")\n", "\n", "plt.grid()\n", "plt.legend();" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##

Conclusions and Future Work

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this project, we mapped a simple quantum field theory onto a quantum computer architecture and computed the ground state energy via the variational quantum eigensolver algorithm. We ran our algorithm on a quantum computer simulator and compared our results, both ground state energy and ground state wavefunction, to the analytical results found by classically diagonalizing the Hamiltonian. Our results were in good agreement but could be improved upon by a more sophisticated variational ansatz and, potentially, better minimization algorithms. \n", "\n", "In future work, we could use quantum algorithms to approximate excited state energies and compute the mass renormalization of the interacting $\\lambda \\phi^4$ field theory. Additionally, we could consider other quantum field theories and obtain a quantum algorithm with the same digitization techniques used in this project. Future work could be done on error mitigation to obtain more accurate energy estimates. Additionally, we could consider other algorithms for computing eigenvalues such as the well-known quantum phase estimation algorithm. While QPE is not near-term, it would be interesting to compare results obtained with QPE vs. those obtained with VQE." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##

Acknowledgements

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "I thank Dr. Shindler for very helpful discussions about the one-dimensional field theory considered in this work. I thank Rigetti for providing access to their quantum computers. The views expressed in this work are my own and not those of Rigetti. Finally, I still thank Yousif Almulla for providing skeleton code from way back for my first implementation of VQE (not for this project). The code was slow, poorly commented, and outright confounding, but it helped explain how VQE works at a low-level for me." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##

References

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[1] Ryan LaRose, Overview and comparison of gate level quantum software platforms, Quantum 3: 130 (2019).\n", "\n", "[2] Kubra Yeter-Aydeniz, Eugene F. Dumitrescu, Alex J. McCaskey, Ryan S. Bennink, Raphael C. Pooser, and George Siopsis, \"Scalar Quantum Field Theories as a Benchmark for Near-Term Quantum Computers,\" Phys. Rev. A 99, 032306, 2019.\n", "\n", "[3] Ken M Nakanishi, Kosuke Mitarai, and Keisuke Fujii, \"Subspace-search variational quantum eigensolver for excited states,\" https://arxiv.org/abs/1810.09434, 2019.\n", "\n", "[4] Natalie Klco and Marin J. Savage, \"Digitization of Scalar Fields for NISQ-Era Quantum Computing,\" https://arxiv.org/abs/1808.10378, 2018." ] } ], "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", "version": "3.6.8" } }, "nbformat": 4, "nbformat_minor": 2 }