{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Molecular docking via DC-QAOA\n", "\n", "The data of the clique graph for the molecular docking are taken from this [paper](https://arxiv.org/pdf/2308.04098)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import cudaq\n", "from cudaq import spin\n", "import numpy as np\n", "\n", "# GPU: Default If an NVIDIA GPU and CUDA runtime libraries are available\n", "#cudaq.set_target('nvidia')\n", "\n", "# CPU\n", "cudaq.set_target('qpp-cpu')\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Edges: [[0, 1], [0, 2], [0, 4], [0, 5], [1, 2], [1, 3], [1, 5], [2, 3], [2, 4], [3, 4], [3, 5], [4, 5]]\n", "Non-Edges: [[0, 3], [1, 4], [2, 5]]\n" ] } ], "source": [ "# The two graphs input from the paper\n", "\n", "# BIG 1\n", "\n", "nodes = [0,1,2,3,4,5]\n", "qubit_num=len(nodes)\n", "edges = [[0,1],[0,2],[0,4],[0,5],[1,2],[1,3],[1,5],[2,3],[2,4],[3,4],[3,5],[4,5]]\n", "non_edges = [[u,v] for u in nodes for v in nodes if u cudaq.SpinOperator:\n", " \n", " spin_ham = 0.0\n", " for wt,node in zip(weights,nodes):\n", " #print(wt,node)\n", " spin_ham += 0.5 * wt * spin.z(node)\n", " spin_ham -= 0.5 * wt * spin.i(node)\n", " \n", " for non_edge in non_edges:\n", " u,v=(non_edge[0],non_edge[1])\n", " #print(u,v)\n", " spin_ham += penalty/4.0 * (spin.z(u)*spin.z(v)-spin.z(u)-spin.z(v)+spin.i(u)*spin.i(v))\n", " \n", " return spin_ham " ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# Collect coefficients from a spin operator so we can pass them to a kernel\n", "def term_coefficients(ham: cudaq.SpinOperator) -> list[complex]:\n", " result = []\n", " ham.for_each_term(lambda term: result.append(term.get_coefficient()))\n", " return result\n", "\n", " # Collect Pauli words from a spin operator so we can pass them to a kernel\n", "def term_words(ham: cudaq.SpinOperator) -> list[str]:\n", " result = []\n", " ham.for_each_term(lambda term: result.append(term.to_string(False)))\n", " return result\n", " " ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "@cudaq.kernel\n", "def dc_qaoa(qubit_num:int, num_layers:int,thetas:list[float],\\\n", " coef:list[complex], words:list[cudaq.pauli_word]):\n", " \n", " qubits=cudaq.qvector(qubit_num)\n", " \n", " h(qubits)\n", " \n", " count=0\n", " for p in range(num_layers):\n", " \n", " for i in range(len(coef)):\n", " exp_pauli(thetas[count]*coef[i].real,qubits,words[i])\n", " count+=1\n", " \n", " for j in range(qubit_num):\n", " rx(thetas[count],qubits[j])\n", " count+=1 \n", " \n", " for k in range(qubit_num):\n", " ry(thetas[count],qubits[k])\n", " count+=1" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1.5+0j] IIZIIZ\n", "[1.5+0j] ZIIZII\n", "[-1.1657+0j] IZIIII\n", "[1.5+0j] IZIIZI\n", "[-1.42735+0j] IIIZII\n", "[3.2791499999999996+0j] IIIIII\n", "[-1.1657+0j] IIZIII\n", "[-1.42735+0j] IIIIIZ\n", "[-1.1657+0j] ZIIIII\n", "[-1.42735+0j] IIIIZI\n", "\n", "[(1.5+0j), (1.5+0j), (-1.1657+0j), (1.5+0j), (-1.42735+0j), (3.2791499999999996+0j), (-1.1657+0j), (-1.42735+0j), (-1.1657+0j), (-1.42735+0j)]\n", "['IIZIIZ', 'ZIIZII', 'IZIIII', 'IZIIZI', 'IIIZII', 'IIIIII', 'IIZIII', 'IIIIIZ', 'ZIIIII', 'IIIIZI']\n" ] } ], "source": [ "ham= ham_clique(penalty,nodes,weights,non_edges)\n", "print(ham)\n", "\n", "coef=term_coefficients(ham)\n", "words=term_words(ham)\n", "\n", "print(term_coefficients(ham))\n", "print(term_words(ham))" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Total number of parameters: 66\n", "Initial parameters = [0.21810696323572243, -0.20613464375211488, 0.2546877639814583, 0.3657985647468064, 0.37118004688049144, -0.03656087558321203, 0.08564174998504231, 0.21639801853794682, 0.11122286088634259, 0.1743727097033635, -0.36518146001762486, -0.15829741539542244, -0.3467434780387345, 0.28043500852894776, -0.09986021299050934, 0.14125225086023052, -0.19141728018199775, -0.11970943368650361, -0.3853063093646483, -0.1112643868789806, 0.3527177454825464, -0.22156160012057186, -0.1418496891385843, 0.32811766468303116, -0.367642000671186, -0.34158180583996006, 0.10196745745501312, 0.29359239180502594, -0.3858537615546677, 0.19366130907065582, 0.24570488114056754, -0.3332307385378807, 0.12287973244618389, 0.007274514934614895, -0.015799547372526146, 0.3578070967202224, -0.39268963055535144, -0.19872246354138554, 0.16668715544467982, -0.13777293592446055, -0.17514665212709513, 0.15350249947988204, 0.32872977428061945, -0.20068831419712105, -0.032919322131134854, -0.19399909325771983, -0.09477141125241506, 0.08210460401106645, 0.21392577760158515, -0.3393568044538389, 0.14615087942938465, 0.03790339186006314, -0.2843250892879255, -0.3151384847055956, -0.19983741137121905, -0.27348611567665115, 0.33457528180906904, 0.14145414847455462, -0.20604220093940323, 0.05410235084309195, 0.04447870918600966, -0.3355714098595045, 0.266806440171265, -0.07436189654442632, -0.2789176729721685, -0.2427508182662484]\n" ] } ], "source": [ "# Optimizer\n", "\n", "# Specify the optimizer and its initial parameters.\n", "optimizer = cudaq.optimizers.NelderMead()\n", "#optimizer = cudaq.optimizers.COBYLA()\n", "\n", "np.random.seed(13)\n", "cudaq.set_random_seed(13)\n", "\n", "# if dc_qaoa used\n", "parameter_count=(2*qubit_num+len(coef))*num_layers\n", "\n", "# if qaoa used\n", "# parameter_count=(qubit_num+len(coef))*num_layers\n", "\n", "print('Total number of parameters: ', parameter_count)\n", "optimizer.initial_parameters = np.random.uniform(-np.pi/8 , np.pi/8 ,parameter_count)\n", "print(\"Initial parameters = \", optimizer.initial_parameters)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "optimal_expectation = -2.0057970170760537\n", "optimal_parameters = [2.0617900450255213, -0.008832997414504553, 0.5446745231437978, 0.9170743966952536, 0.5684145055308018, 0.45653992738579674, 0.48765328828009236, 0.08690545932812363, 0.4396413285058074, 0.18459993158979182, -1.309747594917737, 1.2588385005776594, -0.834255663515425, 0.674712608431175, -0.40174553656823186, 0.1936475123928361, 0.11292461472367524, -0.40520422214477836, 0.5249647407525035, -0.8276837818165452, 0.2945660883282474, -0.8060498989662159, 0.08051672267342141, 0.016438756265571293, 1.5245041151262497, 1.4087477995498743, 0.24688680789607903, 2.1121838066265077, 1.1445970943333728, -0.22281558391261153, 0.29034932090910637, -1.0492037973620043, 0.2734013684834806, 0.5265417924961102, 0.5099056677967553, 0.8636684922225737, -0.6164906874232119, -0.42851259141848624, 0.09675272347583658, 0.05697275350531247, -0.7102412317670379, -0.11174687408874051, 0.32505750242276577, -0.4397450017834574, -0.023604090020531092, 2.072436348972407, -0.38357054930488194, 0.13613334013073858, -0.10505045798768743, 2.0359359294549595, -0.24377425227508304, 0.10609870738840588, -0.2073332743736556, 0.07232539343493427, -0.6190529241716675, -0.03799182564866846, 0.17548654124993912, 0.5257077568577536, -0.23376653076971432, 0.3391308272563698, 0.4193139961661264, 0.02390444901420668, 0.2521154835623746, 1.1843328649807838, -0.6609672889772077, -0.2612231428844001]\n" ] } ], "source": [ "cost_values=[]\n", "def objective(parameters):\n", "\n", " cost=cudaq.observe(dc_qaoa, ham, qubit_num, num_layers, parameters,coef,words).expectation()\n", " cost_values.append(cost)\n", " return cost\n", "\n", "# Optimize!\n", "optimal_expectation, optimal_parameters = optimizer.optimize(\n", " dimensions=parameter_count, function=objective)\n", "\n", "print('optimal_expectation =', optimal_expectation)\n", "print('optimal_parameters =', optimal_parameters)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{ 111000:200000 }\n", "\n", "The MVWCP is given by the partition: 111000\n", "The MVWCP is given by the partition: 111000\n" ] } ], "source": [ "shots=200000\n", "\n", "counts = cudaq.sample(dc_qaoa, qubit_num, num_layers, optimal_parameters,coef,words, shots_count=shots)\n", "print(counts)\n", "\n", "print('The MVWCP is given by the partition: ', max(counts, key=lambda x: counts[x]))\n", "\n", "# Alternative\n", "print('The MVWCP is given by the partition: ', counts.most_probable())" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "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17/+VZGRkUpISCg3c1GnTh01b97ca1mzZs20f/9+SRf25Up/H2rXrq2srCyv9efOndOxY8f8mi+7jRkzxnP0qFWrVho0aJB+//vfe44ulqe5sArlfl9uTGmcl/PF6Mcff9TSpUs9R42k8jMfX331lbKyspScnOz5t/THH3/U448/rvr160sqXXNBOSqBqKgotW/fXsuWLfMsc7vdWrZsmTp16mRjspIxxmjEiBGaP3++li9frgYNGnitb9++vSpUqOC137t379b+/fs9+92pUydt27bN6w/6+X8Uzv+C7dSpk9c2zo8pTXPXvXt3bdu2TWlpaZ5Hhw4dNHDgQM/P5WUuunTpctEtHb799ltdddVVkqQGDRqodu3aXvuRk5Ojb775xmsuTpw4odTUVM+Y5cuXy+12q2PHjp4xq1evVkFBgWfM0qVL1aRJE1WtWjVo++eP06dPy+n0/uczIiJCbrdbUvmaC6tQ7nc4/J2RLhSj7777Tl9++aWqV6/utb68zMegQYO0detWr39LExMTNWbMGC1ZskRSKZsLn0/dxiXNmTPHuFwuM3v2bLNjxw7z8MMPmypVqnhdmRRuhg0bZuLj483KlSvNoUOHPI/Tp097xgwdOtQkJyeb5cuXm40bN5pOnTqZTp06edafv3y9Z8+eJi0tzSxevNjUrFnzkpevjxkzxuzcudNMnz691F2+finWq9WMKT9zsX79ehMZGWmmTJlivvvuO/Pee++ZmJgY889//tMzZtq0aaZKlSrm008/NVu3bjV33HHHJS/jbtu2rfnmm2/M119/bRo3bux1qe6JEydMQkKCGTRokElPTzdz5swxMTExpepS/pSUFFO3bl3Ppfzz5s0zNWrUME888YRnTFmdi5MnT5rNmzebzZs3G0nmpZdeMps3b/ZcfRWq/V6zZo2JjIw0L774otm5c6eZNGmSLZfyX2k+8vPzza9//WtTr149k5aW5vXvqfVqq7IyH0X92filX16tZkzpmQvKUQC89tprJjk52URFRZnrr7/erFu3zu5IJSLpko933nnHM+bMmTPmd7/7nalataqJiYkxd955pzl06JDXdn744QfTu3dvEx0dbWrUqGEef/xxU1BQ4DVmxYoV5tprrzVRUVGmYcOGXu9RWv2yHJWnufj8889Ny5YtjcvlMk2bNjVvvfWW13q3220mTJhgEhISjMvlMt27dze7d+/2GvPTTz+Z++67z1SuXNnExcWZBx980Jw8edJrzJYtW8yNN95oXC6XqVu3rpk2bVrQ980fOTk5ZuTIkSY5OdlUrFjRNGzY0IwbN87rF15ZnYsVK1Zc8t+HlJQUY0xo9/ujjz4y11xzjYmKijItWrQwCxYsCNp+X86V5mPfvn2X/fd0xYoVnm2Ulfko6s/GL12qHJWWuXAYY7mlKwAAQDnHOUcAAAAWlCMAAAALyhEAAIAF5QgAAMCCcgQAAGBBOQIAALCgHAEAAFhQjgAAACwoRwDKFYfDoU8++cTuGABKMcoRgJAZPHiwHA7HRY/bbrvN7mgA4BFpdwAA5cttt92md955x2uZy+WyKQ0AXIwjRwBCyuVyqXbt2l6PqlWrSvr5I68ZM2aod+/eio6OVsOGDfXxxx97vX7btm3q1q2boqOjVb16dT388MPKzc31GjNr1iy1aNFCLpdLderU0YgRI7zWHz16VHfeeadiYmLUuHFjffbZZ551x48f18CBA1WzZk1FR0ercePGF5U5AGUb5QhAqTJhwgTdfffd2rJliwYOHKh7771XO3fulCSdOnVKvXr1UtWqVbVhwwbNnTtXX375pVf5mTFjhoYPH66HH35Y27Zt02effaZGjRp5vcfkyZN1zz33aOvWrerTp48GDhyoY8eOed5/x44dWrRokXbu3KkZM2aoRo0aoZsAAPYzABAiKSkpJiIiwlSqVMnrMWXKFGOMMZLM0KFDvV7TsWNHM2zYMGOMMW+99ZapWrWqyc3N9axfsGCBcTqdJjMz0xhjTGJiohk3btxlM0gy48eP9zzPzc01ksyiRYuMMcb069fPPPjgg4HZYQBhiXOOAIRU165dNWPGDK9l1apV8/zcqVMnr3WdOnVSWlqaJGnnzp1q06aNKlWq5FnfpUsXud1u7d69Ww6HQwcPHlT37t2vmKF169aenytVqqS4uDhlZWVJkoYNG6a7775bmzZtUs+ePdW/f3917ty5WPsKIDxRjgCEVKVKlS76mCtQoqOjfRpXoUIFr+cOh0Nut1uS1Lt3b/34449auHChli5dqu7du2v48OF68cUXA54XQOnEOUcASpV169Zd9LxZs2aSpGbNmmnLli06deqUZ/2aNWvkdDrVpEkTxcbGqn79+lq2bFmJMtSsWVMpKSn65z//qVdeeUVvvfVWibYHILxw5AhASOXl5SkzM9NrWWRkpOek57lz56pDhw668cYb9d5772n9+vV6++23JUkDBw7UpEmTlJKSoqefflpHjhzRo48+qkGDBikhIUGS9PTTT2vo0KGqVauWevfurZMnT2rNmjV69NFHfco3ceJEtW/fXi1atFBeXp6++OILTzkDUD5QjgCE1OLFi1WnTh2vZU2aNNGuXbsk/Xwl2Zw5c/S73/1OderU0QcffKDmzZtLkmJiYrRkyRKNHDlS1113nWJiYnT33XfrpZde8mwrJSVFZ8+e1csvv6w//OEPqlGjhv7nf/7H53xRUVEaO3asfvjhB0VHR+tXv/qV5syZE4A9BxAuHMYYY3cIAJB+Pvdn/vz56t+/v91RAJRjnHMEAABgQTkCAACw4JwjAKUGn/IDKA04cgQAAGBBOQIAALCgHAEAAFhQjgAAACwoRwAAABaUIwAAAAvKEQAAgAXlCAAAwOL/ASxEkL8STAhjAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "x_values = list(range(len(cost_values)))\n", "y_values = cost_values\n", "\n", "plt.plot(x_values, y_values)\n", "\n", "plt.xlabel(\"Epochs\")\n", "plt.ylabel(\"Cost Value\")\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" } }, "nbformat": 4, "nbformat_minor": 2 }