{ "cells": [ { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# Variational Quantum Eigensolver" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A common application of the Variational Quantum Eigensolver (VQE) algorithm is to compute the ground state energy of a molecular system. The code below demonstrates how to perform classical preprocessing for a $H_2$ molecule (i.e. obtain the integrals from a Hartree-Fock computation to build the molecular Hamiltonian), prepare the initial Hartree-Fock state on the quantum register, add the parameterized UCCSD ansatz to the kernel, and select the COBYLA optimizer. We are then ready to call `cudaq:vqe` to estimate the minimum energy of the system." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "!pip install openfermionpyscf==0.5 matplotlib==3.8.4 scipy==1.13.0 -q" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import cudaq\n", "import matplotlib.pyplot as plt\n", "from scipy.optimize import minimize\n", "import numpy as np\n", "\n", "# Single precision\n", "cudaq.set_target(\"nvidia\")\n", "# Double precision\n", "#cudaq.set_target(\"nvidia-fp64\")" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "The problem of interest here is a chain of hydrogen atoms seperated along the z-axis at a fixed interval called the bond distance. \n", "\n", "The interatomic electrostatic forces due to the electrons and protons and the shielding by the neutrons creates a chemical system whose energy can be minimised to find a stable configuration. \n", "\n", "Let us first begin by defining the molecule and other metadata about the problem.\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# Number of hydrogen atoms.\n", "hydrogen_count = 2\n", "\n", "# Distance between the atoms in Angstroms.\n", "bond_distance = 0.7474\n", "\n", "# Define a linear chain of Hydrogen atoms\n", "geometry = [('H', (0, 0, i * bond_distance)) for i in range(hydrogen_count)]\n", "\n", "hamiltonian, data = cudaq.chemistry.create_molecular_hamiltonian(\n", " geometry, 'sto-3g', 1, 0)\n", "\n", "electron_count = data.n_electrons\n", "qubit_count = 2 * data.n_orbitals" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "We now generate a Unitary Coupled-Cluster Singles and Doubles (UCCSD) ansatz from the template provided by CUDA-Q. " ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "@cudaq.kernel\n", "def kernel(thetas: list[float]):\n", "\n", " qubits = cudaq.qvector(qubit_count)\n", "\n", " for i in range(electron_count):\n", " x(qubits[i])\n", "\n", " cudaq.kernels.uccsd(qubits, thetas, electron_count, qubit_count)\n", "\n", "\n", "parameter_count = cudaq.kernels.uccsd_num_parameters(electron_count,\n", " qubit_count)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Using CUDA-Q Optimizers\n", "\n", "We use the builtin optimizers within CUDA-Q for the minimization procedure." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-1.1371744305855906\n" ] } ], "source": [ "optimizer = cudaq.optimizers.COBYLA()\n", "\n", "energy, parameters = cudaq.vqe(kernel,\n", " hamiltonian,\n", " optimizer,\n", " parameter_count=parameter_count)\n", "\n", "print(energy)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "### Integration with Third-Party Optimizers\n", "\n", "We can also integrate popular libraries like scipy with CUDA-Q. " ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "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O3lU7fjPTpdLUtMoU9PflxMGmJqNsJhqPkrj/nvY7PeTL3ALoxdtDaKYp/xw6ijPiXWceHzjpB9OPM7J39vSdzb+3kZxp9Ta8Y1Ns2sjTh0VZOEcdoIQAHiJYRganhjpM7cSAfAcIQAAEMAIQgAAIGARhAAAQMAiCAEAgIBFEAIAAAGLIAQAAAIWQQgAAAQsghAAAAhYBCEAABCwCEIAACBgEYQAAEDAIggBAICARRACAAABiyAEAAAClt3qAvo60zQlSWVlZRZXAgAAOsr957b7z/HWEITaUV5eLklKTU21uBIAANBZ5eXlio6ObvVzw2wvKgU4l8ul/Px8RUZGyjAMr31vWVmZUlNTtX//fkVFRXnte/sSfz9Hfz8/yf/PkfPzff5+jpxf15mmqfLycqWkpMhma70TiBGhdthsNg0aNKjHvj8qKsov/+E+kb+fo7+fn+T/58j5+T5/P0fOr2vaGglyo1kaAAAELIIQAAAIWAQhizgcDj300ENyOBxWl9Jj/P0c/f38JP8/R87P9/n7OXJ+PY9maQAAELAYEQIAAAGLIAQAAAIWQQgAAAQsghAAAAhYBCGLPP3000pPT1doaKiysrK0du1aq0vyit/97ncyDKPZa+TIkVaX1S2ff/65LrnkEqWkpMgwDL377rvNPjdNUw8++KCSk5MVFhamGTNmaPv27dYU2wXtnd+8efNOuaYzZ860ptguWLhwoSZNmqTIyEglJCTo8ssvV15eXrNtampqdNttt2nAgAHq16+fZs+ercLCQosq7ryOnON55513ynW85ZZbLKq4c5555hmNHTvW89C9KVOm6KOPPvJ87uvXr73z8+Vr15KHH35YhmHozjvv9Lxn5TUkCFngH//4h371q1/poYce0tdff61x48bpoosuUlFRkdWlecVpp52mQ4cOeV5ffvml1SV1S2VlpcaNG6enn366xc8feeQRPfXUU3r22We1Zs0aRURE6KKLLlJNTU0vV9o17Z2fJM2cObPZNX3jjTd6scLuWbFihW677TatXr1aS5cuVX19vS688EJVVlZ6trnrrrv0wQcf6K233tKKFSuUn5+vK664wsKqO6cj5yhJN954Y7Pr+Mgjj1hUcecMGjRIDz/8sDZs2KD169fr/PPP12WXXabvvvtOku9fv/bOT/Lda3eydevW6bnnntPYsWObvW/pNTTR6yZPnmzedtttnt8bGhrMlJQUc+HChRZW5R0PPfSQOW7cOKvL6DGSzMWLF3t+d7lcZlJSkvk///M/nvdKSkpMh8NhvvHGGxZU2D0nn59pmubcuXPNyy67zJJ6ekJRUZEpyVyxYoVpmo3XKzg42Hzrrbc822zdutWUZK5atcqqMrvl5HM0TdM899xzzTvuuMO6orysf//+5gsvvOCX1880j5+fafrPtSsvLzczMzPNpUuXNjsnq68hI0K9rK6uThs2bNCMGTM879lsNs2YMUOrVq2ysDLv2b59u1JSUpSRkaGcnBzt27fP6pJ6zO7du1VQUNDsekZHRysrK8tvrqckLV++XAkJCRoxYoRuvfVWHT161OqSuqy0tFSSFBsbK0nasGGD6uvrm13DkSNHKi0tzWev4cnn6Pbaa68pLi5Op59+uu69915VVVVZUV63NDQ0aNGiRaqsrNSUKVP87vqdfH5u/nDtbrvtNv3whz9sdq0k6/8dZNHVXnbkyBE1NDQoMTGx2fuJiYnKzc21qCrvycrK0ssvv6wRI0bo0KFD+v3vf6/p06fr22+/VWRkpNXleV1BQYEktXg93Z/5upkzZ+qKK67QkCFDtHPnTv32t7/VrFmztGrVKgUFBVldXqe4XC7deeedOvvss3X66adLaryGISEhiomJabatr17Dls5Rkq6++moNHjxYKSkp2rx5s/7jP/5DeXl5eueddyystuO2bNmiKVOmqKamRv369dPixYs1evRobdq0yS+uX2vnJ/n+tZOkRYsW6euvv9a6detO+czqfwcJQvCqWbNmeX4eO3assrKyNHjwYL355pu64YYbLKwMXTVnzhzPz2PGjNHYsWM1dOhQLV++XNnZ2RZW1nm33Xabvv32W5/vW2tLa+d40003eX4eM2aMkpOTlZ2drZ07d2ro0KG9XWanjRgxQps2bVJpaanefvttzZ07VytWrLC6LK9p7fxGjx7t89du//79uuOOO7R06VKFhoZaXc4puDXWy+Li4hQUFHRKN3xhYaGSkpIsqqrnxMTEaPjw4dqxY4fVpfQI9zULlOspSRkZGYqLi/O5azp//nx9+OGH+uyzzzRo0CDP+0lJSaqrq1NJSUmz7X3xGrZ2ji3JysqSJJ+5jiEhIRo2bJgmTJighQsXaty4cfrTn/7kN9evtfNria9duw0bNqioqEjjx4+X3W6X3W7XihUr9NRTT8lutysxMdHSa0gQ6mUhISGaMGGCli1b5nnP5XJp2bJlze4H+4uKigrt3LlTycnJVpfSI4YMGaKkpKRm17OsrExr1qzxy+spSQcOHNDRo0d95pqapqn58+dr8eLF+vTTTzVkyJBmn0+YMEHBwcHNrmFeXp727dvnM9ewvXNsyaZNmyTJZ67jyVwul2pra/3i+rXEfX4t8bVrl52drS1btmjTpk2e18SJE5WTk+P52dJr2OPt2DjFokWLTIfDYb788svm999/b950001mTEyMWVBQYHVp3Xb33Xeby5cvN3fv3m2uXLnSnDFjhhkXF2cWFRVZXVqXlZeXmxs3bjQ3btxoSjIff/xxc+PGjebevXtN0zTNhx9+2IyJiTHfe+89c/PmzeZll11mDhkyxKyurra48o5p6/zKy8vNX//61+aqVavM3bt3m5988ok5fvx4MzMz06ypqbG69A659dZbzejoaHP58uXmoUOHPK+qqirPNrfccouZlpZmfvrpp+b69evNKVOmmFOmTLGw6s5p7xx37Nhh/uEPfzDXr19v7t6923zvvffMjIwM85xzzrG48o5ZsGCBuWLFCnP37t3m5s2bzQULFpiGYZj//ve/TdP0/evX1vn5+rVrzckz4ay8hgQhi/z5z38209LSzJCQEHPy5Mnm6tWrrS7JK6666iozOTnZDAkJMQcOHGheddVV5o4dO6wuq1s+++wzU9Ipr7lz55qm2TiF/oEHHjATExNNh8NhZmdnm3l5edYW3QltnV9VVZV54YUXmvHx8WZwcLA5ePBg88Ybb/Sp0N7SuUkyX3rpJc821dXV5i9+8Quzf//+Znh4uPnjH//YPHTokHVFd1J757hv3z7znHPOMWNjY02Hw2EOGzbMvOeee8zS0lJrC++g66+/3hw8eLAZEhJixsfHm9nZ2Z4QZJq+f/3aOj9fv3atOTkIWXkNDdM0zZ4fdwIAAOh76BECAAABiyAEAAACFkEIAAAELIIQAAAIWAQhAAAQsAhCAAAgYBGEAABAwCIIAUA7DMPQu+++a3UZAHoAQQhAnzZv3jwZhnHKa+bMmVaXBsAP2K0uAADaM3PmTL300kvN3nM4HBZVA8CfMCIEoM9zOBxKSkpq9urfv7+kxttWzzzzjGbNmqWwsDBlZGTo7bffbrb/li1bdP755yssLEwDBgzQTTfdpIqKimbbvPjiizrttNPkcDiUnJys+fPnN/v8yJEj+vGPf6zw8HBlZmbq/fff93x27Ngx5eTkKD4+XmFhYcrMzDwluAHomwhCAHzeAw88oNmzZ+ubb75RTk6O5syZo61bt0qSKisrddFFF6l///5at26d3nrrLX3yySfNgs4zzzyj2267TTfddJO2bNmi999/X8OGDWt2jN///ve68sortXnzZl188cXKyclRcXGx5/jff/+9PvroI23dulXPPPOM4uLieu9vAICu65WlXQGgi+bOnWsGBQWZERERzV5//OMfTdNsXHn9lltuabZPVlaWeeutt5qmaZrPP/+82b9/f7OiosLz+f/93/+ZNpvNLCgoME3TNFNSUsz77ruv1Rokmffff7/n94qKClOS+dFHH5mmaZqXXHKJed1113nnhAH0KnqEAPR5P/jBD/TMM880ey82Ntbz85QpU5p9NmXKFG3atEmStHXrVo0bN04RERGez88++2y5XC7l5eXJMAzl5+crOzu7zRrGjh3r+TkiIkJRUVEqKiqSJN16662aPXu2vv76a1144YW6/PLLNXXq1C6dK4DeRRAC0OdFRESccqvKW8LCwjq0XXBwcLPfDcOQy+WSJM2aNUt79+7Vv/71Ly1dulTZ2dm67bbb9Oijj3q9XgDeRY8QAJ+3evXqU34fNWqUJGnUqFH65ptvVFlZ6fl85cqVstlsGjFihCIjI5Wenq5ly5Z1q4b4+HjNnTtXf//73/Xkk0/q+eef79b3AegdjAgB6PNqa2tVUFDQ7D273e5pSH7rrbc0ceJETZs2Ta+99prWrl2rv/71r5KknJwcPfTQQ5o7d65+97vf6fDhw/rlL3+pn/3sZ0pMTJQk/e53v9Mtt9yihIQEzZo1S+Xl5Vq5cqV++ctfdqi+Bx98UBMmTNBpp52m2tpaffjhh54gBqBvIwgB6POWLFmi5OTkZu+NGDFCubm5khpndC1atEi/+MUvlJycrDfeeEOjR4+WJIWHh+vjjz/WHXfcoUmTJik8PFyzZ8/W448/7vmuuXPnqqamRk888YR+/etfKy4uTj/5yU86XF9ISIjuvfde7dmzR2FhYZo+fboWLVrkhTMH0NMM0zRNq4sAgK4yDEOLFy/W5ZdfbnUpAHwQPUIAACBgEYQAAEDAokcIgE/j7j6A7mBECAAABCyCEAAACFgEIQAAELAIQgAAIGARhAAAQMAiCAEAgIBFEAIAAAGLIAQAAAIWQQgAAASs/x+qP0B/2ARgBgAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Define a function to minimize\n", "def cost(theta):\n", "\n", " exp_val = cudaq.observe(kernel, hamiltonian, theta).expectation()\n", "\n", " return exp_val\n", "\n", "\n", "exp_vals = []\n", "\n", "\n", "def callback(xk):\n", " exp_vals.append(cost(xk))\n", "\n", "\n", "# Initial variational parameters.\n", "np.random.seed(42)\n", "x0 = np.random.normal(0, np.pi, parameter_count)\n", "\n", "# Use the scipy optimizer to minimize the function of interest\n", "result = minimize(cost,\n", " x0,\n", " method='COBYLA',\n", " callback=callback,\n", " options={'maxiter': 40})\n", "\n", "plt.plot(exp_vals)\n", "plt.xlabel('Epochs')\n", "plt.ylabel('Energy')\n", "plt.title('VQE')\n", "plt.show()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.12" }, "orig_nbformat": 4, "vscode": { "interpreter": { "hash": "31f2aee4e71d21fbe5cf8b01ff0e069b9275f58929596ceb00d14d90e3e16cd6" } } }, "nbformat": 4, "nbformat_minor": 2 }