diff --git a/algorithms/qaoa/grover_mixer_qaoa/gm_qaoa.ipynb b/algorithms/qaoa/grover_mixer_qaoa/gm_qaoa.ipynb new file mode 100644 index 000000000..f01c560d9 --- /dev/null +++ b/algorithms/qaoa/grover_mixer_qaoa/gm_qaoa.ipynb @@ -0,0 +1,681 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "# Grover Mixers for QAOA" + ] + }, + { + "cell_type": "markdown", + "id": "1", + "metadata": {}, + "source": [ + "Grover Mixers for QAOA (GM-QAOA) is one of the algorithms applied to constrained optimization problems, where the mixer operator in QAOA is replaced by a parameterized Grover diffuser operator that utilizes an equal superposition of all feasible solutions [[1](#gm-qaoa)]. In the potential challenges of standard QAOA, the cost operator (which applies phases based on the objective function) and the mixer operator (which explores the state space) are alternately applied. This method sometimes fails to reach the desired solution in constrained problems.\n", + "\n", + "GM-QAOA is a variant of the Quantum Approximate Optimization Algorithm (QAOA) and is particularly designed for constrained optimization problems. In the standard QAOA, the variational circuit alternates between the following two types of unitaries:\n", + "\n", + "1. Phase-separation operator (based on the cost Hamiltonian $\\hat{H}_C$),\n", + "2. Mixer (a unitary to explore the solution space).\n", + "\n", + "For unconstrained problems, a simple mixer $(\\prod_i e^{-i \\beta X_i})$ is sufficient. GM-QAOA avoids this difficulty by shifting the complexity of mixer design into the state preparation step.\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "2", + "metadata": {}, + "source": [ + "## Exercise\n", + "\n", + "Let's assume that we will solve the following problem using QAOA and GM-QAOA.\n", + "\n", + "We impose the following constraint:\n", + "$$\n", + "\\sum_{i=0}^{3} x_i = 1\n", + "$$\n", + "\n", + "The objective function is given by:\n", + "$$\n", + "f(x_0,x_1,x_2,x_3) = x_0 + 2(x_1+x_2+x_3) - 3x_2 + 10x_3\n", + "$$\n", + "\n", + "Find $x_0, x_1, x_2, x_3$ that minimize $f$.\n" + ] + }, + { + "cell_type": "markdown", + "id": "3", + "metadata": {}, + "source": [ + "## Algorithm description\n", + "\n", + "In GM-QAOA, a Grover-type mixer is introduced:\n", + "$$\n", + "U_M(\\beta) = e^{-i \\beta |F\\rangle\\langle F|},\n", + "$$\n", + "where $|F\\rangle$ is the equal superposition of all feasible solutions:\n", + "$$\n", + "|F\\rangle = \\frac{1}{\\sqrt{|F|}} \\sum_{x \\in F} |x\\rangle.\n", + "$$\n", + "\n", + "If we define $\\hat{U}_S$ as the unitary that generates $ |F\\rangle $ from the initial state $ |0\\rangle^{\\otimes n} $,\n", + "$$\n", + "\\hat{U}_S |0\\rangle^{\\otimes n} = |F\\rangle,\n", + "$$\n", + "\n", + "then the GM-QAOA circuit of depth $p$ can be expressed as:\n", + "$$\n", + "|\\beta,\\gamma\\rangle = \\hat{U}_M(\\beta_p) \\hat{U}_P(\\gamma_p) \\cdots \\hat{U}_M(\\beta_1) \\hat{U}_P(\\gamma_1) \\hat{U}_S |0\\rangle^{\\otimes n},\n", + "$$\n", + "where\n", + "$$\n", + "\\hat{U}_P(\\gamma) = e^{-i\\gamma \\hat{H}_C}.\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "id": "4", + "metadata": {}, + "source": [ + "## Approach 1: QAOA\n", + "\n", + "First, lets try to implement general QAOA.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "5", + "metadata": {}, + "outputs": [], + "source": [ + "import math\n", + "\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import scipy\n", + "from tqdm import tqdm\n", + "\n", + "from classiq import *\n", + "\n", + "total_qbit = 4\n", + "\n", + "\n", + "# constraint is one hot.\n", + "def constraint(x: QArray[QBit]):\n", + " const = (x[0] + x[1] + x[2] + x[3] - 1) ** 2\n", + " return const\n", + "\n", + "\n", + "def object_func(x: QArray[QBit]):\n", + " obj = 1 * x[0] + 2 * (x[1] + x[2] + x[3]) - 3 * x[2] + 10 * x[3]\n", + " return obj\n", + "\n", + "\n", + "def cost(x: QArray[QBit]):\n", + " return constraint(x) + object_func(x)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "6", + "metadata": {}, + "outputs": [], + "source": [ + "@qfunc\n", + "def cost_layer(gamma: CReal, x: QArray[QBit, total_qbit]):\n", + " phase(cost(x), gamma)\n", + "\n", + "\n", + "@qfunc\n", + "def mixer_layer(beta: CReal, qba: QArray):\n", + " apply_to_all(lambda q: RX(beta, q), qba)\n", + "\n", + "\n", + "@qfunc\n", + "def qaoa_ansatz(\n", + " cost_layer: QCallable[CReal, QArray],\n", + " mixer_layer: QCallable[CReal, QArray],\n", + " gammas: CArray[CReal],\n", + " betas: CArray[CReal],\n", + " qba: QArray,\n", + "):\n", + " repeat(\n", + " betas.len,\n", + " lambda i: [\n", + " cost_layer(gammas[i], qba),\n", + " mixer_layer(betas[i], qba),\n", + " ],\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "7", + "metadata": {}, + "outputs": [], + "source": [ + "NUM_LAYERS = 3\n", + "\n", + "\n", + "@qfunc\n", + "def main(\n", + " params: CArray[CReal, NUM_LAYERS * 2],\n", + " x: Output[QArray[QBit, total_qbit]],\n", + "):\n", + " allocate(x)\n", + " gammas = params[0:NUM_LAYERS]\n", + " betas = params[NUM_LAYERS : 2 * NUM_LAYERS]\n", + " hadamard_transform(x)\n", + " qaoa_ansatz(cost_layer, mixer_layer, gammas, betas, x)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Quantum program link: https://platform.classiq.io/circuit/36pSZXotvPhdq6AXzvZWs6gT57W\n" + ] + } + ], + "source": [ + "qprog_qaoa = synthesize(main)\n", + "show(qprog_qaoa)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "9", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Optimization Progress: 43%|████████████████████████████████████████████████████████████████████████████████▏ | 13/30 [00:47<01:02, 3.69s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Optimized parameters: [0.07722138586645118, 2.650386860119408, 4.239204896332221, 3.1414881279266966, 1.5683921762649655, -0.0477853758768326]\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "data": { + "text/plain": [ + "Text(0.5, 1.0, 'Cost convergence')" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjQAAAHHCAYAAACoZcIpAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjYsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvq6yFwwAAAAlwSFlzAAAPYQAAD2EBqD+naQAAfG9JREFUeJzt3XecU2X2P/DPTTLJ9D7MMDCNKl1FQGygIIiKWFaxrKKsvZfVFXddxVVRVv1hYXXd/a7o2nsvKyqg0kFABakDM3Sm95Lk/v5InptkaspN7r2Zz/v1mpdOJuUhhMnJec5zjiTLsgwiIiIiAzNpvQAiIiKiUDGgISIiIsNjQENERESGx4CGiIiIDI8BDRERERkeAxoiIiIyPAY0REREZHgMaIiIiMjwGNAQERGR4TGgISIiIsNjQEOkczt37sR1112Hfv36ITY2FsnJyTjxxBPx9NNPo7GxUfXHa2howIMPPoglS5aoft9EROFi0XoBRNS5zz77DBdeeCFsNhuuuOIKDB8+HC0tLfjhhx9w991349dff8WLL76o6mM2NDRg7ty5AICJEyeqet9EROHCgIZIp4qLi3HxxRejoKAA3377LXr37q387KabbsKOHTvw2WefabjC6FdfX4+EhAStl0FEfuCWE5FOzZ8/H3V1dfi///s/n2BGGDBgAG677Tble7vdjr/97W/o378/bDYbCgsLcd9996G5udnndmvXrsXUqVORmZmJuLg4FBUVYfbs2QCA3bt3IysrCwAwd+5cSJIESZLw4IMPdrnWqqoq3HHHHSgsLITNZkPfvn1xxRVXoKysTLnO4cOH8Yc//AHZ2dmIjY3FqFGj8PLLL/vcz+7duyFJEp544gm8+OKLyp9lzJgxWLNmjXK9J554ApIkYc+ePe3WMmfOHFitVlRWViqXrVq1CmeccQZSUlIQHx+PCRMm4Mcff/S53YMPPghJkrB582ZceumlSEtLw0knnQQAcDqdePDBB5Gbm4v4+Hiceuqp2Lx5MwoLC3HllVe2ey5uv/125OXlwWazYcCAAXj88cfhdDoD/nMKv/32Gy666CJkZWUhLi4OgwcPxp///Gef6+zbtw+zZ89GdnY2bDYbhg0bhv/85z+d/ZURRR1maIh06pNPPkG/fv1wwgkn+HX9q6++Gi+//DJ+97vf4a677sKqVaswb948bNmyBR988AEAV1AxZcoUZGVl4d5770Vqaip2796N999/HwCQlZWF559/HjfccAPOO+88nH/++QCAkSNHdvq4dXV1OPnkk7FlyxbMnj0bxx57LMrKyvDxxx9j7969yMzMRGNjIyZOnIgdO3bg5ptvRlFREd555x1ceeWVqKqq8gnMAOD1119HbW0trrvuOkiShPnz5+P888/Hrl27EBMTg4suugj33HMP3n77bdx9990+t3377bcxZcoUpKWlAQC+/fZbTJs2DaNHj8YDDzwAk8mEl156Caeddhq+//57jB071uf2F154IQYOHIhHH30UsiwDcAVJ8+fPx/Tp0zF16lRs3LgRU6dORVNTk89tGxoaMGHCBOzbtw/XXXcd8vPzsXz5csyZMwcHDhzAggULAvpzAsCmTZtw8sknIyYmBtdeey0KCwuxc+dOfPLJJ3jkkUcAAIcOHcLxxx8PSZJw8803IysrC1988QX+8Ic/oKamBrfffnuXrx2iqCATke5UV1fLAOQZM2b4df0NGzbIAOSrr77a5/I//vGPMgD522+/lWVZlj/44AMZgLxmzZpO7+vIkSMyAPmBBx7w67H/+te/ygDk999/v93PnE6nLMuyvGDBAhmA/Oqrryo/a2lpkcePHy8nJibKNTU1sizLcnFxsQxAzsjIkCsqKpTrfvTRRzIA+ZNPPlEuGz9+vDx69Gifx1u9erUMQH7llVeUxx84cKA8depUZS2yLMsNDQ1yUVGRfPrppyuXPfDAAzIA+ZJLLvG5z4MHD8oWi0U+99xzfS5/8MEHZQDyrFmzlMv+9re/yQkJCfK2bdt8rnvvvffKZrNZLikpCfjPecopp8hJSUnynj17OnxuZVmW//CHP8i9e/eWy8rKfK5z8cUXyykpKXJDQ4NMFO245USkQzU1NQCApKQkv67/+eefAwDuvPNOn8vvuusuAFBqbVJTUwEAn376KVpbW9VYKt577z2MGjUK5513XrufSZKkrC8nJweXXHKJ8rOYmBjceuutqKurw9KlS31uN3PmTCXDAgAnn3wyAGDXrl0+11m3bh127typXPbWW2/BZrNhxowZAIANGzZg+/btuPTSS1FeXo6ysjKUlZWhvr4ekyZNwrJly3y2ggDg+uuv9/n+m2++gd1ux4033uhz+S233NLuz/vOO+/g5JNPRlpamvJYZWVlmDx5MhwOB5YtWxbQn/PIkSNYtmwZZs+ejfz8fJ/biudWlmW89957mD59OmRZ9nncqVOnorq6GuvXr2+3VqJow4CGSIeSk5MBALW1tX5df8+ePTCZTBgwYIDP5Tk5OUhNTVVqTSZMmIALLrgAc+fORWZmJmbMmIGXXnqpXZ1NIHbu3Inhw4d3u76BAwfCZPL9lTNkyBDl597avnmLN33vupgLL7wQJpMJb731FgDXG/s777yDadOmKc/f9u3bAQCzZs1CVlaWz9e///1vNDc3o7q62uexioqK2q0dQLvnNj093ScYEY/35ZdftnusyZMnA3Bt+QXy5xSBTVfP75EjR1BVVYUXX3yx3eNeddVVHT4uUTRiDQ2RDiUnJyM3Nxe//PJLQLcTn9q7+vm7776LlStX4pNPPsFXX32F2bNn48knn8TKlSuRmJgYyrJVYzabO7xcdte0AEBubi5OPvlkvP3227jvvvuwcuVKlJSU4PHHH1euI7Ivf//733H00Ud3eJ9t/8xxcXFBr9vpdOL000/HPffc0+HPBw0a5PO9P39Ofx4TAH7/+99j1qxZHV6nqxooomjBgIZIp84++2y8+OKLWLFiBcaPH9/ldQsKCuB0OrF9+3Yl6wG4ikWrqqpQUFDgc/3jjz8exx9/PB555BG8/vrruOyyy/Dmm2/i6quv7jYoaqt///7dBl4FBQXYtGkTnE6nT5bmt99+U34ejJkzZ+LGG2/E1q1b8dZbbyE+Ph7Tp0/3WRvgChBFliRQYm07duzwyd6Ul5f7ZIzE49XV1QX9WG3169cPALp8frOyspCUlASHw6Ha4xIZEbeciHTqnnvuQUJCAq6++mocOnSo3c937tyJp59+GgBw5plnAkC7UzRPPfUUAOCss84C4NrKaPvpX2QuxLZTfHw8ANfxY39ccMEF2Lhxo3KSypt4rDPPPBMHDx5UtocA1zHzZ599FomJiZgwYYJfj9XRY5vNZrzxxht45513cPbZZ/v0jRk9ejT69++PJ554AnV1de1uf+TIkW4fY9KkSbBYLHj++ed9Ln/uuefaXfeiiy7CihUr8NVXX7X7WVVVFex2uz9/LEVWVhZOOeUU/Oc//0FJSYnPz8RzazabccEFF+C9997rMPDx589IFA2YoSHSqf79++P111/HzJkzMWTIEJ9OwcuXL1eOPQPAqFGjMGvWLLz44ouoqqrChAkTsHr1arz88ss499xzceqppwIAXn75ZfzjH//Aeeedh/79+6O2thb/+te/kJycrARFcXFxGDp0KN566y0MGjQI6enpGD58eKd1HHfffTfeffddXHjhhZg9ezZGjx6NiooKfPzxx3jhhRcwatQoXHvttfjnP/+JK6+8EuvWrUNhYSHeffdd/Pjjj1iwYIHfxc9t9erVC6eeeiqeeuop1NbWYubMmT4/N5lM+Pe//41p06Zh2LBhuOqqq9CnTx/s27cP3333HZKTk/HJJ590+RjZ2dm47bbb8OSTT+Kcc87BGWecgY0bN+KLL75AZmamT0br7rvvxscff4yzzz4bV155JUaPHo36+nr8/PPPePfdd7F7925kZmYG9Gd85plncNJJJ+HYY4/Ftddei6KiIuzevRufffYZNmzYAAB47LHH8N1332HcuHG45pprMHToUFRUVGD9+vVYvHgxKioqAnpMIkPS7oAVEflj27Zt8jXXXCMXFhbKVqtVTkpKkk888UT52WeflZuampTrtba2ynPnzpWLiorkmJgYOS8vT54zZ47PddavXy9fcsklcn5+vmyz2eRevXrJZ599trx27Vqfx1y+fLk8evRo2Wq1+nWEu7y8XL755pvlPn36yFarVe7bt688a9Ysn2PEhw4dkq+66io5MzNTtlqt8ogRI+SXXnrJ537Ecea///3v7R6js3X861//kgHISUlJcmNjY4fr++mnn+Tzzz9fzsjIkG02m1xQUCBfdNFF8jfffKNcRxzbPnLkSLvb2+12+f7775dzcnLkuLg4+bTTTpO3bNkiZ2RkyNdff73PdWtra+U5c+bIAwYMkK1Wq5yZmSmfcMIJ8hNPPCG3tLQE9ef85Zdf5PPOO09OTU2VY2Nj5cGDB8v333+/z3UOHTok33TTTXJeXp4cExMj5+TkyJMmTZJffPHFDp8TomgjyXIA1WdERATAtYWUlpaGhx9+uF3XXiKKPNbQEBF1o6Op5qJeiQM8ifSBNTRERN146623sGjRIpx55plITEzEDz/8gDfeeANTpkzBiSeeqPXyiAgMaIiIujVy5EhYLBbMnz8fNTU1SqHwww8/rPXSiMiNNTRERERkeKyhISIiIsNjQENERESGF/U1NE6nE/v370dSUlLALd2JiIhIG7Iso7a2Frm5ue0G23Yk6gOa/fv3Iy8vT+tlEBERURBK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+0d6mbowePBgbNiwAdXV1Xj33Xcxa9YsLF26VNXH4JZTgDIzM2E2m9tVYB86dAg5OTkarcp4UlNTMWjQIOzYsUPrpRiGeH3xtRe6fv36ITMzk68/ADfffDM+/fRTfPfdd+jbt69yeU5ODlpaWlBVVeVzfb7eXDp73joybtw4AOjRrzer1YoBAwZg9OjRmDdvHkaNGoWnn35a1dcZA5oAWa1WjB49Gt98841ymdPpxDfffIPx48druDJjqaurw86dO9G7d2+tl2IYRUVFyMnJ8Xnt1dTUYNWqVXztBWjv3r0oLy/v0a8/WZZx880344MPPsC3336LoqIin5+PHj0aMTExPq+3rVu3oqSkpEe/3rp73jqyYcMGAOjRr7e2nE4nmpub1X2dqVu33DO8+eabss1mkxctWiRv3rxZvvbaa+XU1FT54MGDWi9Nt+666y55yZIlcnFxsfzjjz/KkydPljMzM+XDhw9rvTRdqa2tlX/66Sf5p59+kgHITz31lPzTTz/Je/bskWVZlh977DE5NTVV/uijj+RNmzbJM2bMkIuKiuTGxkaNV66trp632tpa+Y9//KO8YsUKubi4WF68eLF87LHHygMHDpSbmpq0XrpmbrjhBjklJUVesmSJfODAAeWroaFBuc71118v5+fny99++628du1aefz48fL48eM1XLX2unveduzYIT/00EPy2rVr5eLiYvmjjz6S+/XrJ59yyikar1w79957r7x06VK5uLhY3rRpk3zvvffKkiTJ//vf/2RZVu91xoAmSM8++6ycn58vW61WeezYsfLKlSu1XpKuzZw5U+7du7dstVrlPn36yDNnzpR37Nih9bJ057vvvpMBtPuaNWuWLMuuo9v333+/nJ2dLdtsNnnSpEny1q1btV20DnT1vDU0NMhTpkyRs7Ky5JiYGLmgoEC+5pprevwHkI6eLwDySy+9pFynsbFRvvHGG+W0tDQ5Pj5ePu+88+QDBw5ot2gd6O55KykpkU855RQ5PT1dttls8oABA+S7775brq6u1nbhGpo9e7ZcUFAgW61WOSsrS540aZISzMiyeq8zSZZlOciMEREREZEusIaGiIiIDI8BDRERERkeAxoiIiIyPAY0REREZHgMaIiIiMjwGNAQERGR4TGgISIiIsNjQENEUaewsBALFizQehlEFEEMaIgoJFdeeSXOPfdcAMDEiRNx++23R+yxFy1ahNTU1HaXr1mzxmfiMRFFP4vWCyAiaqulpQVWqzXo22dlZam4GiIyAmZoiEgVV155JZYuXYqnn34akiRBkiTs3r0bAPDLL79g2rRpSExMRHZ2Ni6//HKUlZUpt504cSJuvvlm3H777cjMzMTUqVMBAE899RRGjBiBhIQE5OXl4cYbb0RdXR0AYMmSJbjqqqtQXV2tPN6DDz4IoP2WU0lJCWbMmIHExEQkJyfjoosuwqFDh5SfP/jggzj66KPx3//+F4WFhUhJScHFF1+M2tpa5TrvvvsuRowYgbi4OGRkZGDy5Mmor68P07NJRIFiQENEqnj66acxfvx4XHPNNThw4AAOHDiAvLw8VFVV4bTTTsMxxxyDtWvX4ssvv8ShQ4dw0UUX+dz+5ZdfhtVqxY8//ogXXngBAGAymfDMM8/g119/xcsvv4xvv/0W99xzDwDghBNOwIIFC5CcnKw83h//+Md263I6nZgxYwYqKiqwdOlSfP3119i1axdmzpzpc72dO3fiww8/xKeffopPP/0US5cuxWOPPQYAOHDgAC655BLMnj0bW7ZswZIlS3D++eeDo/CI9INbTkSkipSUFFitVsTHxyMnJ0e5/LnnnsMxxxyDRx99VLnsP//5D/Ly8rBt2zYMGjQIADBw4EDMnz/f5z6963EKCwvx8MMP4/rrr8c//vEPWK1WpKSkQJIkn8dr65tvvsHPP/+M4uJi5OXlAQBeeeUVDBs2DGvWrMGYMWMAuAKfRYsWISkpCQBw+eWX45tvvsEjjzyCAwcOwG634/zzz0dBQQEAYMSIESE8W0SkNmZoiCisNm7ciO+++w6JiYnK11FHHQXAlRURRo8e3e62ixcvxqRJk9CnTx8kJSXh8ssvR3l5ORoaGvx+/C1btiAvL08JZgBg6NChSE1NxZYtW5TLCgsLlWAGAHr37o3Dhw8DAEaNGoVJkyZhxIgRuPDCC/Gvf/0LlZWV/j8JRBR2DGiIKKzq6uowffp0bNiwwedr+/btOOWUU5TrJSQk+Nxu9+7dOPvsszFy5Ei89957WLduHRYuXAjAVTSstpiYGJ/vJUmC0+kEAJjNZnz99df44osvMHToUDz77LMYPHgwiouLVV8HEQWHAQ0RqcZqtcLhcPhcduyxx+LXX39FYWEhBgwY4PPVNojxtm7dOjidTjz55JM4/vjjMWjQIOzfv7/bx2tryJAhKC0tRWlpqXLZ5s2bUVVVhaFDh/r9Z5MkCSeeeCLmzp2Ln376CVarFR988IHftyei8GJAQ0SqKSwsxKpVq7B7926UlZXB6XTipptuQkVFBS655BKsWbMGO3fuxFdffYWrrrqqy2BkwIABaG1txbPPPotdu3bhv//9r1Is7P14dXV1+Oabb1BWVtbhVtTkyZMxYsQIXHbZZVi/fj1Wr16NK664AhMmTMBxxx3n159r1apVePTRR7F27VqUlJTg/fffx5EjRzBkyJDAniAiChsGNESkmj/+8Y8wm80YOnQosrKyUFJSgtzcXPz4449wOByYMmUKRowYgdtvvx2pqakwmTr/FTRq1Cg89dRTePzxxzF8+HC89tprmDdvns91TjjhBFx//fWYOXMmsrKy2hUVA67MykcffYS0tDSccsopmDx5Mvr164e33nrL7z9XcnIyli1bhjPPPBODBg3CX/7yFzz55JOYNm2a/08OEYWVJPPcIRERERkcMzRERERkeAxoiIiIyPAY0BAREZHhMaAhIiIiw2NAQ0RERIbHgIaIiIgMjwENERERGR4DGiIiIjI8BjRERERkeAxoiIiIyPAY0BAREZHhMaAhIiIiw/v/BhIujQm0HiIAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "NUM_SHOTS = 1000\n", + "MAX_ITERATIONS = 30\n", + "\n", + "# for NUM_LAYERS=3, initial_params = [γ0,γ1,γ2,β0,β1,β2] = [0.0pi, 0.5pi, 1.0pi, 1.0pi, 0.5pi, 0.0pi]\n", + "initial_params = (\n", + " np.concatenate((np.linspace(0, 1, NUM_LAYERS), np.linspace(1, 0, NUM_LAYERS)))\n", + " * math.pi\n", + ")\n", + "\n", + "cost_trace = []\n", + "\n", + "\n", + "def evaluate_params(es, params):\n", + " cost_estimation = es.estimate_cost(\n", + " cost_func=lambda state: cost(state[\"x\"]), parameters={\"params\": params.tolist()}\n", + " )\n", + " cost_trace.append(cost_estimation)\n", + " return cost_estimation\n", + "\n", + "\n", + "es = ExecutionSession(\n", + " qprog_qaoa, execution_preferences=ExecutionPreferences(num_shots=NUM_SHOTS)\n", + ")\n", + "\n", + "with tqdm(total=MAX_ITERATIONS, desc=\"Optimization Progress\", leave=True) as pbar:\n", + "\n", + " def progress_bar(xk: np.ndarray) -> None:\n", + " pbar.update(1) # increment progress bar\n", + "\n", + " final_params = scipy.optimize.minimize(\n", + " fun=lambda params: evaluate_params(es, params),\n", + " x0=initial_params,\n", + " method=\"COBYLA\",\n", + " options={\"maxiter\": MAX_ITERATIONS},\n", + " callback=progress_bar,\n", + " ).x.tolist()\n", + "\n", + "print(f\"Optimized parameters: {final_params}\")\n", + "plt.plot(cost_trace)\n", + "plt.xlabel(\"Iterations\")\n", + "plt.ylabel(\"Cost\")\n", + "plt.title(\"Cost convergence\")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "10", + "metadata": {}, + "outputs": [], + "source": [ + "es = ExecutionSession(\n", + " qprog_qaoa, execution_preferences=ExecutionPreferences(num_shots=1000)\n", + ")\n", + "res_qaoa = es.sample({\"params\": final_params})\n", + "es.close()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "11", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "solution=[1, 0, 1, 0] probability=0.481 cost=1\n", + "solution=[1, 0, 0, 0] probability=0.195 cost=1\n", + "solution=[1, 1, 1, 0] probability=0.084 cost=6\n", + "solution=[1, 1, 1, 1] probability=0.038 cost=23\n", + "solution=[0, 1, 1, 0] probability=0.038 cost=2\n", + "solution=[0, 0, 0, 0] probability=0.037 cost=1\n", + "solution=[0, 0, 1, 1] probability=0.033 cost=12\n", + "solution=[1, 1, 0, 0] probability=0.03 cost=4\n", + "solution=[1, 0, 0, 1] probability=0.027 cost=14\n", + "solution=[0, 1, 0, 1] probability=0.012 cost=15\n", + "solution=[0, 1, 1, 1] probability=0.01 cost=17\n", + "solution=[0, 0, 1, 0] probability=0.008 cost=-1\n", + "solution=[0, 0, 0, 1] probability=0.004 cost=12\n", + "solution=[1, 0, 1, 1] probability=0.002 cost=16\n", + "solution=[1, 1, 0, 1] probability=0.001 cost=19\n" + ] + } + ], + "source": [ + "for sampled in res_qaoa.parsed_counts:\n", + " x = sampled.state[\"x\"]\n", + " print(f\"solution={x} probability={sampled.shots/NUM_SHOTS} cost={cost(x)}\")" + ] + }, + { + "cell_type": "markdown", + "id": "12", + "metadata": {}, + "source": [ + "## Approach 2: GM-QAOA\n", + "\n", + "Next, we use GM-QAOA." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "13", + "metadata": {}, + "outputs": [], + "source": [ + "from classiq import *\n", + "\n", + "total_qbit = 4\n", + "\n", + "\n", + "@qfunc\n", + "def initial_state(x: QArray):\n", + " prepare_dicke_state(1, x[0:4])\n", + "\n", + "\n", + "def object_func(x: QArray[QBit]):\n", + " obj = 1 * x[0] + 2 * (x[1] + x[2] + x[3]) - 3 * x[2] + 10 * x[3]\n", + " return obj\n", + "\n", + "\n", + "def cost(x: QArray[QBit]):\n", + " return object_func(x)" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "14", + "metadata": {}, + "outputs": [], + "source": [ + "@qfunc\n", + "def cost_layer(gamma: CReal, x: QArray[QBit, total_qbit]):\n", + " phase(cost(x), gamma)\n", + "\n", + "\n", + "@qfunc\n", + "def mixer_layer(beta: CReal, x: QArray):\n", + " x_lsbs = QNum(size=x.len - 1)\n", + " x_msb = QBit()\n", + " within_apply(\n", + " lambda: (invert(lambda: initial_state(x)), bind(x, [x_lsbs, x_msb]), X(x_msb)),\n", + " lambda: control(x_lsbs == 0, lambda: RZ(-1.0 / np.pi * beta, x_msb)),\n", + " )\n", + "\n", + "\n", + "@qfunc\n", + "def qaoa_ansatz(\n", + " cost_layer: QCallable[CReal, QArray],\n", + " mixer_layer: QCallable[CReal, QArray],\n", + " gammas: CArray[CReal],\n", + " betas: CArray[CReal],\n", + " qba: QArray,\n", + "):\n", + " repeat(\n", + " betas.len,\n", + " lambda i: [\n", + " cost_layer(gammas[i], qba),\n", + " mixer_layer(betas[i], qba),\n", + " ],\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "15", + "metadata": {}, + "outputs": [], + "source": [ + "NUM_LAYERS = 3\n", + "\n", + "\n", + "@qfunc\n", + "def main(\n", + " params: CArray[CReal, NUM_LAYERS * 2],\n", + " x: Output[QArray[QBit, total_qbit]],\n", + "):\n", + " allocate(x)\n", + " gammas = params[0:NUM_LAYERS]\n", + " betas = params[NUM_LAYERS : 2 * NUM_LAYERS]\n", + " initial_state(x)\n", + " qaoa_ansatz(cost_layer, mixer_layer, gammas, betas, x)" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "16", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Quantum program link: https://platform.classiq.io/circuit/36pUBwqMIRoPnd4vWj9NybeCjVx\n" + ] + } + ], + "source": [ + "write_qmod(main, \"gm_qaoa\", decimal_precision=12, symbolic_only=False)\n", + "qprog_gmqaoa = synthesize(main)\n", + "show(qprog_gmqaoa)" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "17", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Optimization Progress: 47%|██████████████████████████████████████████████████████████████████████████████████████▎ | 14/30 [00:48<00:54, 3.43s/it]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Optimized parameters: [0.6468939042027038, 2.5844830289020435, 3.326417753861256, 3.079151613835938, 1.4868912223570316, -0.326482477312707]\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "data": { + "text/plain": [ + "Text(0.5, 1.0, 'Cost convergence')" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import math\n", + "\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import scipy\n", + "from tqdm import tqdm\n", + "\n", + "NUM_SHOTS = 1000\n", + "MAX_ITERATIONS = 30\n", + "\n", + "# start with a linear scheduling guess\n", + "initial_params = (\n", + " np.concatenate((np.linspace(0, 1, NUM_LAYERS), np.linspace(1, 0, NUM_LAYERS)))\n", + " * math.pi\n", + ")\n", + "\n", + "cost_trace = []\n", + "\n", + "\n", + "def evaluate_params(es, params):\n", + " cost_estimation = es.estimate_cost(\n", + " cost_func=lambda state: cost(state[\"x\"]), parameters={\"params\": params.tolist()}\n", + " )\n", + " cost_trace.append(cost_estimation)\n", + " return cost_estimation\n", + "\n", + "\n", + "es = ExecutionSession(\n", + " qprog_gmqaoa, execution_preferences=ExecutionPreferences(num_shots=NUM_SHOTS)\n", + ")\n", + "\n", + "with tqdm(total=MAX_ITERATIONS, desc=\"Optimization Progress\", leave=True) as pbar:\n", + "\n", + " def progress_bar(xk: np.ndarray) -> None:\n", + " pbar.update(1) # increment progress bar\n", + "\n", + " final_params = scipy.optimize.minimize(\n", + " fun=lambda params: evaluate_params(es, params),\n", + " x0=initial_params,\n", + " method=\"COBYLA\",\n", + " options={\"maxiter\": MAX_ITERATIONS},\n", + " callback=progress_bar,\n", + " ).x.tolist()\n", + "\n", + "print(f\"Optimized parameters: {final_params}\")\n", + "plt.plot(cost_trace)\n", + "plt.xlabel(\"Iterations\")\n", + "plt.ylabel(\"Cost\")\n", + "plt.title(\"Cost convergence\")" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "18", + "metadata": {}, + "outputs": [], + "source": [ + "es = ExecutionSession(\n", + " qprog_gmqaoa, execution_preferences=ExecutionPreferences(num_shots=1000)\n", + ")\n", + "res_gmqaoa = es.sample({\"params\": final_params})\n", + "es.close()" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "19", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "solution=[0, 0, 1, 0] probability=0.399 cost=-1\n", + "solution=[1, 0, 0, 0] probability=0.25 cost=1\n", + "solution=[0, 0, 0, 1] probability=0.179 cost=12\n", + "solution=[0, 1, 0, 0] probability=0.172 cost=2\n" + ] + } + ], + "source": [ + "for sampled in res_gmqaoa.parsed_counts:\n", + " x = sampled.state[\"x\"]\n", + " print(f\"solution={x} probability={sampled.shots/NUM_SHOTS} cost={cost(x)}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "20", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 49, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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y61jnfbGG2+oa9eu6tu3ryQpMjJSnTt3VnZ2dgNG4B0oOgAAAIAX6Natm2w2m3bu3Oly/c6dO9W2bVuFhIQoMzNThw4dUvPmzeXn5yc/Pz99+OGHWrZsmex2u2O7uo5ls9nUrVs3SaduW9u+fbvjWH5+ftqxY8cZxclMKDoAAACAF2jTpo2GDBmil156ScePH3daV1xcrNdff1133HGHfvnlF7333ntauXKlCgoKHK+tW7fq8OHDWrNmjXx8fDRmzBitWLFCxcXFTsc6fvy4XnrpJcXHx6t169b66quv9OWXX2r9+vVOx1u/fr3y8vK0a9euxvwynDcUHQAAAMBLLFiwQFVVVYqPj9eGDRtUVFSk1atXa8iQIerevbtSUlL02muvqU2bNhozZoz69OnjePXt21fDhg1zTCLw9NNPKzw8XEOGDNFHH32koqIibdiwQfHx8Tpx4oTjuTuZmZmKiYnRoEGDnI43aNAg9e/f37STElB0AAAAAC9x+eWX64svvlCXLl00ZswYde7cWUOHDlX37t312WefqUWLFsrKytItt9wim812xv6jR4/W+++/r9LSUrVp00abNm3Sddddp7vvvltdu3bVmDFj1LVrV8d7VFdXa/ny5Ro9erTLPKNHj9arr76qEydOXOihn3c2o76fUPKg8vJyBQcHq6ysTC1btvR0HAAAUE88MBSe8Ouvv2rPnj267LLLnB6gaVapqamaN2+e1q5dqwEDBng6TqOo6xzWtxv4XeiQAAAAABruscceU0REhDZt2qSYmBj5+HBTVn1QdAAAAAAvl5iY6OkIpkMdBAAAAGA5FB0AAAAAlkPRAQAAAGA5FB0AAAAAlkPRAQAAAGA5FB0AAAAAlkPRAQAAAGA5FB0AAAAAlsMDQwEAANA0zAlu5Pcra9BuxcXFSktL06pVq/Tjjz8qODhY3bp108SJE5WQkKCgoCBFRETohx9+0BtvvKFx48Y57X/FFVdox44dWrJkie644w7H8o0bN+rJJ59UXl6ejh8/rssvv1yJiYmaMWOGfH19z8hx991365VXXtHKlSv13//932es3759ux577DF9/PHHKi8vV+fOnTVu3DglJycrKCjojO3j4+O1bt06bdq0Sf3792/Q18YdXNEBAAAAvMT333+vfv36ac2aNXr66ae1detW5eXladasWfrggw+0bt06x7ad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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import pandas as pd\n", + "\n", + "df_qaoa = res_qaoa.dataframe\n", + "df_gmqaoa = res_gmqaoa.dataframe\n", + "\n", + "df_qaoa[\"x\"] = df_qaoa[\"x\"].apply(\n", + " lambda v: \"\".join(map(str, v)) if isinstance(v, list) else v\n", + ")\n", + "df_gmqaoa[\"x\"] = df_gmqaoa[\"x\"].apply(\n", + " lambda v: \"\".join(map(str, v)) if isinstance(v, list) else v\n", + ")\n", + "\n", + "df_qaoa = df_qaoa.rename(columns={\"probability\": \"QAOA\"})\n", + "df_gmqaoa = df_gmqaoa.rename(columns={\"probability\": \"GMQAOA\"})\n", + "df = pd.merge(df_qaoa, df_gmqaoa, on=\"x\", how=\"outer\").fillna(0)\n", + "df = df[[\"x\", \"QAOA\", \"GMQAOA\"]]\n", + "df.set_index(\"x\").plot.bar(figsize=(10, 4))" + ] + }, + { + "cell_type": "markdown", + "id": "21", + "metadata": {}, + "source": [ + "When $ x = 0010 $, the minimum value becomes $ f = -1 $, and GM-QAOA exhibits a stronger amplification effect compared to QAOA.\n" + ] + }, + { + "cell_type": "markdown", + "id": "22", + "metadata": {}, + "source": [ + "## Reference\n", + "[1]: [A. Bärtschi, S. Eidenbenz. \"Grover Mixers for QAOA: Shifting Complexity from Mixer Design to State Preparation\" \tarXiv:2006.00354 (2020).](https://arxiv.org/abs/2006.00354)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.11.4" + } + }, + "nbformat": 4, + "nbformat_minor": 9 +} diff --git a/algorithms/qaoa/grover_mixer_qaoa/gm_qaoa.metadata.json b/algorithms/qaoa/grover_mixer_qaoa/gm_qaoa.metadata.json new file mode 100644 index 000000000..491fae6bb --- /dev/null +++ b/algorithms/qaoa/grover_mixer_qaoa/gm_qaoa.metadata.json @@ -0,0 +1,7 @@ +{ + "friendly_name": "Grover Mixer QAOA", + "description": "Solving Optimization problem using the QAOA algorithm with a Grover Mixer Variant", + "problem_domain_tags": ["optimization"], + "qmod_type": ["algorithms"], + "level": ["demos"] +} diff --git a/algorithms/qaoa/grover_mixer_qaoa/gm_qaoa.qmod b/algorithms/qaoa/grover_mixer_qaoa/gm_qaoa.qmod new file mode 100644 index 000000000..ba40acdf3 --- /dev/null +++ b/algorithms/qaoa/grover_mixer_qaoa/gm_qaoa.qmod @@ -0,0 +1,91 @@ +qperm apply_to_all_expanded___0(target: qbit[1]) { + repeat (index: 1) { + X(target[index]); + } +} + +qfunc _dicke_split_cycle_shift_expanded___0(qvar: qbit[4]) { + within { + CX(qvar[1], qvar[0]); + } apply { + control (qvar[0]) { + RY(2.094395102393, qvar[1]); + } + } +} + +qfunc _dicke_split_cycle_shift_expanded___1(qvar: qbit[3]) { + within { + CX(qvar[1], qvar[0]); + } apply { + control (qvar[0]) { + RY(1.910633236249, qvar[1]); + } + } +} + +qfunc _dicke_split_cycle_shift_expanded___2(qvar: qbit[2]) { + within { + CX(qvar[1], qvar[0]); + } apply { + control (qvar[0]) { + RY(1.570796326795, qvar[1]); + } + } +} + +qfunc prepare_dicke_state_unary_input_expanded___0(qvar: qbit[2]) { + _dicke_split_cycle_shift_expanded___2(qvar); +} + +qfunc prepare_dicke_state_unary_input_expanded___1(qvar: qbit[3]) { + _dicke_split_cycle_shift_expanded___1(qvar); + prepare_dicke_state_unary_input_expanded___0(qvar[1:3]); +} + +qfunc prepare_dicke_state_unary_input_expanded___2(qvar: qbit[4]) { + _dicke_split_cycle_shift_expanded___0(qvar); + prepare_dicke_state_unary_input_expanded___1(qvar[1:4]); +} + +qfunc prepare_dicke_state_expanded___0(qvar: qbit[4]) { + apply_to_all_expanded___0(qvar[0:1]); + prepare_dicke_state_unary_input_expanded___2(qvar); +} + +qfunc initial_state_expanded___0(x: qbit[4]) { + prepare_dicke_state_expanded___0(x[0:4]); +} + +qfunc cost_layer_expanded___0(gamma: real, x: qbit[4]) { + phase (((x[0] + (2 * x[1])) - x[2]) + (12 * x[3]), gamma); +} + +qfunc mixer_layer_expanded___0(beta: real, x: qbit[4]) { + x_lsbs: qnum<3, False, 0>; + x_msb: qbit; + within { + invert { + initial_state_expanded___0(x); + } + x -> {x_lsbs, x_msb}; + X(x_msb); + } apply { + control (x_lsbs == 0) { + RZ((-0.318309886184) * beta, x_msb); + } + } +} + +qfunc qaoa_ansatz_expanded___0(gammas: real[3], betas: real[3], qba: qbit[4]) { + repeat (i: 3) { + cost_layer_expanded___0(gammas[i], qba); + mixer_layer_expanded___0(betas[i], qba); + } +} + +qfunc main(params: real[6], output x: qbit[4]) { + allocate(4, x); + initial_state_expanded___0(x); + qaoa_ansatz_expanded___0(params[0:3], params[3:6], x); +} diff --git a/algorithms/qaoa/grover_mixer_qaoa/gm_qaoa.synthesis_options.json b/algorithms/qaoa/grover_mixer_qaoa/gm_qaoa.synthesis_options.json new file mode 100644 index 000000000..d4d6192c9 --- /dev/null +++ b/algorithms/qaoa/grover_mixer_qaoa/gm_qaoa.synthesis_options.json @@ -0,0 +1,44 @@ +{ + "constraints": { + "max_gate_count": {}, + "optimization_parameter": "no_opt" + }, + "preferences": { + "custom_hardware_settings": { + "basis_gates": [ + "h", + "rx", + "u", + "s", + "cx", + "sx", + "rz", + "cy", + "t", + "y", + "sdg", + "p", + "id", + "tdg", + "u2", + "z", + "r", + "u1", + "sxdg", + "cz", + "ry", + "x" + ], + "is_symmetric_connectivity": true + }, + "debug_mode": true, + "machine_precision": 8, + "optimization_level": 1, + "output_format": ["qasm"], + "pretty_qasm": true, + "random_seed": 3858854528, + "synthesize_all_separately": false, + "timeout_seconds": 300, + "transpilation_option": "auto optimize" + } +} diff --git a/applications/optimization/adaptive_qaoa_lib.ipynb b/applications/optimization/adaptive_qaoa_lib.ipynb index 6b6272642..ae41772b5 100644 --- a/applications/optimization/adaptive_qaoa_lib.ipynb +++ b/applications/optimization/adaptive_qaoa_lib.ipynb @@ -1316,7 +1316,7 @@ ], "metadata": { "kernelspec": { - "display_name": "adaptiveqaoa", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -1330,7 +1330,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.12" + "version": "3.11.4" } }, "nbformat": 4, diff --git a/tests/notebooks/test_gm_qaoa.py b/tests/notebooks/test_gm_qaoa.py new file mode 100644 index 000000000..a22547571 --- /dev/null +++ b/tests/notebooks/test_gm_qaoa.py @@ -0,0 +1,20 @@ +from tests.utils_for_testbook import ( + validate_quantum_program_size, + validate_quantum_model, + wrap_testbook, +) +from testbook.client import TestbookNotebookClient + + +@wrap_testbook("gm_qaoa", timeout_seconds=300) +def test_notebook(tb: TestbookNotebookClient) -> None: + # test quantum programs + validate_quantum_program_size( + tb.ref_pydantic("qprog_gmqaoa"), + expected_width=None, + expected_depth=None, + expected_cx_count=None, + ) + + # test notebook content + pass # Todo