├── .ipynb_checkpoints ├── Fitting-checkpoint.ipynb ├── Meta-VQE-checkpoint.ipynb ├── Molecular-Meta-VQE-checkpoint.ipynb ├── QFit-checkpoint.ipynb └── SingleQubitClassifier-checkpoint.ipynb ├── Meta-VQE.ipynb ├── Molecular-Meta-VQE.ipynb ├── QFit.ipynb ├── README.md └── SingleQubitClassifier.ipynb /.ipynb_checkpoints/Molecular-Meta-VQE-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Non-Linear Molecular Meta-VQE \n", 8 | "_______________________________________________________\n", 9 | "\n", 10 | "_Authors:_ Alba Cervera-Lierta, Jakob S. Kottmann, Alán Aspuru-Guzik.\n", 11 | "\n", 12 | "This notebook presents a demo code illustrate a non-linear molecular meta-VQE as introduced in the article \"The Meta-Variational Quantum Eigensolver (Meta-VQE): Learning energy profiles of parameterized Hamiltonians for quantum simulation\" (http://arxiv.org/abs/2009.13545).\n", 13 | "\n", 14 | "We will explicitly illustrate how to construct a non-linear meta-VQE for molecular systems. \n", 15 | "In this Notebook we will use the simplest system available, the Hydrogen molecule in a minimal representation. \n", 16 | "The molecular coordinates, or the basis-set can however be replaced (as long as there is just a single meta-parameter $R$ in the coordinates), but note that the training will take substantially longer, depending on the system/basis you chose, and a jupyter notebook is probably not the best environment anymore.\n", 17 | "\n", 18 | "In order to run the notebook you need to have `tequila` installed. \n", 19 | "Just follow the intructions from the [AAG github repository](https://github.com/aspuru-guzik-group/tequila) and let us know if you experience any troubles. Feel also free to check out the `tequila` [tutorials](https://github.com/aspuru-guzik-group/tequila/tree/master/tutorials). For this notebook we recommend [basic usage](https://github.com/aspuru-guzik-group/tequila/blob/master/tutorials/BasicUsage.ipynb) and [basic chemistry](https://github.com/aspuru-guzik-group/tequila/blob/master/tutorials/Chemistry.ipynb).\n", 20 | "\n", 21 | "We start by defining our non-linear encoder. As in the paper we will use a set of floating Gaussians to approximate our unknown non-linear function. Each parameter of the VQE is then encoded, depending on the meta variable $R$ (in this example the bond distance of H$_2$; in the paper the intermolecular distance of H$_4$), as\n", 22 | "$$\n", 23 | "\\theta\\left(R\\right) = \\sum_n \\alpha_n \\exp\\left( -\\beta_n (\\gamma_n - R)^2\\right) + \\delta.\n", 24 | "$$\n", 25 | "\n", 26 | "In the following cell, we define this encoder as abstract class can produce `tequila` objectives which will be used as parameters for quantum circuits later.\n", 27 | "\n", 28 | "The `DummyEncoder` class just gives back the original variable, we will use it to test the meta-VQE later. \n", 29 | "In the same way the `evaluate` function will later be used to initialize the $\\theta$ parameters to test the meta-VQE after training.\n", 30 | "\n", 31 | "If you have any questions left, feel free to contact us." 32 | ] 33 | }, 34 | { 35 | "cell_type": "code", 36 | "execution_count": 1, 37 | "metadata": {}, 38 | "outputs": [], 39 | "source": [ 40 | "# tested with tq git revision: ab252adc4090465ff47f182de32d69b84d7fc13f\n", 41 | "import tequila as tq\n", 42 | "import numpy" 43 | ] 44 | }, 45 | { 46 | "cell_type": "code", 47 | "execution_count": 2, 48 | "metadata": {}, 49 | "outputs": [], 50 | "source": [ 51 | "class DummyEncoder:\n", 52 | " \"\"\"\n", 53 | " No encoding\n", 54 | " \"\"\"\n", 55 | " def __call__(self, variable, *args, **kwargs):\n", 56 | " return variable\n", 57 | " \n", 58 | "class GaussianEncoder:\n", 59 | " \"\"\"\n", 60 | " Represent an unknown linear function by n floating Gaussians \n", 61 | " \"\"\"\n", 62 | " def __init__(self, n):\n", 63 | " self._n = n\n", 64 | "\n", 65 | " def __call__(self, variable, R):\n", 66 | " # this allows us to just pass names as parameters\n", 67 | " variable = tq.assign_variable(variable)\n", 68 | " \n", 69 | " # here we create the non-linear encoded parameter\n", 70 | " # as described in the paper\n", 71 | " # as abstract tequila objective\n", 72 | " mapped = tq.Variable((\"delta\", variable))\n", 73 | " for n in range(self._n):\n", 74 | " a = tq.Variable((\"alpha\", variable, n))\n", 75 | " b = tq.Variable((\"beta\", variable, n))\n", 76 | " c = tq.Variable((\"gamma\", variable, n))\n", 77 | " mapped += a * ((-(b * (c - R) ** 2)).apply(tq.numpy.exp))\n", 78 | " return mapped\n", 79 | " \n", 80 | " def evaluate(self, variable, R, trained_variables):\n", 81 | " # evaluates a specficic variale at point R\n", 82 | " # according to alpha*exp(-beta*(gamma - variable)**2) + delta\n", 83 | " # needs the trained variables which are (\"alpha\", variable, n)\n", 84 | " # and similar for the other meta parameters\n", 85 | " result = 0.0\n", 86 | " for n in range(self._n):\n", 87 | " a = trained_variables[(\"alpha\", variable, n)]\n", 88 | " b = trained_variables[(\"beta\", variable, n)]\n", 89 | " c = trained_variables[(\"gamma\", variable, n)]\n", 90 | " d = trained_variables[(\"delta\", variable)]\n", 91 | " result += a*numpy.exp(-b*(c-R)**2) + d\n", 92 | " return result" 93 | ] 94 | }, 95 | { 96 | "cell_type": "markdown", 97 | "metadata": {}, 98 | "source": [ 99 | "## The VQE Ansatz\n", 100 | "\n", 101 | "Now its time to define the ansatz for our molecular VQE. \n", 102 | "As in the paper, we will use the [UpCCGSD](https://pubs.acs.org/doi/10.1021/acs.jctc.8b01004) ansatz.\n", 103 | "\n", 104 | "The quantum circuit for this ansatz has the form \n", 105 | "$$\n", 106 | "U(\\boldsymbol{\\theta}) = \\left(\\prod_k e^{-i\\frac{\\theta_k}{2} G_k}\\right) U_\\text{ref} \n", 107 | "$$\n", 108 | "where the generators $G_k$ are qubit encoded products of fermionic creation and anihialtion operators; In this case, single excitations and pair-restricted double excitations of the form\n", 109 | "$$\n", 110 | "G_{pq} = i(a_p^\\dagger a_q - a^\\dagger_q a_p)\n", 111 | "$$\n", 112 | "and\n", 113 | "$$\n", 114 | "G_{pqrs} = i(a_p^\\dagger a_q a_r^\\dagger a_s - h.c.).\n", 115 | "$$\n", 116 | "The pair-restriction in the doubles requires the spin orbitals $p,q$ and $r,s$ to have the same spatial part. This is enforced in the code block below by iterating over spatial indices and generating $p,q$ and $r,s$ from them (`tequila` will enumerate spin-up with even and spin-down with off numbers).\n", 117 | "\n", 118 | "The qubit encoded generators are sums of tensor-products of Pauli matrices. Their explicit form depends on the qubit encoding chosen below (the default here is `jordan_wigner`). If you want to know the explicit form of some generators, just construct them as illustrated below, and then print them out. Note that the qubit encoding is set over the `transformation` key when the molecule object is created (see cells further below).\n", 119 | "\n", 120 | "The $U_\\text{ref}$ part of the circuit creates the Hartree-Fock reference. The explicit form also depends on the chosen qubit encoding and the `tequila` molecule object handles the correct initialization. In our specfic H$_2$\\STO-3G example below in `jordan_wigner` representation, the $U_\\text{ref}$ circuit consists of two $X$ gates on qubits 0 and 1 (the spin-up and spin-down encoded occupied HF orbital).\n", 121 | "\n", 122 | "Note that for the Hydrogen system we can neglect the singles for point-group symmetry reasons, and for the same reasons will only end up with one pair-ecitation for the doubles anyway. \n", 123 | "The code-block below will however generate the ansatz independent of the molecular that is passed to it. \n", 124 | "Note that the encoder is also passed to the function, so in principle you can also use other encoders as the ones defined above; They just need to have a call operator defined which takes the name of the variable to encode and the meta paramerer $R$." 125 | ] 126 | }, 127 | { 128 | "cell_type": "code", 129 | "execution_count": 3, 130 | "metadata": {}, 131 | "outputs": [], 132 | "source": [ 133 | "def encoded_upccgsd(molecule, encoder, R, layers=1, include_singles=True):\n", 134 | " U = molecule.prepare_reference()\n", 135 | " for layer in range(layers):\n", 136 | " for i in range(molecule.n_orbitals):\n", 137 | " for a in range(i+1,molecule.n_orbitals):\n", 138 | " # First the pair-restricted doubles\n", 139 | " # create the encoded angle objective\n", 140 | " angle = encoder(\"D_{}_{}_{}\".format(layer, i, a), R)\n", 141 | " G = molecule.make_excitation_generator(indices=[(2*i,2*a),(2*i+1,2*a+1)])\n", 142 | " U += tq.gates.Trotterized(generators=[G], angles=[angle], steps=1)\n", 143 | " if not include_singles:\n", 144 | " continue\n", 145 | " # now the same for the singles; we will use the same parameter\n", 146 | " # for spin-up and spin-down singles to enforce singlet to enforce singlet symmetry\n", 147 | " angle = encoder(\"S_{}_{}_{}\".format(layer, i, a), R)\n", 148 | " G1 = molecule.make_excitation_generator(indices=[(2*i,2*a)])\n", 149 | " G2 = molecule.make_excitation_generator(indices=[(2*i+1,2*a+1)])\n", 150 | " U += tq.gates.Trotterized(generators=[G1,G2], angles=[angle,angle], steps=1)\n", 151 | " return U" 152 | ] 153 | }, 154 | { 155 | "cell_type": "markdown", 156 | "metadata": {}, 157 | "source": [ 158 | "## Construction and Training of the meta-VQE \n", 159 | "\n", 160 | "Now we will construct our meta-VQE objective by summing up expectationvalues with meta parameters defined by a set of training points. \n", 161 | "\n", 162 | "After the `tequila` objective is created we minimize it with the `BFGS` optimizer of the `scipy` package. \n", 163 | "If you want to try another optimizer, see the tequila [tutorials](https://github.com/aspuru-guzik-group/tequila/blob/master/tutorials/Optimizer_Tutorial.ipynb) or type `tq.show_available_optimizers()` to see which optimizers are available on your system." 164 | ] 165 | }, 166 | { 167 | "cell_type": "code", 168 | "execution_count": 4, 169 | "metadata": {}, 170 | "outputs": [ 171 | { 172 | "name": "stdout", 173 | "output_type": "stream", 174 | "text": [ 175 | "initial values are:\n", 176 | " {('alpha', D_0_0_1, 0): 0.0, ('delta', D_0_0_1): 0.0, ('gamma', D_0_0_1, 0): 1.0, ('beta', D_0_0_1, 0): 1.0}\n", 177 | "Optimizer: \n", 178 | "backend : qulacs\n", 179 | "device : None\n", 180 | "samples : None\n", 181 | "save_history : True\n", 182 | "noise : None\n", 183 | "\n", 184 | "Method : BFGS\n", 185 | "Objective : 5 expectationvalues\n", 186 | "grad instr : 2-point\n", 187 | "gradient : scipy numerical 2-point\n", 188 | "hessian : scipy numerical None\n", 189 | "\n", 190 | "active variables : 4\n", 191 | "\n", 192 | "Optimization terminated successfully.\n", 193 | " Current function value: -1.010502\n", 194 | " Iterations: 13\n", 195 | " Function evaluations: 110\n", 196 | " Gradient evaluations: 22\n", 197 | "Finished Training of Meta VQE\n", 198 | "optimized meta-variables are:\n", 199 | " ('alpha', D_0_0_1, 0) : -1.3507766463040127\n", 200 | "('delta', D_0_0_1) : 1.5022768577876158\n", 201 | "('gamma', D_0_0_1, 0) : 0.6887929726422215\n", 202 | "('beta', D_0_0_1, 0) : 0.8901106480850393\n", 203 | "\n" 204 | ] 205 | } 206 | ], 207 | "source": [ 208 | "# define the encoder\n", 209 | "encoder = GaussianEncoder(n=1)\n", 210 | "\n", 211 | "# define details on the VQE ansatz\n", 212 | "layers = 1\n", 213 | "include_singles = False\n", 214 | "transformation = \"jordan_wigner\"\n", 215 | "geometry = \"H 0.0 0.0 0.0\\nH 0.0 0.0 {R}\" # gan also give path to an xyz file\n", 216 | "basis_set = \"sto-3g\"\n", 217 | "\n", 218 | "# define the training points\n", 219 | "training_points = [0.5, 0.7, 1.5, 3.0, 5.0]\n", 220 | "\n", 221 | "# define the test points\n", 222 | "start = 0.3\n", 223 | "end = 7.0\n", 224 | "steps = 25\n", 225 | "test_points = [start + step/steps*(end-start) for step in range(steps)]\n", 226 | "\n", 227 | "# Details on the used optimizer:\n", 228 | "optimizer_arguments = {}\n", 229 | "# see tq.show_available_optimizers() for other options\n", 230 | "optimizer_arguments[\"method\"] = \"bfgs\"\n", 231 | "# increase to see more output in the optimization\n", 232 | "optimizer_arguments[\"print_level\"] = 1\n", 233 | "optimizer_arguments[\"gradient\"] = \"2-point\"\n", 234 | "# eps for scipy < 1.5, and finite_diff_rel_step for scipy > 1.5\n", 235 | "optimizer_arguments[\"method_options\"] = {\"finite_diff_rel_step\":1.e-5, \"eps\":1.e-5, \"gtol\":1.e-5}\n", 236 | "\n", 237 | "\n", 238 | "#construct the tequila objective by accumulating expectation values of training points\n", 239 | "objective = 0.0\n", 240 | "for R in training_points:\n", 241 | " molecule = tq.chemistry.Molecule(geometry=geometry.format(R=R), basis_set=basis_set, transformation=transformation)\n", 242 | " H = molecule.make_hamiltonian()\n", 243 | " U = encoded_upccgsd(molecule, encoder, R, layers, include_singles)\n", 244 | " \n", 245 | " E = tq.ExpectationValue(H=H, U=U)\n", 246 | " objective += E\n", 247 | "\n", 248 | "objective = 1.0/len(training_points)*objective\n", 249 | " \n", 250 | "# initialize in a way that the encoded angles start with zero\n", 251 | "# initialize beta and gamma as 1.0, since they are width and shift of the Gaussians\n", 252 | "initial_values = {k:(1.0 if \"beta\" in k.name[0] or \"gamma\" in k.name[0] else 0.0) for k in objective.extract_variables()}\n", 253 | "\n", 254 | "# if we have more than one floating Gaussian, we should not initialize the shifts (gamma) to the same values\n", 255 | "# otherwise the optimizer can get confused\n", 256 | "if encoder._n > 1:\n", 257 | " initial_values = {k:(numpy.random.uniform(training_points[0], training_points[-1], 1)[0] if \"gamma\" in k.name[0] else initial_values[k]) for k in objective.extract_variables()}\n", 258 | "\n", 259 | "print(\"initial values are:\\n\", initial_values)\n", 260 | " \n", 261 | "# minimize the objective formed from the training points\n", 262 | "trained = tq.minimize(objective=objective, initial_values=initial_values, **optimizer_arguments)\n", 263 | "\n", 264 | "print(\"Finished Training of Meta VQE\")\n", 265 | "print(\"optimized meta-variables are:\\n\", trained.variables)\n", 266 | "\n" 267 | ] 268 | }, 269 | { 270 | "cell_type": "markdown", 271 | "metadata": {}, 272 | "source": [ 273 | "## Testing the performance of the meta-VQE\n", 274 | "\n", 275 | "Here we gonna test the performance of the meta-VQE by computing the expectation values of different points with the parameters of the quantum circuit initialized by the trained meta-VQE. For this we will need the `evaluate` function of the encoder. Furthermore we will compute the `fci` energy of each test point, and optimize the individual points with a standard VQE initialized with the meta-VQE values (opt-meta-VQE). \n", 276 | "See the paper for further details." 277 | ] 278 | }, 279 | { 280 | "cell_type": "code", 281 | "execution_count": 5, 282 | "metadata": {}, 283 | "outputs": [ 284 | { 285 | "name": "stdout", 286 | "output_type": "stream", 287 | "text": [ 288 | "processing test point +0.3000\n", 289 | "processing test point +0.5680\n", 290 | "processing test point +0.8360\n", 291 | "processing test point +1.1040\n", 292 | "processing test point +1.3720\n", 293 | "processing test point +1.6400\n", 294 | "processing test point +1.9080\n", 295 | "processing test point +2.1760\n", 296 | "processing test point +2.4440\n", 297 | "processing test point +2.7120\n", 298 | "processing test point +2.9800\n", 299 | "processing test point +3.2480\n", 300 | "processing test point +3.5160\n", 301 | "processing test point +3.7840\n", 302 | "processing test point +4.0520\n", 303 | "processing test point +4.3200\n", 304 | "processing test point +4.5880\n", 305 | "processing test point +4.8560\n", 306 | "processing test point +5.1240\n", 307 | "processing test point +5.3920\n", 308 | "processing test point +5.6600\n", 309 | "processing test point +5.9280\n", 310 | "processing test point +6.1960\n", 311 | "processing test point +6.4640\n", 312 | "processing test point +6.7320\n" 313 | ] 314 | } 315 | ], 316 | "source": [ 317 | "fci = {}\n", 318 | "meta = {}\n", 319 | "meta_angles = {}\n", 320 | "meta_opt = {}\n", 321 | "vqe = {}\n", 322 | "# we are using this to be able to use the same codeblocks\n", 323 | "dummy = DummyEncoder()\n", 324 | "for R in test_points:\n", 325 | " print(\"processing test point {:+2.4f}\".format(R))\n", 326 | " molecule = tq.chemistry.Molecule(geometry=geometry.format(R=R), basis_set=basis_set, transformation=transformation)\n", 327 | " H = molecule.make_hamiltonian()\n", 328 | " U = encoded_upccgsd(molecule, dummy, R, layers, include_singles)\n", 329 | " E = tq.ExpectationValue(H=H, U=U)\n", 330 | " \n", 331 | " # evaluate regular VQE with meta VQE parameters\n", 332 | " values = {k:encoder.evaluate(variable=k, R=R, trained_variables=trained.variables) for k in E.extract_variables()}\n", 333 | " energy = tq.simulate(E, variables=values)\n", 334 | " meta[R] = energy\n", 335 | " meta_angles[R] = values\n", 336 | " \n", 337 | " # optimize from meta VQE starting point\n", 338 | " result = tq.minimize(objective=E, initial_values=values, silent=True, **optimizer_arguments)\n", 339 | " meta_opt[R] = result.energy\n", 340 | " \n", 341 | " # try fci (you will need psi4 for this)\n", 342 | " try:\n", 343 | " fci[R] = molecule.compute_energy(\"fci\")\n", 344 | " except:\n", 345 | " if molecule.n_orbitals < 5:\n", 346 | " fci[R] = numpy.linalg.eigvalsh(H.to_matrix())[0]\n", 347 | " else:\n", 348 | " print(\"skipping fci for point \", R)\n" 349 | ] 350 | }, 351 | { 352 | "cell_type": "markdown", 353 | "metadata": {}, 354 | "source": [ 355 | "The collected data of the test above is plotted here. \n", 356 | "Since we only have one parameter in our simple guinny pig system here, we will also plot the quantum circuit's parameter with respect to the meta parameter $R$. \n", 357 | "If you have changed the molecule or the basis_set above, you might need to adapt the plot for the parameter in order to see the parameter you are interested in.\n", 358 | "\n", 359 | "For our guinny-pig system and the default settings in this notebook you see that the meta-VQE predicts the whole PES accurately with exception of the point at very close distance. The reason can be seen in the plot of the parameter. For this specific system and this specfic VQE ansatz, the ideal parameter will have a sigmoidal dependence on the meta parameter $R$ and the single floating Gaussian is not able to perfectly adapt to it. As explained in the paper: Chosing floating Gaussians was a pragmatic choice since they are fairly good approximators for generalized functions.\n", 360 | "\n", 361 | "\n", 362 | "If you are interested you can try to change the encoder above, to a sigmoidal function, then you will be able to fit this test system almost perfectly. Another way to improve is to increase the number of floating Gaussians. \n", 363 | "Feel free to play around with it!" 364 | ] 365 | }, 366 | { 367 | "cell_type": "code", 368 | "execution_count": 6, 369 | "metadata": {}, 370 | "outputs": [ 371 | { 372 | "data": { 373 | "image/png": "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\n", 374 | "text/plain": [ 375 | "
" 376 | ] 377 | }, 378 | "metadata": { 379 | "needs_background": "light" 380 | }, 381 | "output_type": "display_data" 382 | }, 383 | { 384 | "data": { 385 | "image/png": "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\n", 386 | "text/plain": [ 387 | "
" 388 | ] 389 | }, 390 | "metadata": { 391 | "needs_background": "light" 392 | }, 393 | "output_type": "display_data" 394 | }, 395 | { 396 | "data": { 397 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD4CAYAAAD8Zh1EAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nO3de3iU9Z338fc3k5AECERIOCUgQSAcRMGNrC62oliDh4L12e3iPmuvbWvtQfvY2qXC012t3YMH2l7W1T2w2tN2Vx7bIrCrEhW0tp6hIBAggKCSiSEBDQdJSDL5Pn8k0EBOEzLJPTP5vK6LS+ae3z3zEZ0Pv/zmPpi7IyIiiS8l6AAiIhIbKnQRkSShQhcRSRIqdBGRJKFCFxFJEqlBvXFOTo6PHz8+qLcXEUlIGzduPOjuue09F1ihjx8/ng0bNgT19iIiCcnM3uvoOS25iIgkCRW6iEiSUKGLiCSJwNbQ29PQ0EB5eTl1dXVBR0kYGRkZ5Ofnk5aWFnQUEQlYXBV6eXk5WVlZjB8/HjMLOk7cc3cOHTpEeXk5BQUFQccRkYDFVaHX1dWpzLvBzBg+fDjV1dVBR0kaqzaFWVZSRkVNLWOyM1lcXMgNs/JiNr6v9lGu5MjVXXFV6IDKvJv059Wxs/lQL125ldqGCADhmlqWrtwK0O5+3R3fV/soV3LkOhsW1OVzi4qK/Mzj0Hfs2MHUqVMDyZPI+sOfW0/LGSAzLYV7F0znqmmjONEYoa6h6Q//bIjwtf/8PYc+rm/zWtmZadx1zRSa3Glqcpocmtx56IVdHK5tbDN+SEYqX778PNydkx8vB9zhsd/t5Whd232yMlL5wpyCU2Nb+8kr+9rfJz2Vz88Z32b7T155l6Mnoh/fV/soV/v75GVn8sqSK9vdpz1mttHdi9p9ToWe+JL9z639cg7xj585nyumjODAkRMcOFLHgSN1VB1t/v2TG/ZT19AUYOq+0d4PaJ19pDv6ga4v9lGuDsYD++6/ruMXbPP6HRd63C25dEdvrEeFQiFmzJhBQ0MDqampfO5zn+Ob3/wmKSkdH+F533338fjjjxMKhXj44YcpLi7ucOzatWu54447iEQi3HLLLSxZsqTDsY888ggPPfQQ77zzDtXV1eTk5PTo3y1RPViy87QyB6htiPDNJ99ud/zQzLROy/yeT08jIy1EemoKGWkhMtJSSE8NcceKTRw81naGPnJIOqtum0PIDDMjlGKkGFzzo9/yweG2R2SNGZrBS4uvAJo/3Cc/32bGJx5cT0VN2306m6XNuX894ZraqPfp7vi+2ke52t9nTHZmu+PPRsIeh35y1hauqcX5w3rUqk3hHr1uZmYmmzdvprS0lOeff55nn32We++9t8Px27dvZ8WKFZSWlrJ27Vq+9rWvEYlE2h0biUS47bbbePbZZ9m+fTtPPPEE27dv7/C158yZwwsvvMC5557bo3+neLRqU5g596+nYMnTzLl//Wn/3dyddw9+zC9ef4+v/mJjuwV40t9eP41H/mIWv/zKpby8+Ap2/t183r7navI6+JDkZWfy+TkF3DR7HDdelM+1M0Zz5ZSRzJmYw99cN43MtNBp4zPTQiy9Ziqjh2YyYkgGuVnpDBs0gOyBA7hr/pR2x397/hQGpKYwIDWFtFAKqS2/QinGt4vb32dxcWGH/46Liwu7tU93x/fVPsrV/X26K25n6Pf+dynbK450+Pym92uoj5w+C6ttiPDtX23hiTffb3efaWOGcM+np0edYcSIESxfvpyLL76Y7373u+1+Abl69WoWLVpEeno6BQUFTJw4kTfffJNLL720zdg333yTiRMnMmHCBAAWLVrE6tWrmTZtWrvvP2vWrKizJpL2vhxasnILG9//iPqGJn635+CpmcyYoRkMHBDieH3bvyTzsjP54mXtH665uLiw3WWazj48J3+6i/anvu6O76t9lCs5cp2NuC30rpxZ5l1tP1sTJkwgEolQVVXFyJEj2zwfDoe55JJLTj3Oz88nHG7/p4RwOMzYsWNPG/vGG2/ENG8iWFZS1mYJpa6hif947T2GZKTyJ+fl8JW553HZxBzGDx/I6s0VvV7Orffrzgesu+P7ah/lSo5c3RW3hd7VTLqzNaz/9+W2s2OJHxXt/HeD5rXmTXdfTSjl9J+E+qqcRRJd3BZ6V87mR+qzsXfvXkKhECNGjGj3+by8PPbv33/qcXl5OXl57ZdId8Ymo6N1Dfzohd1tDss7aUx2ZpsyP0nlLNK1hP1S9IZZedx34wzysjMxmmfm9904I6Yf+urqar7yla9w++23d3gCz4IFC1ixYgUnTpxg37597N69m9mzZ7c79uKLL2b37t3s27eP+vp6VqxYwYIFC2KWN165O2vermDeD37D46/s49IJw8hIO/1/vd74y1ikv0nYGTr0zqyttraWmTNnnjps8eabb+bOO+/scPz06dP57Gc/y7Rp00hNTeXRRx8lFAq1OzY1NZVHHnmE4uJiIpEIX/jCF5g+veOlpYcffpgHH3yQyspKLrjgAq699loee+yxHv879qU9VUe5e3Upr75ziPPzhrD8c0XMHJvd66dAi/RHOrEoCcTjn9vx+kYeXreHx3+3t3n2PX8KfzF7XIdLKiISnaQ9sUjiw+mz7QyunjaSktIDVByu40//KJ8l10whZ3B60DFFkp4KPUolJSXcddddp20rKCjgqaeeajP20KFDzJs3r832devWMXz48DbbP/OZz7Bv377Ttj3wwAOdnnEaL9oeU17HT159j9FD0vnVVy6laPywgBOK9B9dFrqZ/Ri4Hqhy9/M7GXcx8BqwyN1/dbaB3D0uryBYXFwcdcEOHz6czZs3R/3a7f2lEK2glsxOau+YcgBLMZW5SB+L5iiXnwLzOxtgZiHgAeC5noTJyMjg0KFDgZdUojh5g4uMjIzAMnR0TPkHnZyuLyK9o8sZuru/bGbjuxj2deDXwMU9CZOfn095eblu2NANJ29BF5Rhgwa0e8nZWF5wSESi0+M1dDPLAz4DXEEXhW5mtwK3AowbN67N82lpabqVWgLZU3WMYycaME6/hreOKRcJRixOLHoIuMvdu7yIirsvd/cidy/Kzc2NwVtLUD76uJ4v/uwtsjLS+Nvrp/bqCV4iEp1YHOVSBKxo+SIzB7jWzBrdfVUMXlviUH1jE1/+xUY+OFzHilsv4aJx5/CFyyYEHUuk3+txobv7qTUSM/sp8D8q8+Tl7nznqa28ue9DfrRoJheNOyfoSCLSIprDFp8A5gI5ZlYO3AOkAbj7v/ZqOok7//byXn65sZw75k1i4Uwtq4jEk2iOcrkp2hdz97/qURqJayWllTywdifXXzCab1w1Keg4InKGhL3aovStbeHDfGPFZi7Iz+b7f3ZhXJ78JdLfqdClSweO1HHLzzZwzsA0/v1zf0RGWvtXkxSRYOlaLtKp2voIX/r5Bo7UNfDrr/4JI7KCOytVRDqnQpcONTU53/rlZraGD/PvNxcxdfSQoCOJSCdU6HKa1pfCHZyeytETjXzn2qlcNa3tDbJFJL6o0OWUMy+Fe/REI6EUI2fwgICTiUg09KWonNLepXAjTc73n9sVUCIR6Q4VupzS0aVwO9ouIvFFhS6ndHTJW10KVyQxqNDllL++ejJnni+kS+GKJA4VupwyJDMNd8gemKZL4YokIB3lIkDzVRQfemE344YNZN23LictpL/rRRKNPrUCwPqdVWwNH+b2KyeqzEUSlD65ctrs/DNaXhFJWCp00excJEno09vPaXYukjxU6P2cZuciyUOf4H5Ms3OR5KJC78c0OxdJLvoU91OanYskHxV6P/VimWbnIsmmy0+ymf3YzKrMbFsHz/9vM9tiZlvN7FUzuzD2MSWWNDsXSU7RTM1+Cszv5Pl9wOXuPgP4O2B5DHJJL3qxrIot5ZqdiySbLq/l4u4vm9n4Tp5/tdXD14H8nseS3qLZuUjyivX07IvAsx09aWa3mtkGM9tQXV0d47eWaGh2LpK8YvaJNrMraC70uzoa4+7L3b3I3Ytyc3Nj9dYSJc3ORZJbTArdzC4AHgMWuvuhWLymxJ5m5yLJrcefajMbB6wEbnZ33U04Tml2LpL8uvxS1MyeAOYCOWZWDtwDpAG4+78CdwPDgX+25vuXNbp7UW8FlrNzcnb+4J9eoNm5SJKK5iiXm7p4/hbglpglkpjT7Fykf9BULcmt2hSm6O9fYEv5YY7UNfD0lg+CjiQivUT3FE1iqzaFWbpyC7UNTQDUHG9g6cqtALrxs0gS0gw9iS0rKTtV5ifVNkRYVlIWUCIR6U0q9CRWUVPbre0ikthU6Els9NCMdrePyc7s4yQi0hdU6Ems+PxRbbZlpoVYXFwYQBoR6W0q9CRWdeQEg9NDjMnOwIC87Ezuu3GGvhAVSVI6yiVJHa1r4IUdB1h08VjuXXh+0HFEpA9ohp6knis9wInGJhbM1GxcpL9QoSep1W9XkH9OJheNyw46ioj0ERV6Ejp47ASv7DnIggvH0HJ9HRHpB1ToSeiZrR8QaXIWarlFpF9RoSeh1ZsrmDIqi8JRWUFHEZE+pEJPMvs/PM7G9z5iwcwxQUcRkT6mQk8y/72lAoBPX6BCF+lvVOhJZs3mCv7o3HMYO2xg0FFEpI+p0JPIzsoj7Kw8ykItt4j0Syr0JLJmcwWhFOPaGaODjiIiAVChJwl3Z83bFcyZmEPO4PSg44hIAFToSeL379dQ/lEtCy/UcotIf6VCTxJrNodJT03h6ukjg44iIgHpstDN7MdmVmVm2zp43szsYTPbY2ZbzOyi2MeUzjRGmnh66wfMmzqCrIy0oOOISECimaH/FJjfyfPXAJNaft0K/EvPY0l3vPrOIQ4eq2fBhTrVX6Q/67LQ3f1l4MNOhiwEfu7NXgeyzUyHWfSh1ZsryMpIZW5hbtBRRCRAsVhDzwP2t3pc3rKtDTO71cw2mNmG6urqGLy11DVEKCmt5JrzR5GRFgo6jogEqE+/FHX35e5e5O5FubmaTcbC+p1VHDvRqOUWEYlJoYeBsa0e57dskz6wenOYnMHpXHre8KCjiEjAYlHoa4DPtRztcglw2N0/iMHrShcO1zbwYlk1n75wNKEU3chCpL/r8ibRZvYEMBfIMbNy4B4gDcDd/xV4BrgW2AMcBz7fW2HldCWlldQ3NulGFiICRFHo7n5TF887cFvMEknU1myu4NzhA7kwf2jQUUQkDuhM0QRVdbSOV9/RfUNF5A9U6Anq6S0f0OToUrkicooKPUGt3lzBtNFDmDhC9w0VkWYq9AT03qGP2by/RvcNFZHTqNAT0JrNLfcN1aVyRaQVFXqCcXdWv13B7PHDyMvODDqOiMQRFXoCWbUpzB//4zr2VB2j7MBRVm3SCbki8gddHocu8WHVpjBLV26ltiECNJ8lunTlVgBumKUTi0REM/SEsayk7FSZn1TbEGFZSVlAiUQk3qjQE0RFTW23totI/6NCTxBjOvgCtKPtItL/qNATxOLiQs48wz8zLcTi4sJgAolI3FGhJ4jLJuXgDlkZqRiQl53JfTfO0BeiInKKjnJJEC+VNd+y74kvXcL5ebq6ooi0pRl6gli/8wAjh6QzfcyQoKOISJxSoSeA+sYmXt51kCunjNClckWkQyr0BPDWux9y7EQjV04ZGXQUEYljKvQEsG5HFQNSU5gzUTeCFpGOqdDjnLuzbucB/uS84QwcoO+wRaRjKvQ4t/fgx7x36DjzpowIOoqIxLmoCt3M5ptZmZntMbMl7Tw/zsxeNLNNZrbFzK6NfdT+ad2OAwBcoUIXkS50WehmFgIeBa4BpgE3mdm0M4b9DfCku88CFgH/HOug/dW6HVVMGZVF/jkDg44iInEumhn6bGCPu+9193pgBbDwjDEOnDxAeihQEbuI/dfh4w1seO8j5k3V7FxEuhZNoecB+1s9Lm/Z1tp3gb80s3LgGeDr7b2Qmd1qZhvMbEN1dfVZxO1ffrO7mkiT63BFEYlKrL4UvQn4qbvnA9cC/2FmbV7b3Ze7e5G7F+Xm5sborZPX+h0HGDZoADPHZgcdRUQSQDSFHgbGtnqc37KttS8CTwK4+2tABpATi4D9VWOkiZd2VTO3MJdQis4OFZGuRVPobwGTzKzAzAbQ/KXnmjPGvA/MAzCzqTQXutZUemDT/hpqjjcwT8stIhKlLgvd3RuB24ESYAfNR7OUmtn3zGxBy7BvAV8ys7eBJ4C/cnfvrdD9wbodVaSmGJ+YrB90RCQ6UZ166O7P0PxlZ+ttd7f6/XZgTmyj9W/rdx5gdsEwhmSkBR1FRBKEzhSNQ/s/PM6uA8e4UicTiUg3qNDj0PqdVQDMm6r1cxGJngo9Dq3bWcWEnEEU5AwKOoqIJBAVepz5+EQjr79zSMstItJtKvQ487s9B6mPNHGlTvcXkW5SoceZdTsOkJWRysXjhwUdRUQSjAo9jjQ1Oet3VnP55FzSQvpPIyLdo9aII1vDhzl47ISurigiZ0WFHkfW7awixeDyySp0Eek+FXocWb/zABeNO4dhgwYEHUVEEpAKPU5UHq5jW/iIjm4RkbOmQo8TL5a1nB2qqyuKyFlSoceJdTuqyMvOZPLIwUFHEZEEpUKPA3UNEV7Zc5B5U0dgpptZiMjZUaHHgdf2HqK2IaLT/UWkR1TocWD9jioy00JcMmF40FFEJIGp0APm7qzfWcVlk3LISAsFHUdEEpgKPWBlB44SrqllnpZbRKSHVOgBW7ej+XBFrZ+LSE9FdU9Rib1Vm8IsKykjXFNLWsh49Z1D3DArL+hYIpLAVOgBWLUpzNKVW6ltiADQEHGWrtwKoFIXkbMW1ZKLmc03szIz22NmSzoY81kz225mpWb2X7GNmVyWlZSdKvOTahsiLCspCyiRiCSDLmfoZhYCHgU+BZQDb5nZGnff3mrMJGApMMfdPzIzLQh3oqKmtlvbRUSiEc0MfTawx933uns9sAJYeMaYLwGPuvtHAO5eFduYyWVMdma3touIRCOaQs8D9rd6XN6yrbXJwGQze8XMXjez+e29kJndamYbzGxDdXX12SVOAouLCxkQOv0U/8y0EIuLCwNKJCLJIFaHLaYCk4C5wE3Av5tZ9pmD3H25uxe5e1Fubm6M3jrx3DArjwvyh2IGBuRlZ3LfjTP0haiI9Eg0R7mEgbGtHue3bGutHHjD3RuAfWa2i+aCfysmKZNMQ6SJXQeOceOsfH7w2QuDjiMiSSKaGfpbwCQzKzCzAcAiYM0ZY1bRPDvHzHJoXoLZG8OcSeX1vYc4UtfI/PNHBR1FRJJIl4Xu7o3A7UAJsAN40t1Lzex7ZragZVgJcMjMtgMvAovd/VBvhU50a7dVMnBAiE9Mygk6iogkkahOLHL3Z4Bnzth2d6vfO3Bnyy/pRKTJKSk9wBWFI3QxLhGJKV3LpY9tev8jDh47QbGWW0QkxlTofWzttkoGhFK4orD/HuUjIr1Dhd6H3J21pZVcNimHrIy0oOOISJJRofeh0oojlH9Uy/zpWm4RkdhTofehktJKUgyumjYy6CgikoRU6H1o7bZK/rhgOMMGDQg6iogkIRV6H9lTdYzdVcd0MpGI9BoVeh8pKa0E4OrpWm4Rkd6hQu8jJaWVzBybzeihukSuiPQOFXofCNfUsqX8sJZbRKRXqdD7QMm25uWWYh2uKCK9SIXeB9aWVjJlVBYFOYOCjiIiSUyF3suqj57grXc/1OxcRHqdCr2XvbDjAO5o/VxEep0KvZet3VbJucMHMmVUVtBRRCTJqdB70eHaBl595yDzp4/CzLreQUSkB1TovejFnVU0RFzXPheRPqFC70Vrt1Uyckg6M/Ozg44iIv2ACr2X1NZHeGlXFcXTR5GSouUWEel9KvRe8ptd1dQ1NOna5yLSZ6IqdDObb2ZlZrbHzJZ0Mu5/mZmbWVHsIiamktJKsgemMbtgWNBRRKSf6LLQzSwEPApcA0wDbjKzae2MywLuAN6IdchEU9/YxAs7DvCpqSNJDemHIBHpG9G0zWxgj7vvdfd6YAWwsJ1xfwc8ANTFMF9Cem3vIY7WNepkIhHpU9EUeh6wv9Xj8pZtp5jZRcBYd386htkS1tptlQwaEGLOxJygo4hIP9Lj9QAzSwF+CHwrirG3mtkGM9tQXV3d07eOS5Em5/ntlVwxZQQZaaGg44hIPxJNoYeBsa0e57dsOykLOB94yczeBS4B1rT3xai7L3f3Incvys3NPfvUcWzjex9x8Fi9lltEpM9FU+hvAZPMrMDMBgCLgDUnn3T3w+6e4+7j3X088DqwwN039EriOLd2WyUDUlOYWzgi6Cgi0s90Weju3gjcDpQAO4An3b3UzL5nZgt6O2AicXdKSiv55KQcBqenBh1HRPqZqFrH3Z8Bnjlj290djJ3b81iJaVv4COGaWr5x1aSgo4hIP6RpZAys2hRmWUkZ4ZpaoPk4dBGRvqZC76FVm8IsXbmV2obIqW1///QOBqWncsOsvE72FBGJLZ3G2EPLSspOK3OA2oYIy0rKAkokIv1VQs3QTy5tVNTUMiY7k8XFhYHPgitallmi3S4i0lsSZoZ+cmkjXFOLA+GaWpau3MqqTeEu9+1NY7Izu7VdRKS3JEyhx+vSxuLiQkJnXO48My3E4uLCYAKJSL+VMIUer0sbk0dmEXHISk/FgLzsTO67cUbgS0Ei0v8kzBr6mOzMU4cFnrk9SD98fhdDMlL57V1XMjQzLdAsItK/JcwMfXFxIZlnXOwqNcUCXdp4e38NL+w4wJc+MUFlLiKBS5gZ+skljJNHuWSkhahvjAR6R6AfPL+Lcwam8fnLCgLLICJyUsLM0KG51F9ZciX77r+O5+/8JKFQSmBfir717oe8vKuar849T9dtEZG4kFCF3lr+OQO55bICntoU5u39NX363u7O90vKyM1K5+ZLxvfpe4uIdCRhCx3gq3PPI2fwAP7h6R24e5+976vvHOKNfR9y29zzyBygm1iISHxI6ELPykjjm5+azJvvfkhJaWWfvKe78/3nyhg9NINFs8f1yXuKiEQjoQsd4M+LxjJpxGDue3Znn1zl8KWyaja9X8PXr5ykW8yJSFxJ+EJPDaXwneum8t6h4/z8tXd79b3cnR88X8a4YQP5s6L8Xn0vEZHuSvhCB5hbOIJPTMrhn9bvoeZ4fa+9T0npAbaFj/B/5k0iLZQUf3QikkSSppW+c91UjtY18KN1u3vl9SNNzg+fL2NC7iBumDmmV95DRKQnkqbQp4wawp9fPJb/eO099lYfi/nr/8+WCnYdOMY3rppMqmbnIhKHkqqZvvmpyaSnpnD/sztj+rqNkSZ+9MJuCkdmcf2M0TF9bRGRWEmqQh+RlcFX557Hc9sP8PreQzF73ac2hdl78GPuvHoyKSnW9Q4iIgGIqtDNbL6ZlZnZHjNb0s7zd5rZdjPbYmbrzOzc2EeNzi2fmMCYoRn8/dPbaWrq+clG9Y1N/GjdbmbkDeXqaSNjkFBEpHd0WehmFgIeBa4BpgE3mdm0M4ZtAorc/QLgV8CDsQ4arYy0EIvnF7ItfIRVm3t+N6NfbtxP+Ue13Hn1ZMw0OxeR+BXNDH02sMfd97p7PbACWNh6gLu/6O7HWx6+DgR6kPbCC/O4IH8oD64to7Y+0vUOHahriPBP6/Zw0bhs5k7OjWFCEZHYi6bQ84D9rR6Xt2zryBeBZ9t7wsxuNbMNZrahuro6+pTdlJJi/M1106g8Usdjv9171q/zX2+8T+WROv766kLNzkUk7sX0uq9m9pdAEXB5e8+7+3JgOUBRUVGvXk1rdsEw5k8fxb/85h3+/OKxjBiSEfW+qzaFeWDtTj44XMeA1BSqjp7oxaQiIrERTaGHgbGtHue3bDuNmV0FfAe43N3jogGXXDOF57ZXMvf7L1FbH2FMdiaLiws7vd/nqk1hlq7cQm1D83Vh6hubWLpyK4DuEyoicS2aQn8LmGRmBTQX+SLgL1oPMLNZwL8B8929KuYpz9Lm/TWYGcdb1tHDNbUsWbmFisO1nD9mKFVHT1B1tI6qIyeobvn979+vIXLG0TG1DRGWlZSp0EUkrnVZ6O7eaGa3AyVACPixu5ea2feADe6+BlgGDAZ+2bLW/L67L+jF3FFZVlLWppzrGpp4cO3pdzkanJ7KiKx0crPS24w/qaKdG1SLiMSTqNbQ3f0Z4Jkztt3d6vdXxThXTHRWwk9++VJGZKUzYkg6Awf84Y9hzv3rCbez35jszF7JKCISK0l1puiZOirhvOxMZhcMY3zOoNPKHGBxcSGZZ1znPDMtxOLiwl7LKSISC0ld6GdTzjfMyuO+G2eQl52J0Vz+9904Q+vnIhL3kvp29SdLeFlJGRU1tVEd5XJyPxW4iCSapC50UDmLSP+R1EsuIiL9iQpdRCRJqNBFRJKECl1EJEmo0EVEkoS59+pFDzt+Y7Nq4GPgYCABYiOHxM2v7MFJ5PzKHozW2c9193Zv0BBYoQOY2QZ3LwosQA8lcn5lD04i51f2YESbXUsuIiJJQoUuIpIkgi705QG/f08lcn5lD04i51f2YESVPdA1dBERiZ2gZ+giIhIjKnQRkSQRWKGb2XwzKzOzPWa2JKgc3WVmPzazKjPbFnSW7jKzsWb2opltN7NSM7sj6EzdYWYZZvammb3dkv/eoDN1l5mFzGyTmf1P0Fm6w8zeNbOtZrbZzDYEnae7zCzbzH5lZjvNbIeZXRp0pmiYWWHLn/nJX0fM7Bsdjg9iDd3MQsAu4FNAOc03or7J3bf3eZhuMrNPAseAn7v7+UHn6Q4zGw2Mdvffm1kWsBG4IRH+3AGs+Ya1g9z9mJmlAb8D7nD31wOOFjUzuxMoAoa4+/VB54mWmb0LFLl7Qp6YY2Y/A37r7o+Z2QBgoLvXBJ2rO1p6Mwz8sbu/196YoGbos4E97r7X3euBFcDCgLJ0i7u/DHwYdI6z4e4fuPvvW35/FNgBJMzF4r3ZsZaHaS2/EuZbfTPLB64DHgs6S39iZkOBTwKPA7h7faKVeYt5wDsdlTkEV+h5wP5Wj8tJoGJJBmY2HpgFvBFsku5pWbLYDFQBz7t7IuV/CPg20BR0kLPgwHNmttHMbg06TDcVANXAT1qWu4Ribd8AAAG8SURBVB4zs0FBhzoLi4AnOhugL0X7ITMbDPwa+Ia7Hwk6T3e4e8TdZwL5wGwzS4hlLzO7Hqhy941BZzlLl7n7RcA1wG0tS4+JIhW4CPgXd59F8zWkEuZ7O4CWZaIFwC87GxdUoYeBsa0e57dsk17Wsvb8a+A/3X1l0HnOVsuPzC8C84POEqU5wIKWtegVwJVm9otgI0XP3cMt/6wCnqJ52TRRlAPlrX6a+xXNBZ9IrgF+7+4HOhsUVKG/BUwys4KWv3kWAWsCytJvtHyp+Diww91/GHSe7jKzXDPLbvl9Js1fqu8MNlV03H2pu+e7+3ia/39f7+5/GXCsqJjZoJYv0WlZqrgaSJijvNy9EthvZoUtm+YBCXEgQCs30cVyCwR0k2h3bzSz24ESIAT82N1Lg8jSXWb2BDAXyDGzcuAed3882FRRmwPcDGxtWYcG+L/u/kyAmbpjNPCzlm/7U4An3T2hDv9LUCOBp5rnA6QC/+Xua4ON1G1fB/6zZQK5F/h8wHmi1vKX6KeAL3c5Vqf+i4gkB30pKiKSJFToIiJJQoUuIpIkVOgiIklChS4ikiRU6CIiSUKFLiKSJP4/sGhmQrKuHnwAAAAASUVORK5CYII=\n", 398 | "text/plain": [ 399 | "
" 400 | ] 401 | }, 402 | "metadata": { 403 | "needs_background": "light" 404 | }, 405 | "output_type": "display_data" 406 | } 407 | ], 408 | "source": [ 409 | "import matplotlib.pyplot as plt\n", 410 | "\n", 411 | "plt.plot(list(meta.keys()), list(meta.values()), label=\"meta-VQE\", marker=\"o\")\n", 412 | "plt.plot(list(fci.keys()), list(fci.values()), label=\"FCI\", marker=\"x\", markersize=3)\n", 413 | "plt.legend()\n", 414 | "plt.show()\n", 415 | "plt.figure()\n", 416 | "\n", 417 | "plt.plot(list(meta_opt.keys()), list(meta_opt.values()), label=\"opt-meta-VQE\", marker=\"o\")\n", 418 | "plt.plot(list(fci.keys()), list(fci.values()), label=\"FCI\", marker=\"x\", markersize=3)\n", 419 | "plt.legend()\n", 420 | "plt.show()\n", 421 | "plt.figure()\n", 422 | "\n", 423 | "# plot specfic angles\n", 424 | "key = tq.assign_variable(\"D_{}_{}_{}\".format(0, 0, 1))\n", 425 | "angles = [angles[key] for angles in meta_angles.values()]\n", 426 | "plt.plot(list(meta_angles.keys()), angles, label=key.name, marker=\"o\")\n", 427 | "plt.legend()\n", 428 | "plt.show()" 429 | ] 430 | }, 431 | { 432 | "cell_type": "markdown", 433 | "metadata": {}, 434 | "source": [ 435 | "## The example from the Paper:\n", 436 | "In the paper we used the rectangular H$_4$ system with STO-3G as basis_set. \n", 437 | "Below we give the structural data for this system." 438 | ] 439 | }, 440 | { 441 | "cell_type": "code", 442 | "execution_count": 7, 443 | "metadata": {}, 444 | "outputs": [], 445 | "source": [ 446 | "geomstring = \"H 0.0 0.0 0.0\\nH 0.0 0.0 1.23\\nH {R} 0.0 0.0\\nH {R} 0.0 1.23\"\n", 447 | "include_singles=True\n", 448 | "training_points = [0.5, 1.0, 1.5, 2.0, 2.5]" 449 | ] 450 | } 451 | ], 452 | "metadata": { 453 | "kernelspec": { 454 | "display_name": "Python [conda env:tqenv2] *", 455 | "language": "python", 456 | "name": "conda-env-tqenv2-py" 457 | }, 458 | "language_info": { 459 | "codemirror_mode": { 460 | "name": "ipython", 461 | "version": 3 462 | }, 463 | "file_extension": ".py", 464 | "mimetype": "text/x-python", 465 | "name": "python", 466 | "nbconvert_exporter": "python", 467 | "pygments_lexer": "ipython3", 468 | "version": "3.8.5" 469 | } 470 | }, 471 | "nbformat": 4, 472 | "nbformat_minor": 2 473 | } 474 | -------------------------------------------------------------------------------- /.ipynb_checkpoints/QFit-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Fitting functions with a quantum circuit\n", 8 | "___________________________________\n", 9 | "\n", 10 | "_This notebook is part of the Q-Hack 2021 presentation (you can find the [slides here](https://albacl.github.io/files/QHack2021.pdf) and the [recording here](https://www.twitch.tv/videos/920118091))._\n", 11 | "\n", 12 | "In this notebook, I will present simple circuits to encode the data into a quantum circuit utilizing the angles in the rotational gates. With that, we can check if the quantum circuit can approximate a given function. The explicit circuits presented are for only one qubit, but its generalization to multiple-qubits follows.\n", 13 | "\n", 14 | "This notebook is based on the references:\n", 15 | "\n", 16 | "- _One qubit as a Universal Approximant_, A. Pérez-Salinas, D. López-Núñez, A. García-Sáez, P. Forn-Díaz, J. I. Latorre, [arXiv:2102.04032 [quant-ph]](https://arxiv.org/abs/2102.04032) (2021).\n", 17 | "- _The effect of data encoding on the expressive power of variational quantum machine learning models_, M. Schuld, R. Sweke, J. J. Meyer, [arXiv:2008.08605 [quant-ph]](https://arxiv.org/abs/2008.08605) (2020).\n", 18 | "- _Data re-uploading for a universal quantum classifier_, A. Pérez-Salinas, A. Cervera-Lierta, E. Gil-Fuster, J. I. Latorre, [Quantum 4, 226 (2020)](https://quantum-journal.org/papers/q-2020-02-06-226/).\n", 19 | "\n", 20 | "You will need to install [Tequila](https://github.com/aspuru-guzik-group/tequila) package to run it." 21 | ] 22 | }, 23 | { 24 | "cell_type": "code", 25 | "execution_count": 1, 26 | "metadata": {}, 27 | "outputs": [], 28 | "source": [ 29 | "import tequila as tq\n", 30 | "import numpy as np\n", 31 | "import matplotlib.pyplot as plt\n", 32 | "from numpy import random" 33 | ] 34 | }, 35 | { 36 | "cell_type": "markdown", 37 | "metadata": {}, 38 | "source": [ 39 | "## Quantum Circuit\n", 40 | "\n", 41 | "We will encode the data into the rotational gates of a quantum circuit.\n", 42 | "As an example, for one qubit, we select the following encoding:\n", 43 | "$$ U\\left(\\vec{\\theta},x\\right) = R_{y}\\left(\\theta^{(1)}\\right)R_{z}\\left(\\theta^{(2)}x + \\theta^{(3)}\\right), $$\n", 44 | "where $x$ is a given data point (in this case, we consider 1D data), $\\vec{\\theta}=\\left(\\theta^{(1)}, \\theta^{(2)}, \\theta^{(3)}\\right)$ and $R_{k}\\left(\\theta\\right)=e^{i\\frac{\\theta}{2}\\sigma_{k}}$ with $k=x,y,z$.\n", 45 | "\n", 46 | "The strategy will be the following: the total quantum circuit will be a concatenation of $U$ gates that feed the circuit with the data and some parameters to be optimized, i.e.\n", 47 | "$$ U_{feed}\\left(\\vec{\\theta}_{1},\\cdots,\\vec{\\theta}_{L};x\\right) = U\\left(\\vec{\\theta}_{L},x\\right)U\\left(\\vec{\\theta}_{L-1},x\\right)\\cdots U\\left(\\vec{\\theta}_{1},x\\right). $$\n", 48 | "We need to establish the number of _layers_ $L$ of our circuit and we will have to find the optimal values of the $3L$ parameters. We expect that the larger the number of layers, the more sophisticated will be the encoding and the higher the accuracy of the function." 49 | ] 50 | }, 51 | { 52 | "cell_type": "code", 53 | "execution_count": 2, 54 | "metadata": {}, 55 | "outputs": [], 56 | "source": [ 57 | "def qcircuit(x, layers, param):\n", 58 | " qc = tq.QCircuit()\n", 59 | " p = 0 # all parameters are stored in a single list\n", 60 | " for l in range(layers): # add layers to the circuit\n", 61 | " qc += tq.gates.Ry(param[p],0) + tq.gates.Rz(x*param[p+1]+param[p+2],0) # feed the troll!\n", 62 | " p = p + 3\n", 63 | " return qc" 64 | ] 65 | }, 66 | { 67 | "cell_type": "markdown", 68 | "metadata": {}, 69 | "source": [ 70 | "## Learning the function\n", 71 | "\n", 72 | "Once we have the data encoded into the quantum circuit (a.k.a. _feature map_), we have to design a cost function that will allow us to optimize the circuit parameters.\n", 73 | "\n", 74 | "Since we are dealing with only one qubit, a simple approach is to measure it on the computational basis and depending on the expectation value of $Z$ operator, we compare it with the value of the target function to learn. This function has to be rescaled between -1 and 1 accordingly. Thus, we construct the cost function by taking a set of data training points $\\left(x_{1},\\cdots,x_{M}\\right)$, running out $U_feed$ circuit with each of them and computing the expectation value of $Z$ with the resultant state:\n", 75 | "$$\\mathcal{L}oss\\left(\\vec{\\theta}_{1},\\cdots,\\vec{\\theta}_{L}\\right)=\\sum_{i=1}^{M}\\left(|\\langle 0|U_{feed}^{\\dagger}(x_{i})ZU_{feed}(x_{i})|0\\rangle|^2 - f(x_{i})\\right)^2, $$\n", 76 | "were I ommited the $\\theta$ dependency in $U_{feed}$." 77 | ] 78 | }, 79 | { 80 | "cell_type": "code", 81 | "execution_count": 3, 82 | "metadata": {}, 83 | "outputs": [], 84 | "source": [ 85 | "# Function\n", 86 | "def f(x):\n", 87 | " func = np.sin(10*x)/(10*x)\n", 88 | " return func\n", 89 | "\n", 90 | "# Cost function\n", 91 | "def loss(xval,layers,param):\n", 92 | " obj = 0\n", 93 | " for i in range(len(xval)):\n", 94 | " qc = qcircuit(xval[i],layers, param)\n", 95 | " expval = tq.ExpectationValue(qc, H=tq.paulis.Z(0))\n", 96 | " obj += (expval-f(xval[i]))**2\n", 97 | " return obj/len(xval)" 98 | ] 99 | }, 100 | { 101 | "cell_type": "markdown", 102 | "metadata": {}, 103 | "source": [ 104 | "We are ready for the circuit optimization! To compare how the accuracy changes with the number of layers, we will optimize for up to `laymax` layers. We have also to create the training data set (in this example, we will take random points between -1 and 1)" 105 | ] 106 | }, 107 | { 108 | "cell_type": "code", 109 | "execution_count": 4, 110 | "metadata": {}, 111 | "outputs": [ 112 | { 113 | "name": "stdout", 114 | "output_type": "stream", 115 | "text": [ 116 | "1 layers\n", 117 | "Loss function = 0.13260757536486664\n", 118 | "2 layers\n", 119 | "Loss function = 0.04352773925273443\n", 120 | "3 layers\n", 121 | "Loss function = 0.00035727648165960176\n", 122 | "4 layers\n", 123 | "Loss function = 0.0001931700809334706\n" 124 | ] 125 | } 126 | ], 127 | "source": [ 128 | "training_set = 25 # number of training points\n", 129 | "laymax = 4\n", 130 | "\n", 131 | "# generate the training data\n", 132 | "xval=[]\n", 133 | "for i in range(training_set):\n", 134 | " rand = random.uniform(-1,1)\n", 135 | " xval.append(rand)\n", 136 | "\n", 137 | "# Optimization details \n", 138 | "grad = '2-point' # numerical gradient (= None: analytical gradient)\n", 139 | "mthd = 'BFGS' # minimization method\n", 140 | "backend = 'qulacs' # you can choose another, Qiskit, pyquil, cirq,... check the documentation\n", 141 | "mthd_opt = {'eps':1.e-4} # method options (that's the stepsize for the gradients)\n", 142 | "\n", 143 | "train_param = [[]]*(laymax+1)\n", 144 | "for l in range(1,laymax+1):\n", 145 | " \n", 146 | " # Generate the needed variables\n", 147 | " param = [tq.Variable(name='th{}'.format(i)) for i in range(0,3*l)]\n", 148 | " # Initialize them at random\n", 149 | " param0 = {key : random.uniform(0, 2*np.pi) for key in param}\n", 150 | " \n", 151 | " # Optimize!\n", 152 | " train = tq.minimize(objective=loss(xval,l,param), initial_values = param0, method = mthd, \n", 153 | " gradient = grad, method_options = mthd_opt, backend = backend, \n", 154 | " silent=True) # silent=False to see the optimization\n", 155 | " \n", 156 | " print(\"{}\".format(l),\" layers\")\n", 157 | " print(\"Loss function = \", train.energy)\n", 158 | " \n", 159 | " train_param[l] = train.angles # saving the parameters \n", 160 | " # You can plot the history plot of the optimization! both for the energy and angles. Check the documentation." 161 | ] 162 | }, 163 | { 164 | "cell_type": "markdown", 165 | "metadata": {}, 166 | "source": [ 167 | "## Test and results\n", 168 | "\n", 169 | "Once we have the optimized parameters, we can proceed to test the results by running new circuits with other data values." 170 | ] 171 | }, 172 | { 173 | "cell_type": "code", 174 | "execution_count": 5, 175 | "metadata": {}, 176 | "outputs": [ 177 | { 178 | "data": { 179 | "image/png": "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\n", 180 | "text/plain": [ 181 | "
" 182 | ] 183 | }, 184 | "metadata": { 185 | "needs_background": "light" 186 | }, 187 | "output_type": "display_data" 188 | } 189 | ], 190 | "source": [ 191 | "test_set = 100 # number of test points\n", 192 | "\n", 193 | "col = ['red','blue','orange','brown']\n", 194 | "\n", 195 | "# generate the test data\n", 196 | "xtest=[]\n", 197 | "for i in range(test_set):\n", 198 | " rand = random.uniform(-1,1)\n", 199 | " xtest.append(rand) \n", 200 | " \n", 201 | "for l in range(1,laymax+1):\n", 202 | " \n", 203 | " param = [tq.Variable(name='th{}'.format(i)) for i in range(0,3*l)]\n", 204 | " ytrain=[]\n", 205 | " for i in range(test_set):\n", 206 | " \n", 207 | " qc = qcircuit(xtest[i], l, param) # construct again the QFit\n", 208 | " expval = tq.ExpectationValue(qc, H=tq.paulis.Z(0)) # compute the expectation value\n", 209 | " res_test = tq.simulate(expval,variables=train_param[l]) # use the optimized angles to check the result!\n", 210 | " \n", 211 | " ytrain.append(res_test)\n", 212 | " \n", 213 | " plt.plot(xtest, ytrain, '.', color=col[l-1], label = \"{} layers\".format(l))\n", 214 | " \n", 215 | "xfunc = np.arange(-1., 1., 0.01)\n", 216 | "plt.plot(xfunc,f(xfunc), '-', color='black', label =\"exact\") \n", 217 | "plt.xlabel(\"x\")\n", 218 | "plt.ylabel(\"f(x)\")\n", 219 | "plt.legend()\n", 220 | "plt.show()" 221 | ] 222 | }, 223 | { 224 | "cell_type": "markdown", 225 | "metadata": {}, 226 | "source": [ 227 | "## Conclusions and some open questions\n", 228 | "\n", 229 | "As you can see, one qubit has the capability of learning an arbitrary function. The data re-uploading strategy used (repeating the same encoding multiple times) increases the accuracy as more layers are considered. This result comes from the fact that a qubit can represent the Fourier series, which in turn can represent arbitrary continuous functions. It can also be proved the universality of a single-qubit as a function approximator by means of the Universal Approximation Theorem.\n", 230 | "\n", 231 | "- These are the results for only one qubit, what happens if we consider more and entanglement between layers? Do we require more or fewer parameters to learn the function with similar accuracy?\n", 232 | "- We used a particular encoding. Are there encodings that involve less number of parameters without compromising the accuracy?\n", 233 | "- We only tested a 1d model. What about higher-dimensional functions?\n", 234 | "- What about using quantum data instead of classical data that we introduce \"manually\" to the circuit?\n", 235 | "- To construct the cost function, we measure the state on the computational basis. What about measuring it on another basis? (hint: by using a final rotation without the data point that projects into a different basis)\n", 236 | "- Can we design more clever cost functions?\n", 237 | "\n", 238 | "**I hope you enjoyed this small tutorial and do not hesitate to contact me with questions or ideas!**" 239 | ] 240 | }, 241 | { 242 | "cell_type": "code", 243 | "execution_count": null, 244 | "metadata": {}, 245 | "outputs": [], 246 | "source": [] 247 | } 248 | ], 249 | "metadata": { 250 | "kernelspec": { 251 | "display_name": "Python [conda env:tqenv2] *", 252 | "language": "python", 253 | "name": "conda-env-tqenv2-py" 254 | }, 255 | "language_info": { 256 | "codemirror_mode": { 257 | "name": "ipython", 258 | "version": 3 259 | }, 260 | "file_extension": ".py", 261 | "mimetype": "text/x-python", 262 | "name": "python", 263 | "nbconvert_exporter": "python", 264 | "pygments_lexer": "ipython3", 265 | "version": "3.8.5" 266 | } 267 | }, 268 | "nbformat": 4, 269 | "nbformat_minor": 4 270 | } 271 | -------------------------------------------------------------------------------- /Molecular-Meta-VQE.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Non-Linear Molecular Meta-VQE \n", 8 | "_______________________________________________________\n", 9 | "\n", 10 | "_Authors:_ Alba Cervera-Lierta, Jakob S. Kottmann, Alán Aspuru-Guzik.\n", 11 | "\n", 12 | "This notebook presents a demo code illustrate a non-linear molecular meta-VQE as introduced in the article \"The Meta-Variational Quantum Eigensolver (Meta-VQE): Learning energy profiles of parameterized Hamiltonians for quantum simulation\" (http://arxiv.org/abs/2009.13545).\n", 13 | "\n", 14 | "We will explicitly illustrate how to construct a non-linear meta-VQE for molecular systems. \n", 15 | "In this Notebook we will use the simplest system available, the Hydrogen molecule in a minimal representation. \n", 16 | "The molecular coordinates, or the basis-set can however be replaced (as long as there is just a single meta-parameter $R$ in the coordinates), but note that the training will take substantially longer, depending on the system/basis you chose, and a jupyter notebook is probably not the best environment anymore.\n", 17 | "\n", 18 | "In order to run the notebook you need to have `tequila` installed. \n", 19 | "Just follow the intructions from the [AAG github repository](https://github.com/aspuru-guzik-group/tequila) and let us know if you experience any troubles. Feel also free to check out the `tequila` [tutorials](https://github.com/aspuru-guzik-group/tequila/tree/master/tutorials). For this notebook we recommend [basic usage](https://github.com/aspuru-guzik-group/tequila/blob/master/tutorials/BasicUsage.ipynb) and [basic chemistry](https://github.com/aspuru-guzik-group/tequila/blob/master/tutorials/Chemistry.ipynb).\n", 20 | "\n", 21 | "We start by defining our non-linear encoder. As in the paper we will use a set of floating Gaussians to approximate our unknown non-linear function. Each parameter of the VQE is then encoded, depending on the meta variable $R$ (in this example the bond distance of H$_2$; in the paper the intermolecular distance of H$_4$), as\n", 22 | "$$\n", 23 | "\\theta\\left(R\\right) = \\sum_n \\alpha_n \\exp\\left( -\\beta_n (\\gamma_n - R)^2\\right) + \\delta.\n", 24 | "$$\n", 25 | "\n", 26 | "In the following cell, we define this encoder as abstract class can produce `tequila` objectives which will be used as parameters for quantum circuits later.\n", 27 | "\n", 28 | "The `DummyEncoder` class just gives back the original variable, we will use it to test the meta-VQE later. \n", 29 | "In the same way the `evaluate` function will later be used to initialize the $\\theta$ parameters to test the meta-VQE after training.\n", 30 | "\n", 31 | "If you have any questions left, feel free to contact us." 32 | ] 33 | }, 34 | { 35 | "cell_type": "code", 36 | "execution_count": 1, 37 | "metadata": {}, 38 | "outputs": [], 39 | "source": [ 40 | "# tested with tq git revision: ab252adc4090465ff47f182de32d69b84d7fc13f\n", 41 | "import tequila as tq\n", 42 | "import numpy" 43 | ] 44 | }, 45 | { 46 | "cell_type": "code", 47 | "execution_count": 2, 48 | "metadata": {}, 49 | "outputs": [], 50 | "source": [ 51 | "class DummyEncoder:\n", 52 | " \"\"\"\n", 53 | " No encoding\n", 54 | " \"\"\"\n", 55 | " def __call__(self, variable, *args, **kwargs):\n", 56 | " return variable\n", 57 | " \n", 58 | "class GaussianEncoder:\n", 59 | " \"\"\"\n", 60 | " Represent an unknown linear function by n floating Gaussians \n", 61 | " \"\"\"\n", 62 | " def __init__(self, n):\n", 63 | " self._n = n\n", 64 | "\n", 65 | " def __call__(self, variable, R):\n", 66 | " # this allows us to just pass names as parameters\n", 67 | " variable = tq.assign_variable(variable)\n", 68 | " \n", 69 | " # here we create the non-linear encoded parameter\n", 70 | " # as described in the paper\n", 71 | " # as abstract tequila objective\n", 72 | " mapped = tq.Variable((\"delta\", variable))\n", 73 | " for n in range(self._n):\n", 74 | " a = tq.Variable((\"alpha\", variable, n))\n", 75 | " b = tq.Variable((\"beta\", variable, n))\n", 76 | " c = tq.Variable((\"gamma\", variable, n))\n", 77 | " mapped += a * ((-(b * (c - R) ** 2)).apply(tq.numpy.exp))\n", 78 | " return mapped\n", 79 | " \n", 80 | " def evaluate(self, variable, R, trained_variables):\n", 81 | " # evaluates a specficic variale at point R\n", 82 | " # according to alpha*exp(-beta*(gamma - variable)**2) + delta\n", 83 | " # needs the trained variables which are (\"alpha\", variable, n)\n", 84 | " # and similar for the other meta parameters\n", 85 | " result = 0.0\n", 86 | " for n in range(self._n):\n", 87 | " a = trained_variables[(\"alpha\", variable, n)]\n", 88 | " b = trained_variables[(\"beta\", variable, n)]\n", 89 | " c = trained_variables[(\"gamma\", variable, n)]\n", 90 | " d = trained_variables[(\"delta\", variable)]\n", 91 | " result += a*numpy.exp(-b*(c-R)**2) + d\n", 92 | " return result" 93 | ] 94 | }, 95 | { 96 | "cell_type": "markdown", 97 | "metadata": {}, 98 | "source": [ 99 | "## The VQE Ansatz\n", 100 | "\n", 101 | "Now its time to define the ansatz for our molecular VQE. \n", 102 | "As in the paper, we will use the [UpCCGSD](https://pubs.acs.org/doi/10.1021/acs.jctc.8b01004) ansatz.\n", 103 | "\n", 104 | "The quantum circuit for this ansatz has the form \n", 105 | "$$\n", 106 | "U(\\boldsymbol{\\theta}) = \\left(\\prod_k e^{-i\\frac{\\theta_k}{2} G_k}\\right) U_\\text{ref} \n", 107 | "$$\n", 108 | "where the generators $G_k$ are qubit encoded products of fermionic creation and anihialtion operators; In this case, single excitations and pair-restricted double excitations of the form\n", 109 | "$$\n", 110 | "G_{pq} = i(a_p^\\dagger a_q - a^\\dagger_q a_p)\n", 111 | "$$\n", 112 | "and\n", 113 | "$$\n", 114 | "G_{pqrs} = i(a_p^\\dagger a_q a_r^\\dagger a_s - h.c.).\n", 115 | "$$\n", 116 | "The pair-restriction in the doubles requires the spin orbitals $p,q$ and $r,s$ to have the same spatial part. This is enforced in the code block below by iterating over spatial indices and generating $p,q$ and $r,s$ from them (`tequila` will enumerate spin-up with even and spin-down with off numbers).\n", 117 | "\n", 118 | "The qubit encoded generators are sums of tensor-products of Pauli matrices. Their explicit form depends on the qubit encoding chosen below (the default here is `jordan_wigner`). If you want to know the explicit form of some generators, just construct them as illustrated below, and then print them out. Note that the qubit encoding is set over the `transformation` key when the molecule object is created (see cells further below).\n", 119 | "\n", 120 | "The $U_\\text{ref}$ part of the circuit creates the Hartree-Fock reference. The explicit form also depends on the chosen qubit encoding and the `tequila` molecule object handles the correct initialization. In our specfic H$_2$\\STO-3G example below in `jordan_wigner` representation, the $U_\\text{ref}$ circuit consists of two $X$ gates on qubits 0 and 1 (the spin-up and spin-down encoded occupied HF orbital).\n", 121 | "\n", 122 | "Note that for the Hydrogen system we can neglect the singles for point-group symmetry reasons, and for the same reasons will only end up with one pair-ecitation for the doubles anyway. \n", 123 | "The code-block below will however generate the ansatz independent of the molecular that is passed to it. \n", 124 | "Note that the encoder is also passed to the function, so in principle you can also use other encoders as the ones defined above; They just need to have a call operator defined which takes the name of the variable to encode and the meta paramerer $R$." 125 | ] 126 | }, 127 | { 128 | "cell_type": "code", 129 | "execution_count": 3, 130 | "metadata": {}, 131 | "outputs": [], 132 | "source": [ 133 | "def encoded_upccgsd(molecule, encoder, R, layers=1, include_singles=True):\n", 134 | " U = molecule.prepare_reference()\n", 135 | " for layer in range(layers):\n", 136 | " for i in range(molecule.n_orbitals):\n", 137 | " for a in range(i+1,molecule.n_orbitals):\n", 138 | " # First the pair-restricted doubles\n", 139 | " # create the encoded angle objective\n", 140 | " angle = encoder(\"D_{}_{}_{}\".format(layer, i, a), R)\n", 141 | " G = molecule.make_excitation_generator(indices=[(2*i,2*a),(2*i+1,2*a+1)])\n", 142 | " U += tq.gates.Trotterized(generators=[G], angles=[angle], steps=1)\n", 143 | " if not include_singles:\n", 144 | " continue\n", 145 | " # now the same for the singles; we will use the same parameter\n", 146 | " # for spin-up and spin-down singles to enforce singlet to enforce singlet symmetry\n", 147 | " angle = encoder(\"S_{}_{}_{}\".format(layer, i, a), R)\n", 148 | " G1 = molecule.make_excitation_generator(indices=[(2*i,2*a)])\n", 149 | " G2 = molecule.make_excitation_generator(indices=[(2*i+1,2*a+1)])\n", 150 | " U += tq.gates.Trotterized(generators=[G1,G2], angles=[angle,angle], steps=1)\n", 151 | " return U" 152 | ] 153 | }, 154 | { 155 | "cell_type": "markdown", 156 | "metadata": {}, 157 | "source": [ 158 | "## Construction and Training of the meta-VQE \n", 159 | "\n", 160 | "Now we will construct our meta-VQE objective by summing up expectationvalues with meta parameters defined by a set of training points. \n", 161 | "\n", 162 | "After the `tequila` objective is created we minimize it with the `BFGS` optimizer of the `scipy` package. \n", 163 | "If you want to try another optimizer, see the tequila [tutorials](https://github.com/aspuru-guzik-group/tequila/blob/master/tutorials/Optimizer_Tutorial.ipynb) or type `tq.show_available_optimizers()` to see which optimizers are available on your system." 164 | ] 165 | }, 166 | { 167 | "cell_type": "code", 168 | "execution_count": 4, 169 | "metadata": {}, 170 | "outputs": [ 171 | { 172 | "name": "stdout", 173 | "output_type": "stream", 174 | "text": [ 175 | "initial values are:\n", 176 | " {('alpha', D_0_0_1, 0): 0.0, ('delta', D_0_0_1): 0.0, ('gamma', D_0_0_1, 0): 1.0, ('beta', D_0_0_1, 0): 1.0}\n", 177 | "Optimizer: \n", 178 | "backend : qulacs\n", 179 | "device : None\n", 180 | "samples : None\n", 181 | "save_history : True\n", 182 | "noise : None\n", 183 | "\n", 184 | "Method : BFGS\n", 185 | "Objective : 5 expectationvalues\n", 186 | "grad instr : 2-point\n", 187 | "gradient : scipy numerical 2-point\n", 188 | "hessian : scipy numerical None\n", 189 | "\n", 190 | "active variables : 4\n", 191 | "\n", 192 | "Optimization terminated successfully.\n", 193 | " Current function value: -1.010502\n", 194 | " Iterations: 13\n", 195 | " Function evaluations: 110\n", 196 | " Gradient evaluations: 22\n", 197 | "Finished Training of Meta VQE\n", 198 | "optimized meta-variables are:\n", 199 | " ('alpha', D_0_0_1, 0) : -1.3507766463040127\n", 200 | "('delta', D_0_0_1) : 1.5022768577876158\n", 201 | "('gamma', D_0_0_1, 0) : 0.6887929726422215\n", 202 | "('beta', D_0_0_1, 0) : 0.8901106480850393\n", 203 | "\n" 204 | ] 205 | } 206 | ], 207 | "source": [ 208 | "# define the encoder\n", 209 | "encoder = GaussianEncoder(n=1)\n", 210 | "\n", 211 | "# define details on the VQE ansatz\n", 212 | "layers = 1\n", 213 | "include_singles = False\n", 214 | "transformation = \"jordan_wigner\"\n", 215 | "geometry = \"H 0.0 0.0 0.0\\nH 0.0 0.0 {R}\" # gan also give path to an xyz file\n", 216 | "basis_set = \"sto-3g\"\n", 217 | "\n", 218 | "# define the training points\n", 219 | "training_points = [0.5, 0.7, 1.5, 3.0, 5.0]\n", 220 | "\n", 221 | "# define the test points\n", 222 | "start = 0.3\n", 223 | "end = 7.0\n", 224 | "steps = 25\n", 225 | "test_points = [start + step/steps*(end-start) for step in range(steps)]\n", 226 | "\n", 227 | "# Details on the used optimizer:\n", 228 | "optimizer_arguments = {}\n", 229 | "# see tq.show_available_optimizers() for other options\n", 230 | "optimizer_arguments[\"method\"] = \"bfgs\"\n", 231 | "# increase to see more output in the optimization\n", 232 | "optimizer_arguments[\"print_level\"] = 1\n", 233 | "optimizer_arguments[\"gradient\"] = \"2-point\"\n", 234 | "# eps for scipy < 1.5, and finite_diff_rel_step for scipy > 1.5\n", 235 | "optimizer_arguments[\"method_options\"] = {\"finite_diff_rel_step\":1.e-5, \"eps\":1.e-5, \"gtol\":1.e-5}\n", 236 | "\n", 237 | "\n", 238 | "#construct the tequila objective by accumulating expectation values of training points\n", 239 | "objective = 0.0\n", 240 | "for R in training_points:\n", 241 | " molecule = tq.chemistry.Molecule(geometry=geometry.format(R=R), basis_set=basis_set, transformation=transformation)\n", 242 | " H = molecule.make_hamiltonian()\n", 243 | " U = encoded_upccgsd(molecule, encoder, R, layers, include_singles)\n", 244 | " \n", 245 | " E = tq.ExpectationValue(H=H, U=U)\n", 246 | " objective += E\n", 247 | "\n", 248 | "objective = 1.0/len(training_points)*objective\n", 249 | " \n", 250 | "# initialize in a way that the encoded angles start with zero\n", 251 | "# initialize beta and gamma as 1.0, since they are width and shift of the Gaussians\n", 252 | "initial_values = {k:(1.0 if \"beta\" in k.name[0] or \"gamma\" in k.name[0] else 0.0) for k in objective.extract_variables()}\n", 253 | "\n", 254 | "# if we have more than one floating Gaussian, we should not initialize the shifts (gamma) to the same values\n", 255 | "# otherwise the optimizer can get confused\n", 256 | "if encoder._n > 1:\n", 257 | " initial_values = {k:(numpy.random.uniform(training_points[0], training_points[-1], 1)[0] if \"gamma\" in k.name[0] else initial_values[k]) for k in objective.extract_variables()}\n", 258 | "\n", 259 | "print(\"initial values are:\\n\", initial_values)\n", 260 | " \n", 261 | "# minimize the objective formed from the training points\n", 262 | "trained = tq.minimize(objective=objective, initial_values=initial_values, **optimizer_arguments)\n", 263 | "\n", 264 | "print(\"Finished Training of Meta VQE\")\n", 265 | "print(\"optimized meta-variables are:\\n\", trained.variables)\n", 266 | "\n" 267 | ] 268 | }, 269 | { 270 | "cell_type": "markdown", 271 | "metadata": {}, 272 | "source": [ 273 | "## Testing the performance of the meta-VQE\n", 274 | "\n", 275 | "Here we gonna test the performance of the meta-VQE by computing the expectation values of different points with the parameters of the quantum circuit initialized by the trained meta-VQE. For this we will need the `evaluate` function of the encoder. Furthermore we will compute the `fci` energy of each test point, and optimize the individual points with a standard VQE initialized with the meta-VQE values (opt-meta-VQE). \n", 276 | "See the paper for further details." 277 | ] 278 | }, 279 | { 280 | "cell_type": "code", 281 | "execution_count": 5, 282 | "metadata": {}, 283 | "outputs": [ 284 | { 285 | "name": "stdout", 286 | "output_type": "stream", 287 | "text": [ 288 | "processing test point +0.3000\n", 289 | "processing test point +0.5680\n", 290 | "processing test point +0.8360\n", 291 | "processing test point +1.1040\n", 292 | "processing test point +1.3720\n", 293 | "processing test point +1.6400\n", 294 | "processing test point +1.9080\n", 295 | "processing test point +2.1760\n", 296 | "processing test point +2.4440\n", 297 | "processing test point +2.7120\n", 298 | "processing test point +2.9800\n", 299 | "processing test point +3.2480\n", 300 | "processing test point +3.5160\n", 301 | "processing test point +3.7840\n", 302 | "processing test point +4.0520\n", 303 | "processing test point +4.3200\n", 304 | "processing test point +4.5880\n", 305 | "processing test point +4.8560\n", 306 | "processing test point +5.1240\n", 307 | "processing test point +5.3920\n", 308 | "processing test point +5.6600\n", 309 | "processing test point +5.9280\n", 310 | "processing test point +6.1960\n", 311 | "processing test point +6.4640\n", 312 | "processing test point +6.7320\n" 313 | ] 314 | } 315 | ], 316 | "source": [ 317 | "fci = {}\n", 318 | "meta = {}\n", 319 | "meta_angles = {}\n", 320 | "meta_opt = {}\n", 321 | "vqe = {}\n", 322 | "# we are using this to be able to use the same codeblocks\n", 323 | "dummy = DummyEncoder()\n", 324 | "for R in test_points:\n", 325 | " print(\"processing test point {:+2.4f}\".format(R))\n", 326 | " molecule = tq.chemistry.Molecule(geometry=geometry.format(R=R), basis_set=basis_set, transformation=transformation)\n", 327 | " H = molecule.make_hamiltonian()\n", 328 | " U = encoded_upccgsd(molecule, dummy, R, layers, include_singles)\n", 329 | " E = tq.ExpectationValue(H=H, U=U)\n", 330 | " \n", 331 | " # evaluate regular VQE with meta VQE parameters\n", 332 | " values = {k:encoder.evaluate(variable=k, R=R, trained_variables=trained.variables) for k in E.extract_variables()}\n", 333 | " energy = tq.simulate(E, variables=values)\n", 334 | " meta[R] = energy\n", 335 | " meta_angles[R] = values\n", 336 | " \n", 337 | " # optimize from meta VQE starting point\n", 338 | " result = tq.minimize(objective=E, initial_values=values, silent=True, **optimizer_arguments)\n", 339 | " meta_opt[R] = result.energy\n", 340 | " \n", 341 | " # try fci (you will need psi4 for this)\n", 342 | " try:\n", 343 | " fci[R] = molecule.compute_energy(\"fci\")\n", 344 | " except:\n", 345 | " if molecule.n_orbitals < 5:\n", 346 | " fci[R] = numpy.linalg.eigvalsh(H.to_matrix())[0]\n", 347 | " else:\n", 348 | " print(\"skipping fci for point \", R)\n" 349 | ] 350 | }, 351 | { 352 | "cell_type": "markdown", 353 | "metadata": {}, 354 | "source": [ 355 | "The collected data of the test above is plotted here. \n", 356 | "Since we only have one parameter in our simple guinny pig system here, we will also plot the quantum circuit's parameter with respect to the meta parameter $R$. \n", 357 | "If you have changed the molecule or the basis_set above, you might need to adapt the plot for the parameter in order to see the parameter you are interested in.\n", 358 | "\n", 359 | "For our guinny-pig system and the default settings in this notebook you see that the meta-VQE predicts the whole PES accurately with exception of the point at very close distance. The reason can be seen in the plot of the parameter. For this specific system and this specfic VQE ansatz, the ideal parameter will have a sigmoidal dependence on the meta parameter $R$ and the single floating Gaussian is not able to perfectly adapt to it. As explained in the paper: Chosing floating Gaussians was a pragmatic choice since they are fairly good approximators for generalized functions.\n", 360 | "\n", 361 | "\n", 362 | "If you are interested you can try to change the encoder above, to a sigmoidal function, then you will be able to fit this test system almost perfectly. Another way to improve is to increase the number of floating Gaussians. \n", 363 | "Feel free to play around with it!" 364 | ] 365 | }, 366 | { 367 | "cell_type": "code", 368 | "execution_count": 6, 369 | "metadata": {}, 370 | "outputs": [ 371 | { 372 | "data": { 373 | "image/png": "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\n", 374 | "text/plain": [ 375 | "
" 376 | ] 377 | }, 378 | "metadata": { 379 | "needs_background": "light" 380 | }, 381 | "output_type": "display_data" 382 | }, 383 | { 384 | "data": { 385 | "image/png": "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\n", 386 | "text/plain": [ 387 | "
" 388 | ] 389 | }, 390 | "metadata": { 391 | "needs_background": "light" 392 | }, 393 | "output_type": "display_data" 394 | }, 395 | { 396 | "data": { 397 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD4CAYAAAD8Zh1EAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nO3de3iU9Z338fc3k5AECERIOCUgQSAcRMGNrC62oliDh4L12e3iPmuvbWvtQfvY2qXC012t3YMH2l7W1T2w2tN2Vx7bIrCrEhW0tp6hIBAggKCSiSEBDQdJSDL5Pn8k0EBOEzLJPTP5vK6LS+ae3z3zEZ0Pv/zmPpi7IyIiiS8l6AAiIhIbKnQRkSShQhcRSRIqdBGRJKFCFxFJEqlBvXFOTo6PHz8+qLcXEUlIGzduPOjuue09F1ihjx8/ng0bNgT19iIiCcnM3uvoOS25iIgkCRW6iEiSUKGLiCSJwNbQ29PQ0EB5eTl1dXVBR0kYGRkZ5Ofnk5aWFnQUEQlYXBV6eXk5WVlZjB8/HjMLOk7cc3cOHTpEeXk5BQUFQccRkYDFVaHX1dWpzLvBzBg+fDjV1dVBR0kaqzaFWVZSRkVNLWOyM1lcXMgNs/JiNr6v9lGu5MjVXXFV6IDKvJv059Wxs/lQL125ldqGCADhmlqWrtwK0O5+3R3fV/soV3LkOhsW1OVzi4qK/Mzj0Hfs2MHUqVMDyZPI+sOfW0/LGSAzLYV7F0znqmmjONEYoa6h6Q//bIjwtf/8PYc+rm/zWtmZadx1zRSa3Glqcpocmtx56IVdHK5tbDN+SEYqX778PNydkx8vB9zhsd/t5Whd232yMlL5wpyCU2Nb+8kr+9rfJz2Vz88Z32b7T155l6Mnoh/fV/soV/v75GVn8sqSK9vdpz1mttHdi9p9ToWe+JL9z639cg7xj585nyumjODAkRMcOFLHgSN1VB1t/v2TG/ZT19AUYOq+0d4PaJ19pDv6ga4v9lGuDsYD++6/ruMXbPP6HRd63C25dEdvrEeFQiFmzJhBQ0MDqampfO5zn+Ob3/wmKSkdH+F533338fjjjxMKhXj44YcpLi7ucOzatWu54447iEQi3HLLLSxZsqTDsY888ggPPfQQ77zzDtXV1eTk5PTo3y1RPViy87QyB6htiPDNJ99ud/zQzLROy/yeT08jIy1EemoKGWkhMtJSSE8NcceKTRw81naGPnJIOqtum0PIDDMjlGKkGFzzo9/yweG2R2SNGZrBS4uvAJo/3Cc/32bGJx5cT0VN2306m6XNuX894ZraqPfp7vi+2ke52t9nTHZmu+PPRsIeh35y1hauqcX5w3rUqk3hHr1uZmYmmzdvprS0lOeff55nn32We++9t8Px27dvZ8WKFZSWlrJ27Vq+9rWvEYlE2h0biUS47bbbePbZZ9m+fTtPPPEE27dv7/C158yZwwsvvMC5557bo3+neLRqU5g596+nYMnTzLl//Wn/3dyddw9+zC9ef4+v/mJjuwV40t9eP41H/mIWv/zKpby8+Ap2/t183r7navI6+JDkZWfy+TkF3DR7HDdelM+1M0Zz5ZSRzJmYw99cN43MtNBp4zPTQiy9Ziqjh2YyYkgGuVnpDBs0gOyBA7hr/pR2x397/hQGpKYwIDWFtFAKqS2/QinGt4vb32dxcWGH/46Liwu7tU93x/fVPsrV/X26K25n6Pf+dynbK450+Pym92uoj5w+C6ttiPDtX23hiTffb3efaWOGcM+np0edYcSIESxfvpyLL76Y7373u+1+Abl69WoWLVpEeno6BQUFTJw4kTfffJNLL720zdg333yTiRMnMmHCBAAWLVrE6tWrmTZtWrvvP2vWrKizJpL2vhxasnILG9//iPqGJn635+CpmcyYoRkMHBDieH3bvyTzsjP54mXtH665uLiw3WWazj48J3+6i/anvu6O76t9lCs5cp2NuC30rpxZ5l1tP1sTJkwgEolQVVXFyJEj2zwfDoe55JJLTj3Oz88nHG7/p4RwOMzYsWNPG/vGG2/ENG8iWFZS1mYJpa6hif947T2GZKTyJ+fl8JW553HZxBzGDx/I6s0VvV7Orffrzgesu+P7ah/lSo5c3RW3hd7VTLqzNaz/9+W2s2OJHxXt/HeD5rXmTXdfTSjl9J+E+qqcRRJd3BZ6V87mR+qzsXfvXkKhECNGjGj3+by8PPbv33/qcXl5OXl57ZdId8Ymo6N1Dfzohd1tDss7aUx2ZpsyP0nlLNK1hP1S9IZZedx34wzysjMxmmfm9904I6Yf+urqar7yla9w++23d3gCz4IFC1ixYgUnTpxg37597N69m9mzZ7c79uKLL2b37t3s27eP+vp6VqxYwYIFC2KWN165O2vermDeD37D46/s49IJw8hIO/1/vd74y1ikv0nYGTr0zqyttraWmTNnnjps8eabb+bOO+/scPz06dP57Gc/y7Rp00hNTeXRRx8lFAq1OzY1NZVHHnmE4uJiIpEIX/jCF5g+veOlpYcffpgHH3yQyspKLrjgAq699loee+yxHv879qU9VUe5e3Upr75ziPPzhrD8c0XMHJvd66dAi/RHOrEoCcTjn9vx+kYeXreHx3+3t3n2PX8KfzF7XIdLKiISnaQ9sUjiw+mz7QyunjaSktIDVByu40//KJ8l10whZ3B60DFFkp4KPUolJSXcddddp20rKCjgqaeeajP20KFDzJs3r832devWMXz48DbbP/OZz7Bv377Ttj3wwAOdnnEaL9oeU17HT159j9FD0vnVVy6laPywgBOK9B9dFrqZ/Ri4Hqhy9/M7GXcx8BqwyN1/dbaB3D0uryBYXFwcdcEOHz6czZs3R/3a7f2lEK2glsxOau+YcgBLMZW5SB+L5iiXnwLzOxtgZiHgAeC5noTJyMjg0KFDgZdUojh5g4uMjIzAMnR0TPkHnZyuLyK9o8sZuru/bGbjuxj2deDXwMU9CZOfn095eblu2NANJ29BF5Rhgwa0e8nZWF5wSESi0+M1dDPLAz4DXEEXhW5mtwK3AowbN67N82lpabqVWgLZU3WMYycaME6/hreOKRcJRixOLHoIuMvdu7yIirsvd/cidy/Kzc2NwVtLUD76uJ4v/uwtsjLS+Nvrp/bqCV4iEp1YHOVSBKxo+SIzB7jWzBrdfVUMXlviUH1jE1/+xUY+OFzHilsv4aJx5/CFyyYEHUuk3+txobv7qTUSM/sp8D8q8+Tl7nznqa28ue9DfrRoJheNOyfoSCLSIprDFp8A5gI5ZlYO3AOkAbj7v/ZqOok7//byXn65sZw75k1i4Uwtq4jEk2iOcrkp2hdz97/qURqJayWllTywdifXXzCab1w1Keg4InKGhL3aovStbeHDfGPFZi7Iz+b7f3ZhXJ78JdLfqdClSweO1HHLzzZwzsA0/v1zf0RGWvtXkxSRYOlaLtKp2voIX/r5Bo7UNfDrr/4JI7KCOytVRDqnQpcONTU53/rlZraGD/PvNxcxdfSQoCOJSCdU6HKa1pfCHZyeytETjXzn2qlcNa3tDbJFJL6o0OWUMy+Fe/REI6EUI2fwgICTiUg09KWonNLepXAjTc73n9sVUCIR6Q4VupzS0aVwO9ouIvFFhS6ndHTJW10KVyQxqNDllL++ejJnni+kS+GKJA4VupwyJDMNd8gemKZL4YokIB3lIkDzVRQfemE344YNZN23LictpL/rRRKNPrUCwPqdVWwNH+b2KyeqzEUSlD65ctrs/DNaXhFJWCp00excJEno09vPaXYukjxU6P2cZuciyUOf4H5Ms3OR5KJC78c0OxdJLvoU91OanYskHxV6P/VimWbnIsmmy0+ymf3YzKrMbFsHz/9vM9tiZlvN7FUzuzD2MSWWNDsXSU7RTM1+Cszv5Pl9wOXuPgP4O2B5DHJJL3qxrIot5ZqdiySbLq/l4u4vm9n4Tp5/tdXD14H8nseS3qLZuUjyivX07IvAsx09aWa3mtkGM9tQXV0d47eWaGh2LpK8YvaJNrMraC70uzoa4+7L3b3I3Ytyc3Nj9dYSJc3ORZJbTArdzC4AHgMWuvuhWLymxJ5m5yLJrcefajMbB6wEbnZ33U04Tml2LpL8uvxS1MyeAOYCOWZWDtwDpAG4+78CdwPDgX+25vuXNbp7UW8FlrNzcnb+4J9eoNm5SJKK5iiXm7p4/hbglpglkpjT7Fykf9BULcmt2hSm6O9fYEv5YY7UNfD0lg+CjiQivUT3FE1iqzaFWbpyC7UNTQDUHG9g6cqtALrxs0gS0gw9iS0rKTtV5ifVNkRYVlIWUCIR6U0q9CRWUVPbre0ikthU6Els9NCMdrePyc7s4yQi0hdU6Ems+PxRbbZlpoVYXFwYQBoR6W0q9CRWdeQEg9NDjMnOwIC87Ezuu3GGvhAVSVI6yiVJHa1r4IUdB1h08VjuXXh+0HFEpA9ohp6knis9wInGJhbM1GxcpL9QoSep1W9XkH9OJheNyw46ioj0ERV6Ejp47ASv7DnIggvH0HJ9HRHpB1ToSeiZrR8QaXIWarlFpF9RoSeh1ZsrmDIqi8JRWUFHEZE+pEJPMvs/PM7G9z5iwcwxQUcRkT6mQk8y/72lAoBPX6BCF+lvVOhJZs3mCv7o3HMYO2xg0FFEpI+p0JPIzsoj7Kw8ykItt4j0Syr0JLJmcwWhFOPaGaODjiIiAVChJwl3Z83bFcyZmEPO4PSg44hIAFToSeL379dQ/lEtCy/UcotIf6VCTxJrNodJT03h6ukjg44iIgHpstDN7MdmVmVm2zp43szsYTPbY2ZbzOyi2MeUzjRGmnh66wfMmzqCrIy0oOOISECimaH/FJjfyfPXAJNaft0K/EvPY0l3vPrOIQ4eq2fBhTrVX6Q/67LQ3f1l4MNOhiwEfu7NXgeyzUyHWfSh1ZsryMpIZW5hbtBRRCRAsVhDzwP2t3pc3rKtDTO71cw2mNmG6urqGLy11DVEKCmt5JrzR5GRFgo6jogEqE+/FHX35e5e5O5FubmaTcbC+p1VHDvRqOUWEYlJoYeBsa0e57dskz6wenOYnMHpXHre8KCjiEjAYlHoa4DPtRztcglw2N0/iMHrShcO1zbwYlk1n75wNKEU3chCpL/r8ibRZvYEMBfIMbNy4B4gDcDd/xV4BrgW2AMcBz7fW2HldCWlldQ3NulGFiICRFHo7n5TF887cFvMEknU1myu4NzhA7kwf2jQUUQkDuhM0QRVdbSOV9/RfUNF5A9U6Anq6S0f0OToUrkicooKPUGt3lzBtNFDmDhC9w0VkWYq9AT03qGP2by/RvcNFZHTqNAT0JrNLfcN1aVyRaQVFXqCcXdWv13B7PHDyMvODDqOiMQRFXoCWbUpzB//4zr2VB2j7MBRVm3SCbki8gddHocu8WHVpjBLV26ltiECNJ8lunTlVgBumKUTi0REM/SEsayk7FSZn1TbEGFZSVlAiUQk3qjQE0RFTW23totI/6NCTxBjOvgCtKPtItL/qNATxOLiQs48wz8zLcTi4sJgAolI3FGhJ4jLJuXgDlkZqRiQl53JfTfO0BeiInKKjnJJEC+VNd+y74kvXcL5ebq6ooi0pRl6gli/8wAjh6QzfcyQoKOISJxSoSeA+sYmXt51kCunjNClckWkQyr0BPDWux9y7EQjV04ZGXQUEYljKvQEsG5HFQNSU5gzUTeCFpGOqdDjnLuzbucB/uS84QwcoO+wRaRjKvQ4t/fgx7x36DjzpowIOoqIxLmoCt3M5ptZmZntMbMl7Tw/zsxeNLNNZrbFzK6NfdT+ad2OAwBcoUIXkS50WehmFgIeBa4BpgE3mdm0M4b9DfCku88CFgH/HOug/dW6HVVMGZVF/jkDg44iInEumhn6bGCPu+9193pgBbDwjDEOnDxAeihQEbuI/dfh4w1seO8j5k3V7FxEuhZNoecB+1s9Lm/Z1tp3gb80s3LgGeDr7b2Qmd1qZhvMbEN1dfVZxO1ffrO7mkiT63BFEYlKrL4UvQn4qbvnA9cC/2FmbV7b3Ze7e5G7F+Xm5sborZPX+h0HGDZoADPHZgcdRUQSQDSFHgbGtnqc37KttS8CTwK4+2tABpATi4D9VWOkiZd2VTO3MJdQis4OFZGuRVPobwGTzKzAzAbQ/KXnmjPGvA/MAzCzqTQXutZUemDT/hpqjjcwT8stIhKlLgvd3RuB24ESYAfNR7OUmtn3zGxBy7BvAV8ys7eBJ4C/cnfvrdD9wbodVaSmGJ+YrB90RCQ6UZ166O7P0PxlZ+ttd7f6/XZgTmyj9W/rdx5gdsEwhmSkBR1FRBKEzhSNQ/s/PM6uA8e4UicTiUg3qNDj0PqdVQDMm6r1cxGJngo9Dq3bWcWEnEEU5AwKOoqIJBAVepz5+EQjr79zSMstItJtKvQ487s9B6mPNHGlTvcXkW5SoceZdTsOkJWRysXjhwUdRUQSjAo9jjQ1Oet3VnP55FzSQvpPIyLdo9aII1vDhzl47ISurigiZ0WFHkfW7awixeDyySp0Eek+FXocWb/zABeNO4dhgwYEHUVEEpAKPU5UHq5jW/iIjm4RkbOmQo8TL5a1nB2qqyuKyFlSoceJdTuqyMvOZPLIwUFHEZEEpUKPA3UNEV7Zc5B5U0dgpptZiMjZUaHHgdf2HqK2IaLT/UWkR1TocWD9jioy00JcMmF40FFEJIGp0APm7qzfWcVlk3LISAsFHUdEEpgKPWBlB44SrqllnpZbRKSHVOgBW7ej+XBFrZ+LSE9FdU9Rib1Vm8IsKykjXFNLWsh49Z1D3DArL+hYIpLAVOgBWLUpzNKVW6ltiADQEHGWrtwKoFIXkbMW1ZKLmc03szIz22NmSzoY81kz225mpWb2X7GNmVyWlZSdKvOTahsiLCspCyiRiCSDLmfoZhYCHgU+BZQDb5nZGnff3mrMJGApMMfdPzIzLQh3oqKmtlvbRUSiEc0MfTawx933uns9sAJYeMaYLwGPuvtHAO5eFduYyWVMdma3touIRCOaQs8D9rd6XN6yrbXJwGQze8XMXjez+e29kJndamYbzGxDdXX12SVOAouLCxkQOv0U/8y0EIuLCwNKJCLJIFaHLaYCk4C5wE3Av5tZ9pmD3H25uxe5e1Fubm6M3jrx3DArjwvyh2IGBuRlZ3LfjTP0haiI9Eg0R7mEgbGtHue3bGutHHjD3RuAfWa2i+aCfysmKZNMQ6SJXQeOceOsfH7w2QuDjiMiSSKaGfpbwCQzKzCzAcAiYM0ZY1bRPDvHzHJoXoLZG8OcSeX1vYc4UtfI/PNHBR1FRJJIl4Xu7o3A7UAJsAN40t1Lzex7ZragZVgJcMjMtgMvAovd/VBvhU50a7dVMnBAiE9Mygk6iogkkahOLHL3Z4Bnzth2d6vfO3Bnyy/pRKTJKSk9wBWFI3QxLhGJKV3LpY9tev8jDh47QbGWW0QkxlTofWzttkoGhFK4orD/HuUjIr1Dhd6H3J21pZVcNimHrIy0oOOISJJRofeh0oojlH9Uy/zpWm4RkdhTofehktJKUgyumjYy6CgikoRU6H1o7bZK/rhgOMMGDQg6iogkIRV6H9lTdYzdVcd0MpGI9BoVeh8pKa0E4OrpWm4Rkd6hQu8jJaWVzBybzeihukSuiPQOFXofCNfUsqX8sJZbRKRXqdD7QMm25uWWYh2uKCK9SIXeB9aWVjJlVBYFOYOCjiIiSUyF3suqj57grXc/1OxcRHqdCr2XvbDjAO5o/VxEep0KvZet3VbJucMHMmVUVtBRRCTJqdB70eHaBl595yDzp4/CzLreQUSkB1TovejFnVU0RFzXPheRPqFC70Vrt1Uyckg6M/Ozg44iIv2ACr2X1NZHeGlXFcXTR5GSouUWEel9KvRe8ptd1dQ1NOna5yLSZ6IqdDObb2ZlZrbHzJZ0Mu5/mZmbWVHsIiamktJKsgemMbtgWNBRRKSf6LLQzSwEPApcA0wDbjKzae2MywLuAN6IdchEU9/YxAs7DvCpqSNJDemHIBHpG9G0zWxgj7vvdfd6YAWwsJ1xfwc8ANTFMF9Cem3vIY7WNepkIhHpU9EUeh6wv9Xj8pZtp5jZRcBYd386htkS1tptlQwaEGLOxJygo4hIP9Lj9QAzSwF+CHwrirG3mtkGM9tQXV3d07eOS5Em5/ntlVwxZQQZaaGg44hIPxJNoYeBsa0e57dsOykLOB94yczeBS4B1rT3xai7L3f3Incvys3NPfvUcWzjex9x8Fi9lltEpM9FU+hvAZPMrMDMBgCLgDUnn3T3w+6e4+7j3X088DqwwN039EriOLd2WyUDUlOYWzgi6Cgi0s90Weju3gjcDpQAO4An3b3UzL5nZgt6O2AicXdKSiv55KQcBqenBh1HRPqZqFrH3Z8Bnjlj290djJ3b81iJaVv4COGaWr5x1aSgo4hIP6RpZAys2hRmWUkZ4ZpaoPk4dBGRvqZC76FVm8IsXbmV2obIqW1///QOBqWncsOsvE72FBGJLZ3G2EPLSspOK3OA2oYIy0rKAkokIv1VQs3QTy5tVNTUMiY7k8XFhYHPgitallmi3S4i0lsSZoZ+cmkjXFOLA+GaWpau3MqqTeEu9+1NY7Izu7VdRKS3JEyhx+vSxuLiQkJnXO48My3E4uLCYAKJSL+VMIUer0sbk0dmEXHISk/FgLzsTO67cUbgS0Ei0v8kzBr6mOzMU4cFnrk9SD98fhdDMlL57V1XMjQzLdAsItK/JcwMfXFxIZlnXOwqNcUCXdp4e38NL+w4wJc+MUFlLiKBS5gZ+skljJNHuWSkhahvjAR6R6AfPL+Lcwam8fnLCgLLICJyUsLM0KG51F9ZciX77r+O5+/8JKFQSmBfir717oe8vKuar849T9dtEZG4kFCF3lr+OQO55bICntoU5u39NX363u7O90vKyM1K5+ZLxvfpe4uIdCRhCx3gq3PPI2fwAP7h6R24e5+976vvHOKNfR9y29zzyBygm1iISHxI6ELPykjjm5+azJvvfkhJaWWfvKe78/3nyhg9NINFs8f1yXuKiEQjoQsd4M+LxjJpxGDue3Znn1zl8KWyaja9X8PXr5ykW8yJSFxJ+EJPDaXwneum8t6h4/z8tXd79b3cnR88X8a4YQP5s6L8Xn0vEZHuSvhCB5hbOIJPTMrhn9bvoeZ4fa+9T0npAbaFj/B/5k0iLZQUf3QikkSSppW+c91UjtY18KN1u3vl9SNNzg+fL2NC7iBumDmmV95DRKQnkqbQp4wawp9fPJb/eO099lYfi/nr/8+WCnYdOMY3rppMqmbnIhKHkqqZvvmpyaSnpnD/sztj+rqNkSZ+9MJuCkdmcf2M0TF9bRGRWEmqQh+RlcFX557Hc9sP8PreQzF73ac2hdl78GPuvHoyKSnW9Q4iIgGIqtDNbL6ZlZnZHjNb0s7zd5rZdjPbYmbrzOzc2EeNzi2fmMCYoRn8/dPbaWrq+clG9Y1N/GjdbmbkDeXqaSNjkFBEpHd0WehmFgIeBa4BpgE3mdm0M4ZtAorc/QLgV8CDsQ4arYy0EIvnF7ItfIRVm3t+N6NfbtxP+Ue13Hn1ZMw0OxeR+BXNDH02sMfd97p7PbACWNh6gLu/6O7HWx6+DgR6kPbCC/O4IH8oD64to7Y+0vUOHahriPBP6/Zw0bhs5k7OjWFCEZHYi6bQ84D9rR6Xt2zryBeBZ9t7wsxuNbMNZrahuro6+pTdlJJi/M1106g8Usdjv9171q/zX2+8T+WROv766kLNzkUk7sX0uq9m9pdAEXB5e8+7+3JgOUBRUVGvXk1rdsEw5k8fxb/85h3+/OKxjBiSEfW+qzaFeWDtTj44XMeA1BSqjp7oxaQiIrERTaGHgbGtHue3bDuNmV0FfAe43N3jogGXXDOF57ZXMvf7L1FbH2FMdiaLiws7vd/nqk1hlq7cQm1D83Vh6hubWLpyK4DuEyoicS2aQn8LmGRmBTQX+SLgL1oPMLNZwL8B8929KuYpz9Lm/TWYGcdb1tHDNbUsWbmFisO1nD9mKFVHT1B1tI6qIyeobvn979+vIXLG0TG1DRGWlZSp0EUkrnVZ6O7eaGa3AyVACPixu5ea2feADe6+BlgGDAZ+2bLW/L67L+jF3FFZVlLWppzrGpp4cO3pdzkanJ7KiKx0crPS24w/qaKdG1SLiMSTqNbQ3f0Z4Jkztt3d6vdXxThXTHRWwk9++VJGZKUzYkg6Awf84Y9hzv3rCbez35jszF7JKCISK0l1puiZOirhvOxMZhcMY3zOoNPKHGBxcSGZZ1znPDMtxOLiwl7LKSISC0ld6GdTzjfMyuO+G2eQl52J0Vz+9904Q+vnIhL3kvp29SdLeFlJGRU1tVEd5XJyPxW4iCSapC50UDmLSP+R1EsuIiL9iQpdRCRJqNBFRJKECl1EJEmo0EVEkoS59+pFDzt+Y7Nq4GPgYCABYiOHxM2v7MFJ5PzKHozW2c9193Zv0BBYoQOY2QZ3LwosQA8lcn5lD04i51f2YESbXUsuIiJJQoUuIpIkgi705QG/f08lcn5lD04i51f2YESVPdA1dBERiZ2gZ+giIhIjKnQRkSQRWKGb2XwzKzOzPWa2JKgc3WVmPzazKjPbFnSW7jKzsWb2opltN7NSM7sj6EzdYWYZZvammb3dkv/eoDN1l5mFzGyTmf1P0Fm6w8zeNbOtZrbZzDYEnae7zCzbzH5lZjvNbIeZXRp0pmiYWWHLn/nJX0fM7Bsdjg9iDd3MQsAu4FNAOc03or7J3bf3eZhuMrNPAseAn7v7+UHn6Q4zGw2Mdvffm1kWsBG4IRH+3AGs+Ya1g9z9mJmlAb8D7nD31wOOFjUzuxMoAoa4+/VB54mWmb0LFLl7Qp6YY2Y/A37r7o+Z2QBgoLvXBJ2rO1p6Mwz8sbu/196YoGbos4E97r7X3euBFcDCgLJ0i7u/DHwYdI6z4e4fuPvvW35/FNgBJMzF4r3ZsZaHaS2/EuZbfTPLB64DHgs6S39iZkOBTwKPA7h7faKVeYt5wDsdlTkEV+h5wP5Wj8tJoGJJBmY2HpgFvBFsku5pWbLYDFQBz7t7IuV/CPg20BR0kLPgwHNmttHMbg06TDcVANXAT1qWu4Ribd8AAAG8SURBVB4zs0FBhzoLi4AnOhugL0X7ITMbDPwa+Ia7Hwk6T3e4e8TdZwL5wGwzS4hlLzO7Hqhy941BZzlLl7n7RcA1wG0tS4+JIhW4CPgXd59F8zWkEuZ7O4CWZaIFwC87GxdUoYeBsa0e57dsk17Wsvb8a+A/3X1l0HnOVsuPzC8C84POEqU5wIKWtegVwJVm9otgI0XP3cMt/6wCnqJ52TRRlAPlrX6a+xXNBZ9IrgF+7+4HOhsUVKG/BUwys4KWv3kWAWsCytJvtHyp+Diww91/GHSe7jKzXDPLbvl9Js1fqu8MNlV03H2pu+e7+3ia/39f7+5/GXCsqJjZoJYv0WlZqrgaSJijvNy9EthvZoUtm+YBCXEgQCs30cVyCwR0k2h3bzSz24ESIAT82N1Lg8jSXWb2BDAXyDGzcuAed3882FRRmwPcDGxtWYcG+L/u/kyAmbpjNPCzlm/7U4An3T2hDv9LUCOBp5rnA6QC/+Xua4ON1G1fB/6zZQK5F/h8wHmi1vKX6KeAL3c5Vqf+i4gkB30pKiKSJFToIiJJQoUuIpIkVOgiIklChS4ikiRU6CIiSUKFLiKSJP4/sGhmQrKuHnwAAAAASUVORK5CYII=\n", 398 | "text/plain": [ 399 | "
" 400 | ] 401 | }, 402 | "metadata": { 403 | "needs_background": "light" 404 | }, 405 | "output_type": "display_data" 406 | } 407 | ], 408 | "source": [ 409 | "import matplotlib.pyplot as plt\n", 410 | "\n", 411 | "plt.plot(list(meta.keys()), list(meta.values()), label=\"meta-VQE\", marker=\"o\")\n", 412 | "plt.plot(list(fci.keys()), list(fci.values()), label=\"FCI\", marker=\"x\", markersize=3)\n", 413 | "plt.legend()\n", 414 | "plt.show()\n", 415 | "plt.figure()\n", 416 | "\n", 417 | "plt.plot(list(meta_opt.keys()), list(meta_opt.values()), label=\"opt-meta-VQE\", marker=\"o\")\n", 418 | "plt.plot(list(fci.keys()), list(fci.values()), label=\"FCI\", marker=\"x\", markersize=3)\n", 419 | "plt.legend()\n", 420 | "plt.show()\n", 421 | "plt.figure()\n", 422 | "\n", 423 | "# plot specfic angles\n", 424 | "key = tq.assign_variable(\"D_{}_{}_{}\".format(0, 0, 1))\n", 425 | "angles = [angles[key] for angles in meta_angles.values()]\n", 426 | "plt.plot(list(meta_angles.keys()), angles, label=key.name, marker=\"o\")\n", 427 | "plt.legend()\n", 428 | "plt.show()" 429 | ] 430 | }, 431 | { 432 | "cell_type": "markdown", 433 | "metadata": {}, 434 | "source": [ 435 | "## The example from the Paper:\n", 436 | "In the paper we used the rectangular H$_4$ system with STO-3G as basis_set. \n", 437 | "Below we give the structural data for this system." 438 | ] 439 | }, 440 | { 441 | "cell_type": "code", 442 | "execution_count": 7, 443 | "metadata": {}, 444 | "outputs": [], 445 | "source": [ 446 | "geomstring = \"H 0.0 0.0 0.0\\nH 0.0 0.0 1.23\\nH {R} 0.0 0.0\\nH {R} 0.0 1.23\"\n", 447 | "include_singles=True\n", 448 | "training_points = [0.5, 1.0, 1.5, 2.0, 2.5]" 449 | ] 450 | } 451 | ], 452 | "metadata": { 453 | "kernelspec": { 454 | "display_name": "Python [conda env:tqenv2] *", 455 | "language": "python", 456 | "name": "conda-env-tqenv2-py" 457 | }, 458 | "language_info": { 459 | "codemirror_mode": { 460 | "name": "ipython", 461 | "version": 3 462 | }, 463 | "file_extension": ".py", 464 | "mimetype": "text/x-python", 465 | "name": "python", 466 | "nbconvert_exporter": "python", 467 | "pygments_lexer": "ipython3", 468 | "version": "3.8.5" 469 | } 470 | }, 471 | "nbformat": 4, 472 | "nbformat_minor": 2 473 | } 474 | -------------------------------------------------------------------------------- /QFit.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Fitting functions with a quantum circuit\n", 8 | "___________________________________\n", 9 | "\n", 10 | "_This notebook is part of the Q-Hack 2021 presentation (you can find the [slides here](https://albacl.github.io/files/QHack2021.pdf) and the [recording here](https://www.twitch.tv/videos/920118091))._\n", 11 | "\n", 12 | "In this notebook, I will present simple circuits to encode the data into a quantum circuit utilizing the angles in the rotational gates. With that, we can check if the quantum circuit can approximate a given function. The explicit circuits presented are for only one qubit, but its generalization to multiple-qubits follows.\n", 13 | "\n", 14 | "This notebook is based on the references:\n", 15 | "\n", 16 | "- _One qubit as a Universal Approximant_, A. Pérez-Salinas, D. López-Núñez, A. García-Sáez, P. Forn-Díaz, J. I. Latorre, [arXiv:2102.04032 [quant-ph]](https://arxiv.org/abs/2102.04032) (2021).\n", 17 | "- _The effect of data encoding on the expressive power of variational quantum machine learning models_, M. Schuld, R. Sweke, J. J. Meyer, [arXiv:2008.08605 [quant-ph]](https://arxiv.org/abs/2008.08605) (2020).\n", 18 | "- _Data re-uploading for a universal quantum classifier_, A. Pérez-Salinas, A. Cervera-Lierta, E. Gil-Fuster, J. I. Latorre, [Quantum 4, 226 (2020)](https://quantum-journal.org/papers/q-2020-02-06-226/).\n", 19 | "\n", 20 | "You will need to install [Tequila](https://github.com/aspuru-guzik-group/tequila) package to run it." 21 | ] 22 | }, 23 | { 24 | "cell_type": "code", 25 | "execution_count": 1, 26 | "metadata": {}, 27 | "outputs": [], 28 | "source": [ 29 | "import tequila as tq\n", 30 | "import numpy as np\n", 31 | "import matplotlib.pyplot as plt\n", 32 | "from numpy import random" 33 | ] 34 | }, 35 | { 36 | "cell_type": "markdown", 37 | "metadata": {}, 38 | "source": [ 39 | "## Quantum Circuit\n", 40 | "\n", 41 | "We will encode the data into the rotational gates of a quantum circuit.\n", 42 | "As an example, for one qubit, we select the following encoding:\n", 43 | "$$ U\\left(\\vec{\\theta},x\\right) = R_{y}\\left(\\theta^{(1)}\\right)R_{z}\\left(\\theta^{(2)}x + \\theta^{(3)}\\right), $$\n", 44 | "where $x$ is a given data point (in this case, we consider 1D data), $\\vec{\\theta}=\\left(\\theta^{(1)}, \\theta^{(2)}, \\theta^{(3)}\\right)$ and $R_{k}\\left(\\theta\\right)=e^{i\\frac{\\theta}{2}\\sigma_{k}}$ with $k=x,y,z$.\n", 45 | "\n", 46 | "The strategy will be the following: the total quantum circuit will be a concatenation of $U$ gates that feed the circuit with the data and some parameters to be optimized, i.e.\n", 47 | "$$ U_{feed}\\left(\\vec{\\theta}_{1},\\cdots,\\vec{\\theta}_{L};x\\right) = U\\left(\\vec{\\theta}_{L},x\\right)U\\left(\\vec{\\theta}_{L-1},x\\right)\\cdots U\\left(\\vec{\\theta}_{1},x\\right). $$\n", 48 | "We need to establish the number of _layers_ $L$ of our circuit and we will have to find the optimal values of the $3L$ parameters. We expect that the larger the number of layers, the more sophisticated will be the encoding and the higher the accuracy of the function." 49 | ] 50 | }, 51 | { 52 | "cell_type": "code", 53 | "execution_count": 2, 54 | "metadata": {}, 55 | "outputs": [], 56 | "source": [ 57 | "def qcircuit(x, layers, param):\n", 58 | " qc = tq.QCircuit()\n", 59 | " p = 0 # all parameters are stored in a single list\n", 60 | " for l in range(layers): # add layers to the circuit\n", 61 | " qc += tq.gates.Ry(param[p],0) + tq.gates.Rz(x*param[p+1]+param[p+2],0) # feed the troll!\n", 62 | " p = p + 3\n", 63 | " return qc" 64 | ] 65 | }, 66 | { 67 | "cell_type": "markdown", 68 | "metadata": {}, 69 | "source": [ 70 | "## Learning the function\n", 71 | "\n", 72 | "Once we have the data encoded into the quantum circuit (a.k.a. _feature map_), we have to design a cost function that will allow us to optimize the circuit parameters.\n", 73 | "\n", 74 | "Since we are dealing with only one qubit, a simple approach is to measure it on the computational basis and depending on the expectation value of $Z$ operator, we compare it with the value of the target function to learn. This function has to be rescaled between -1 and 1 accordingly. Thus, we construct the cost function by taking a set of data training points $\\left(x_{1},\\cdots,x_{M}\\right)$, running out $U_feed$ circuit with each of them and computing the expectation value of $Z$ with the resultant state:\n", 75 | "$$\\mathcal{L}oss\\left(\\vec{\\theta}_{1},\\cdots,\\vec{\\theta}_{L}\\right)=\\sum_{i=1}^{M}\\left(|\\langle 0|U_{feed}^{\\dagger}(x_{i})ZU_{feed}(x_{i})|0\\rangle|^2 - f(x_{i})\\right)^2, $$\n", 76 | "were I ommited the $\\theta$ dependency in $U_{feed}$." 77 | ] 78 | }, 79 | { 80 | "cell_type": "code", 81 | "execution_count": 3, 82 | "metadata": {}, 83 | "outputs": [], 84 | "source": [ 85 | "# Function\n", 86 | "def f(x):\n", 87 | " func = np.sin(10*x)/(10*x)\n", 88 | " return func\n", 89 | "\n", 90 | "# Cost function\n", 91 | "def loss(xval,layers,param):\n", 92 | " obj = 0\n", 93 | " for i in range(len(xval)):\n", 94 | " qc = qcircuit(xval[i],layers, param)\n", 95 | " expval = tq.ExpectationValue(qc, H=tq.paulis.Z(0))\n", 96 | " obj += (expval-f(xval[i]))**2\n", 97 | " return obj/len(xval)" 98 | ] 99 | }, 100 | { 101 | "cell_type": "markdown", 102 | "metadata": {}, 103 | "source": [ 104 | "We are ready for the circuit optimization! To compare how the accuracy changes with the number of layers, we will optimize for up to `laymax` layers. We have also to create the training data set (in this example, we will take random points between -1 and 1)" 105 | ] 106 | }, 107 | { 108 | "cell_type": "code", 109 | "execution_count": 4, 110 | "metadata": {}, 111 | "outputs": [ 112 | { 113 | "name": "stdout", 114 | "output_type": "stream", 115 | "text": [ 116 | "1 layers\n", 117 | "Loss function = 0.13260757536486664\n", 118 | "2 layers\n", 119 | "Loss function = 0.04352773925273443\n", 120 | "3 layers\n", 121 | "Loss function = 0.00035727648165960176\n", 122 | "4 layers\n", 123 | "Loss function = 0.0001931700809334706\n" 124 | ] 125 | } 126 | ], 127 | "source": [ 128 | "training_set = 25 # number of training points\n", 129 | "laymax = 4\n", 130 | "\n", 131 | "# generate the training data\n", 132 | "xval=[]\n", 133 | "for i in range(training_set):\n", 134 | " rand = random.uniform(-1,1)\n", 135 | " xval.append(rand)\n", 136 | "\n", 137 | "# Optimization details \n", 138 | "grad = '2-point' # numerical gradient (= None: analytical gradient)\n", 139 | "mthd = 'BFGS' # minimization method\n", 140 | "backend = 'qulacs' # you can choose another, Qiskit, pyquil, cirq,... check the documentation\n", 141 | "mthd_opt = {'eps':1.e-4} # method options (that's the stepsize for the gradients)\n", 142 | "\n", 143 | "train_param = [[]]*(laymax+1)\n", 144 | "for l in range(1,laymax+1):\n", 145 | " \n", 146 | " # Generate the needed variables\n", 147 | " param = [tq.Variable(name='th{}'.format(i)) for i in range(0,3*l)]\n", 148 | " # Initialize them at random\n", 149 | " param0 = {key : random.uniform(0, 2*np.pi) for key in param}\n", 150 | " \n", 151 | " # Optimize!\n", 152 | " train = tq.minimize(objective=loss(xval,l,param), initial_values = param0, method = mthd, \n", 153 | " gradient = grad, method_options = mthd_opt, backend = backend, \n", 154 | " silent=True) # silent=False to see the optimization\n", 155 | " \n", 156 | " print(\"{}\".format(l),\" layers\")\n", 157 | " print(\"Loss function = \", train.energy)\n", 158 | " \n", 159 | " train_param[l] = train.angles # saving the parameters \n", 160 | " # You can plot the history plot of the optimization! both for the energy and angles. Check the documentation." 161 | ] 162 | }, 163 | { 164 | "cell_type": "markdown", 165 | "metadata": {}, 166 | "source": [ 167 | "## Test and results\n", 168 | "\n", 169 | "Once we have the optimized parameters, we can proceed to test the results by running new circuits with other data values." 170 | ] 171 | }, 172 | { 173 | "cell_type": "code", 174 | "execution_count": 5, 175 | "metadata": {}, 176 | "outputs": [ 177 | { 178 | "data": { 179 | "image/png": "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\n", 180 | "text/plain": [ 181 | "
" 182 | ] 183 | }, 184 | "metadata": { 185 | "needs_background": "light" 186 | }, 187 | "output_type": "display_data" 188 | } 189 | ], 190 | "source": [ 191 | "test_set = 100 # number of test points\n", 192 | "\n", 193 | "col = ['red','blue','orange','brown']\n", 194 | "\n", 195 | "# generate the test data\n", 196 | "xtest=[]\n", 197 | "for i in range(test_set):\n", 198 | " rand = random.uniform(-1,1)\n", 199 | " xtest.append(rand) \n", 200 | " \n", 201 | "for l in range(1,laymax+1):\n", 202 | " \n", 203 | " param = [tq.Variable(name='th{}'.format(i)) for i in range(0,3*l)]\n", 204 | " ytrain=[]\n", 205 | " for i in range(test_set):\n", 206 | " \n", 207 | " qc = qcircuit(xtest[i], l, param) # construct again the QFit\n", 208 | " expval = tq.ExpectationValue(qc, H=tq.paulis.Z(0)) # compute the expectation value\n", 209 | " res_test = tq.simulate(expval,variables=train_param[l]) # use the optimized angles to check the result!\n", 210 | " \n", 211 | " ytrain.append(res_test)\n", 212 | " \n", 213 | " plt.plot(xtest, ytrain, '.', color=col[l-1], label = \"{} layers\".format(l))\n", 214 | " \n", 215 | "xfunc = np.arange(-1., 1., 0.01)\n", 216 | "plt.plot(xfunc,f(xfunc), '-', color='black', label =\"exact\") \n", 217 | "plt.xlabel(\"x\")\n", 218 | "plt.ylabel(\"f(x)\")\n", 219 | "plt.legend()\n", 220 | "plt.show()" 221 | ] 222 | }, 223 | { 224 | "cell_type": "markdown", 225 | "metadata": {}, 226 | "source": [ 227 | "## Conclusions and some open questions\n", 228 | "\n", 229 | "As you can see, one qubit has the capability of learning an arbitrary function. The data re-uploading strategy used (repeating the same encoding multiple times) increases the accuracy as more layers are considered. This result comes from the fact that a qubit can represent the Fourier series, which in turn can represent arbitrary continuous functions. It can also be proved the universality of a single-qubit as a function approximator by means of the Universal Approximation Theorem.\n", 230 | "\n", 231 | "- These are the results for only one qubit, what happens if we consider more and entanglement between layers? Do we require more or fewer parameters to learn the function with similar accuracy?\n", 232 | "- We used a particular encoding. Are there encodings that involve less number of parameters without compromising the accuracy?\n", 233 | "- We only tested a 1d model. What about higher-dimensional functions?\n", 234 | "- What about using quantum data instead of classical data that we introduce \"manually\" to the circuit?\n", 235 | "- To construct the cost function, we measure the state on the computational basis. What about measuring it on another basis? (hint: by using a final rotation without the data point that projects into a different basis)\n", 236 | "- Can we design more clever cost functions?\n", 237 | "\n", 238 | "**I hope you enjoyed this small tutorial and do not hesitate to contact me with questions or ideas!**" 239 | ] 240 | }, 241 | { 242 | "cell_type": "code", 243 | "execution_count": null, 244 | "metadata": {}, 245 | "outputs": [], 246 | "source": [] 247 | } 248 | ], 249 | "metadata": { 250 | "kernelspec": { 251 | "display_name": "Python [conda env:tqenv2] *", 252 | "language": "python", 253 | "name": "conda-env-tqenv2-py" 254 | }, 255 | "language_info": { 256 | "codemirror_mode": { 257 | "name": "ipython", 258 | "version": 3 259 | }, 260 | "file_extension": ".py", 261 | "mimetype": "text/x-python", 262 | "name": "python", 263 | "nbconvert_exporter": "python", 264 | "pygments_lexer": "ipython3", 265 | "version": "3.8.5" 266 | } 267 | }, 268 | "nbformat": 4, 269 | "nbformat_minor": 4 270 | } 271 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Q-Hack 2021 2 | 3 | This is a repository with some code examples to get a gentle introduction to classical data encoding in quantum circuits and how to use it to construct a variational quantum classifier, a function fitter and to learn energy profiles of Hamiltonians. 4 | It is the complementary material from my [Q-Hack 2021](https://qhack.ai/index.html) presentation (you can find the [slides here](https://albacl.github.io/files/QHack2021.pdf) and the [recording here](https://www.twitch.tv/videos/920118091)). 5 | 6 | You will need to install `Tequila`[1] to run the notebook and play with them. 7 | 8 | - [Download and installation instructions](https://github.com/aspuru-guzik-group/tequila). 9 | - [Tutorials](https://github.com/aspuru-guzik-group/tequila-tutorials). 10 | - [Overview video](https://www.youtube.com/watch?v=hUdf0P2fW2E) or [this one](https://www.youtube.com/watch?v=eUqUUAUFHyc). 11 | 12 | If you want to learn about Variational Quantum Algorithms and Noisy Intermediate-Scale Quantum (NISQ) computing, you can check the review [2]. 13 | 14 | ## Content 15 | 16 | - [Single-qubit classifier](https://github.com/AlbaCL/qhack21/blob/main/SingleQubitClassifier.ipynb) [3] 17 | - [Meta-Variational Quantum Eigensolver for spin chains](https://github.com/AlbaCL/qhack21/blob/main/Meta-VQE.ipynb) [4] 18 | - [Meta-VQE for chemistry](https://github.com/AlbaCL/qhack21/blob/main/Molecular-Meta-VQE.ipynb) [4] 19 | - [Quantum function fitter](https://github.com/AlbaCL/qhack21/blob/main/QFit.ipynb) [5,6] 20 | 21 | The Meta-VQE notebook come from [this repository](https://github.com/aspuru-guzik-group/meta-vqe). 22 | 23 | 24 | ## References 25 | 26 | [1] _Tequila: A platform for rapid development of quantum algorithms_,
27 | J. S. Kottmann, S. Alperin-Lea, T. Tamayo-Mendoza, A. Cervera-Lierta, C. Lavigne, T.-C. Yen, V. Verteletskyi, P. Schleich, A. Anand, M. Degroote, S. Chaney, M. Kesibi, N. Grace Curnow, B. Solo, G. Tsilimigkounakis, C. Zendejas-Morales, A. F. Izmaylov, A. Aspuru-Guzik,
[Quantum Science and Technology](https://iopscience.iop.org/article/10.1088/2058-9565/abe567/pdf), [arXiv:2011.03057 [quant-ph]](https://arxiv.org/abs/2011.03057). 28 | 29 | [2] _Noisy intermediate-scale quantum (NISQ) algorithms_,
30 | K. Bharti, A. Cervera-Lierta, T. H. Kyaw, T. Haug, S. Alperin-Lea, A. Anand, M. Degroote, H. Heimonen, J. S. Kottmann, T. Menke, W.-K. Mok, S. Sim, L.-C. Kwek, A. Aspuru-Guzik,
31 | [arXiv:2101.08448 [quant-ph]](https://arxiv.org/abs/2101.08448) (2021). 32 | 33 | [3] _Data re-uploading for a universal quantum classifier_,
34 | A. Pérez-Salinas, A. Cervera-Lierta, E. Gil-Fuster, J. I. Latorre,
35 | [Quantum 4, 226 (2020)](https://quantum-journal.org/papers/q-2020-02-06-226/). 36 | 37 | [4] _The Meta-Variational Quantum Eigensolver (Meta-VQE): Learning energy profiles of parameterized Hamiltonians for quantum simulation_,
38 | A. Cervera-Lierta, J. S. Kottmann, A. Aspuru-Guzik,
39 | [arXiv:2009.13545 [quant-ph]](https://arxiv.org/abs/2009.13545) (2020). 40 | 41 | [5] _One qubit as a Universal Approximant_,
42 | A. Pérez-Salinas, D. López-Núñez, A. García-Sáez, P. Forn-Díaz, J. I. Latorre,
43 | [arXiv:2102.04032 [quant-ph]](https://arxiv.org/abs/2102.04032) (2021). 44 | 45 | [6] _The effect of data encoding on the expressive power of variational quantum machine learning models_,
46 | M. Schuld, R. Sweke, J. J. Meyer,
47 | [arXiv:2008.08605 [quant-ph]](https://arxiv.org/abs/2008.08605) (2020). 48 | --------------------------------------------------------------------------------