diff --git a/docs/circuit_cutting/tutorials/01_gate_cutting_to_reduce_circuit_width.ipynb b/docs/circuit_cutting/tutorials/01_gate_cutting_to_reduce_circuit_width.ipynb deleted file mode 100644 index ff85dd277..000000000 --- a/docs/circuit_cutting/tutorials/01_gate_cutting_to_reduce_circuit_width.ipynb +++ /dev/null @@ -1,428 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "ad1f14b4", - "metadata": {}, - "source": [ - "## Gate Cutting to Reduce Circuit Width\n", - "\n", - "In this tutorial we will simulate expectation values of a four-qubit circuit using only two-qubit experiments by cutting gates in the circuit.\n", - "\n", - "Like any circuit knitting technique, gate cutting can be described as three consecutive steps:\n", - "\n", - "- **cut** some non-local gates in the circuit and possibly separate the circuit into subcircuits\n", - "- **execute** many sampled subexperiments using the Qiskit Sampler primitive\n", - "- **reconstruct** the expectation value of the full-sized circuit" - ] - }, - { - "cell_type": "markdown", - "id": "510910a6", - "metadata": {}, - "source": [ - "### Create a circuit to cut" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "96f5b72a", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAApQAAAD2CAYAAABobBdEAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA4X0lEQVR4nO3de3wU9dn//9duTgRIwjnhrCABkShElINAEYsUQRQVod71VFsPKLcIxa+t3kqtP6v267cVRUpRQa1K+2hF1AqC4eBdRQUMEAQV5JQA4RQSkpCQhOzvjymBQEJ2M7uZmQ/v5+ORh8lkdva63M81uZjDZ3yBQCCAiIiIiEg9+Z0OQERERES8TQ2liIiIiNiihlJEREREbFFDKSIiIiK2qKEUEREREVvUUIqIiIiILWooRURERMQWNZQiIiIiYosaShERERGxRQ2liIiIiNiihlJEREREbFFDKSIiIiK2qKEUEREREVvUUIqIiIiILWooRURERMQWNZQiIiIiYosaShERERGxRQ2liIiIiNiihlJEREREbFFDKSIiIiK2qKEUEREREVvUUIqIiIiILWooRURERMQWNZQiIiIiYosaShERERGxRQ2liIiIiNiihlJEREREbFFDKSIiIiK2qKEUEREREVvUUIqIiIiILWooRURERMQWNZQiIiIiYku00wGYZt0CKMl3OgqIbwa9x9rbhltygfDkYxLTPhu35KNxZja3jDNQ3Yh51FCGWUk+FB9yOorwMCkX05j22ZiWj7iTaePMtHzE23TKW0RERERsUUMpIiIiIraooRQRERERW9RQioiIiIgtuinHIc/Nv4Ola18HwO/z0yKxLb27DuOua35Pq6T2DkcXOtPyMYlJn41JuYi7mTTWTMpF3EtHKB2Udv5g/vY/e3nr0V38+pa32bonk9+9Oc7psOrNtHxMYtJnY1Iu4m4mjTWTchF3UkPpoOioWFokptAqqT0XdxnCqH53s2nnKopLjzgdWr2Ylo9JTPpsTMpF3M2ksWZSLuJOaihd4mDBHj7N+gd+fxR+f5TT4dhmWj4mMemzMSkXcTeTxppJuYh76BpKB63ftoJrH21KIFDJsfISAG4aMpX42CYAPPnGTVyaejWj+t8NwNbdmTz99i38eXImsTGNHIu7NnXl8++sBby59LfVXrNr/yYmjnmBawfe1+DxnktMGmsa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", - "text/plain": [ - "
" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from qiskit.circuit.library import EfficientSU2\n", - "\n", - "qc = EfficientSU2(4, entanglement=\"linear\", reps=2).decompose()\n", - "qc.assign_parameters([0.4] * len(qc.parameters), inplace=True)\n", - "\n", - "qc.draw(\"mpl\", scale=0.8)" - ] - }, - { - "cell_type": "markdown", - "id": "8638fdf1", - "metadata": {}, - "source": [ - "### Specify some observables\n", - "\n", - "Currently, only `Pauli` observables with phase equal to 1 are supported. Full support for `SparsePauliOp` is expected in CKT v0.5.0." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "f75e8dd1", - "metadata": {}, - "outputs": [], - "source": [ - "from qiskit.quantum_info import PauliList\n", - "\n", - "observables = PauliList([\"ZZII\", \"IZZI\", \"IIZZ\", \"XIXI\", \"ZIZZ\", \"IXIX\"])" - ] - }, - { - "cell_type": "markdown", - "id": "162a5629", - "metadata": {}, - "source": [ - "### Separate the circuit and observables according to a specified qubit partitioning\n", - "\n", - "Each label in `partition_labels` corresponds to the `circuit` qubit in the same index. Qubits sharing a common partition label will be grouped together, and non-local gates spanning more than one partition will be cut." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "30326299", - "metadata": {}, - "outputs": [], - "source": [ - "from circuit_knitting.cutting import partition_problem\n", - "\n", - "partitioned_problem = partition_problem(\n", - " circuit=qc, partition_labels=\"AABB\", observables=observables\n", - ")\n", - "subcircuits = partitioned_problem.subcircuits\n", - "subobservables = partitioned_problem.subobservables\n", - "bases = partitioned_problem.bases" - ] - }, - { - "cell_type": "markdown", - "id": "9d2d42c3", - "metadata": {}, - "source": [ - "### Visualize the decomposed problem" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "6b54be63", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'A': PauliList(['II', 'ZI', 'ZZ', 'XI', 'ZZ', 'IX']),\n", - " 'B': PauliList(['ZZ', 'IZ', 'II', 'XI', 'ZI', 'IX'])}" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "subobservables" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "b7e06fac", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAtMAAACPCAYAAAA4J1eUAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAkGElEQVR4nO3de3QU9f3/8Wc2F5KQEC5BAgEVQQzFWIzchYBWsXjDRCF+gSqtSMtNwRzqV6VHikrV6q8QiIrUotKWVGtRS0XRFLAiRdBAuYkFBBJIuAiBXCGX/f2xXxZDbruT3ezM5PU4h0MyOzv7fk/m8973zszOBDmdTiciIiIiIuI1R6ADEBERERGxKjXTIiIiIiIGqZkWERERETFIzbSIiIiIiEFqpkVEREREDFIzLSIiIiJikJppERERERGD1EyLiIiIiBikZlpERERExCA10yIiIiIiBqmZFhERERExSM20iIiIiIhBaqZFRERERAxSMy0iIiIiYpCaaRERERERg9RMi4iIiIgYpGZaRERERMQgNdMiIiIiIgapmRYRERERMUjNtIiIiIiIQWqmRUREREQMUjMtIiIiImKQmmkREREREYPUTIuIiIiIGKRmWkRERETEIDXTIiIiIiIGqZkWERERETFIzbSIiIiIiEFqpkVEREREDFIzLSIiIiJikJppERERERGD1EyLiIiIiBgUEugAWrKtK6GsMNBRQERb6JvStGWYJRfwTT7iPW0D3tM6E7sxyzZtpe1Z68z61EwHUFkhlHwX6Ch8w065iDHaBryndSZ2o23ae1pn1qfTPEREREREDFIzLSIiIiJikJppERERERGD1EyLiIiIiBikLyBawPNZE/n4yzcAcAQ5aN+mM3173MgDt/6G2Jj4AEfnPbvlI97TNuA9rTOxE23P3tM6My/tmbaIxO7D+Muv8vnTE4d4bNyf2Xskh6eWjwl0WIbZLR/xnrYB72mdiZ1oe/ae1pk5qZm2iJDgMNq3iSM2Jp5rrkjmtoGT2XVwIyXlZwIdmiF2y0e8p23Ae1pnYifanr2ndWZOaqYt6MTpI3y6/a84HME4HMGBDqfJ7JaPeE/bgPe0zsROtD17T+vMPGx/znR1dTULFy5kyZIlHDhwgI4dOzJ27FjmzZtH69atAx2ex7btX8cdT0ThdFZztqIMgHuS04kIc+Uw7817uK7XSG4bNBmAvYdzmP/ncbwyM4ew0PCAxV2fxvL5bPtKln/86xrPOXRsF1PvXMgdQ6Y0e7zie3bbppuDxo3YiWqA91QDzMn2zfSsWbPIyMggJSWF9PR0du/eTUZGBjk5OXzyySc4HNbYOZ/QbSC/vPcNzlWWs37bW+T89xN++uOn3Y9PHb2QWZlDGZqYSnREexb+bQrT71ps2oLTWD5DE1MYmnjhvqYbdrzLH1Y/zs397g9EuF5xOuHoGSgqh/BQiG8LFtnMmpXdtunmYOdxYzflFZBfCNXVEBsNMZGBjsh8VAO8pxpgTrZupnfu3MmiRYtITU3lnXfecU/v3r07Dz30EFlZWYwbNy6AEXquVWgE8bE9AegedzX53+1j8bszeGTMUgBiY+K5O/kRXl01m4RLB9I1thdJV/4okCE3qLF8vu94YR6LVk5j/gOrCQ8z7zuS0wmbv4V1u+FI4YXp7SLh+l4wIgFCdCTOzW7bdHOw47ixm1MlsGYHbPkWKqpc04KAPl3h5j5wWWxAwzMV1QDvqQaYk2X3l23bto3Ro0cTExNDmzZtuOuuu8jPzyc6Opp7770XgBUrVuB0Opk5c2aN5z744INERkbyxz/+MQCR+8ZPbp7LR1uWsSd3i3vanUOmcfDoTv6y9ll+fseLAYzOe3XlA67TdJ5dMYF7b/hfruhyTYCia5zTCSu/hD9vrNlIA5wqhVVbYel6qKwKRHTWYLdtujlYfdzYzbEz8P8+hI17LzTSAE5gRx5kfOz6X+qmGuA91QBzsGQznZ2dzaBBg9izZw9z5sxh/vz55OXlMWrUKIqLi+nbty8AmzdvxuFwMGDAgBrPDw8Pp2/fvmzevDkA0ftG145XMrj3HSz78An3NIfDwe2DfsGAhFtpG9UxgNF5r658AP6U/TSR4W24a+iMAEXmmc3fwqd7Gp5nT76rqZa62W2bbg5WHzd2Ul0Nv1/vOr2rPlXV8Ppnrr3XUptqgPdUA8zBcs308ePHSUtLIykpiZycHGbPns306dPJzs7m0KFDAO5m+siRI8TGxtKqVatay4mPj+fEiROcO3euOcP3qTEjZvPlN2vYtm+de1pQkIOgIMv9WYHa+ez4dgMffvEas8cuC2xgjXA6Ye1uz+b9fC+crfBvPFZmt226OVh13NjN1/muPdONqaxy7bmWuqkGeE81IPAsd870c889x6lTp1i2bBkRERHu6TExMSQlJZGdne1upktLS+tspMG1d/r8PGFhYT6JrbKykoKCAo/nr6joBIQ2Ot8v7329zul9Lh/Cx791evx69cdRQV7e0SYuw7NcwLN8issKeS7rJ8xOe502rTt4GUvT8/HGiZIQ8gvjPJr3XCX8a/t3JFxS5ueomp+vt4GmxdK824BRLXnc2M2/drcHPDkv1cm//1vFNR08f6+wEju9rzUXX64z1YCmiYuLIyTE+9bYcs10VlYWw4YNo1evXnU+3qlTJ+LiXI1NZGQkx44dq3O+8vJy9zznVVZWkp6ezvLly6murubuu+8mMzPT3Xg3pqCggG7dunmcy9L0HVwe18fj+f3lm2++YfjPr27SMnydy983vszJM/m8/P6sGtNH9rufu5Nn1fMsF1/k44343sO554l1Hs8/+/F5bP0ow38BBYhZtmdo/m3AqJY8buzmrkc/4tKrb/JgD2oQ350569V7hZWYpQ5YaXv25TpTDWia3Nxcunbt6vXzLNVMFxQUcPjwYdLS0mo9Vl1dzfbt27n22mvd07p06cKuXbs4e/ZsrT3Uhw8fJjY2tsZe6fnz57N27Vq2b99OWFgYd955J7/85S/JyLBO43NL/4nc0n9ioMNosv+58TH+58bHAh2GRyrKirya/1yZ7lTlDbts083BSuPGblx1IKjR+ZxOJ+e8rBktnWqA51QDAsNSzXRJietbG0FBtQvWe++9x7Fjx9yneAD079+fNWvW8MUXXzBs2DD39PLycrZu3UpycnKNZfz+97/n+eefJz4+HoC5c+cyZswYfve73xEc3Pg1zeLi4sjNzfU4n/0fdOKcCfqqXr16eRV3XcySC/gmH29UO2HppkqKzgbT2JupI8jJ35Y9Q+uwp5onuGbUkrcBo7TO7GNnQSSr9zTeTAcFBTGkdxRP2nRdm2WbttL2rHVmHufPbPCWpZrpbt26ERwczPr162tMP3jwIDNmuL6x+v1mOi0tjfnz57NgwYIazfTSpUspLS1l/Pjx7mmFhYXk5ubWeH5SUhJFRUUcOHCAHj16NBpfSEiIV4cHckPBDF9/DA0NNXRY4/vMkgv4Jh9vDT/j2ZU6+l4axFVXdPF7PIHQ0rcBI7TO7KNTZ1j/LZR68Ae95doourSL8n9QAWCWbdpK27PWmfVZqpkOCwvjvvvuY9myZYwePZrbbruN3Nxcli5dSqdOnTh8+HCNZjgxMZFp06axePFiUlNTufXWW913QBw+fHiNG7YUFbkOu7Vt29Y97fzP5x8Tqc+IBPimwPWvPrHRkNqv+WISkeYTGgwTh8GSta5L4NXnzmuhS7vmi0tE/M9y15rJyMhg8uTJbNq0ifT0dDZt2sTKlSvp0qULkZGRtb6YuGDBAl544QV27tzJtGnTyMrKYsaMGaxatarGrcSjo6MBOH36tHtaYWFhjcdE6hMSDJNHwPAECLvoI6ojCJIug5kjIarl3gVXxPZ6xcH0m+CyOi6i0L41jBsMN/6g+eMSEf+y1J5pgKioKJYsWcKSJUtqTN+xYweJiYk1GmSA4OBg0tPTSU9Pb3C5bdu2pVu3bmzdupWrrroKgJycHKKjo7n88st9moPYU0gwpFwHo66BL/bD3/7vhlSzfgzd2gc2NhFpHt07usb8riPw6lrXtAlDIOly1wdrEbEfy+2ZrkthYSF5eXk1TvEwYtKkSfzmN7/hyJEjHD9+nLlz5zJx4kSPvnzYHD7Y9HseXjyEmZlD+TZ/e53zpL88ggXv/KKZIzPGbvmcFx4K13zvqlfR2htdJ7v+/f1N680aurS98HPPTmqk66Pt2XtaZ+Zji2Z6+3bXxtTUZvrxxx8nOTmZPn360LNnT3r37s1zzz3ngwib7kzpSVZtfJkXp6wnfcxrvPTew7Xm+feuVUS2ssYpKXbLR7yjv78xWm9iJ9qevad1Zk5qpr8nJCSEjIwMTp06xenTp3nttddq3GUxkPYc+oJreowgJDiUbpdcxemSE1RXX/iWS3V1Ne9/nsmdQ6YFMErP2S0f8Y7+/sZovYmdaHv2ntaZOdmimZ46dSpOp5NBgwYFOhS/KSo7SXTEha+AR7SKpqT8wpcl13z5BkMTUwkLtcY5BXbLR7yjv78xWm9iJ9qevad1Zk62aKZbgqiIdhSXFbp/LztbROvwGADOVZTzz6/+xC39fhqg6Lxnt3zEO/r7G6P1Jnai7dl7WmfmZLmrebRUCZcO5M01T1JVVUnBqQPEtI51X7kk/+S3FJcXMucPt1NUdpKTRQV8vOVNbu53X4Cjrp/d8hHv6O9vjNab2Im2Z+9pnZmTmmmLaBPZnlEDJvHIy8kEBTmYkZLJ5q8/pKjsJDdeO46XHnZdh23bvnWs3Zpl+sFjt3zEO/r7G6P1Jnai7dl7WmfmFOR0Op2BDqKl2rgMSr4LdBTQugMMbuJRIbPkAr7Jp6kKS2HuStfPc1OgbWRg42kO2ga8p3VmXy2xBoB5tmkrbc9aZ9anc6ZFRERERAxSMy0iIiIiYpDOmQ6giLaBjsDFF3GYJRcwVywtiZnWu5liaYiZ4jRTLGJdZtmOzBKHJ8wSq1nisCI10wHUNyXQEfiOnXIRY7QNeE/rTOxG27T3tM6sT6d5iIiIiIgYpGZaRERERMQgNdMiIiIiIgapmRYRERERMUjNtIiIiIiIQWqmRUREREQMUjMtIiIiImKQmmkREREREYPUTIuIiIiIGKRmWkRERETEIDXTIiIiIiIGqZkWERERETFIzbSIiIiIiEFqpkXEL2666SYmTpwY6DBqKCoq4sEHH6RDhw60bt2aUaNGsW/fvkCHJWJbZqwDM2fOZODAgURGRhISEhLocMQG1EyLSIvxk5/8hOzsbP7617/y2Wef4XQ6ufnmmykrKwt0aCLSTKqqqhg3bhxTp04NdChiE/pIFkBbV0JZYaCjgIi20DelacswSy7gm3zEJTMzk8zMTPbt20dMTAzDhg3jnXfe4fLLL2fSpEnMmTPHPe+kSZPYu3cv69atY+LEiWRnZwPwxhtvALB27VpGjBjR4OtVVlbyzDPP8Oabb5KXl0dsbCypqaksWrSIzz//nOHDh/PWW2+RkpLiXubIkSNZtWoVt9xyS4PL/uabb3jvvff46KOPuOGGGwBYsWIFcXFx/OUvfwnI3jO7jRuz5KMa4Ft2qgMAixYtAuD11183sDZ8z07jxiy5QPPWATXTAVRWCCXfBToK37BTLuLy5JNP8uKLL/Lss88ycuRIiouLWb16tUfPXbhwIfv376dz584sXLgQgPbt2zf6vAceeIDVq1fz4osvMmTIEI4fP87GjRsBGDJkCHPnzuWBBx7guuuuIyIiggkTJjBr1iyP3kA3bNhAaGgoP/rRj9zT2rVrx4ABA/jss88C0kzbbdzYLR+xXx0wIzuNGzvl4g010yJSS0lJCc8//zxPPfUU06dPd09PSkry6PkxMTGEhYURERFBXFycR8/Zu3cvb775Jm+//Tb33HMPAD169GDQoEHueR577DHWrl3L+PHjiY6OJj4+nmeeecaj5efn5xMbG0twcHCN6XFxceTn53u0DJGWxI51QMQf1EyLSC07d+6kvLyckSNHNttrfvXVVwANvqbD4WD58uX07t2byspK/vOf/xAaGtpcIYq0KKoDIp7RFxBFxGsOhwOn01ljWkVFRbO89tatWykpKaG8vJzc3FyPn9e5c2dOnDhBVVVVjelHjx6lc+fOvg5TxPasWAdE/EHNtIiPFJfD1oPw9xxY8e8L01f/B77YD98VBy42b/3gBz8gPDycNWvW1Pn4JZdcwpEjR2pMy8nJqfF7WFhYrca1IecPHdf3mgAFBQXcf//9PPHEE0yfPp0JEyZw8uRJj5Z//fXXU1FRwT//+U/3tMLCQjZt2sTQoUM9jlOkPk4nHDwBn+6Bd7+8MP3tL+DjHbAnHyo9HxIBZ8c6IOIPOs1DpIkOfQfrv4ath6Cquvbjm/a5/gEkdIbkq+AH8c0bo7eioqJIT09n7ty5REREuC8f98EHH/DYY49x00038dJLL5GSksJll13GK6+8wsGDB2t8uah79+6sXbvWfQWAmJiYBg/F9uzZk/HjxzN16lTKy8sZPHgwJ0+e5PPPP+fhhx/G6XRy3333kZCQwK9+9Suqqqr49NNP+dnPfsa7777baE69evVi9OjRTJkyhddee42YmBgef/xx4uPjSUtL88Vqkxaqogo27oXPvoFjZ2o/vvOw6x9AVDgM7uGqA9ERzRunt+xYB8B1XnZxcTGHDh0CXHu5z792VFSU4fUlLZeaaQt4PmsiH3/puqyQI8hB+zad6dvjRh649TfExpi8K6uDXfI5VwkfbHM10s7GZwfg63zXvx9eCvf0h+hwv4bYJE899RQdO3YkIyODWbNm0a5dO5KTkwF49NFHOXjwIGlpaYSGhjJ16lTGjBnD3r173c9PT09n+/bt/PCHP6SkpMSjS2ItW7aMefPmMWfOHI4cOcIll1zi/hLS888/z5YtW9i2bRvBwcEEBweTlZXFddddR2ZmJtOmTWs0p+XLl/PII4+QkpJCeXk5ycnJrFmzhogIk3c12GfcgL1yOXAC/ryx7ia6LsXl8PFO2PBfuLsfJF0OQUF+DbFJ7FgHJk2axPr1692/X3vttYBnl+0LJDuNG7BXPkHOi094kmazcZlnl5B5PmsiBSf3M2fCW1Q7qzjy3T4WrZxGZKtoFk7/vMlxtO4Ag3/atGV4mgtYI5/GnC6DV/4J+YXGlxEVDr+4Abo2fqUosSm7jRs71TRPbPgG/rrFdXqHUYN6wNgB4NBJly2WncaN3WqapzR8LSIkOIz2beKIjYnnmiuSuW3gZHYd3EhJuYe7Q0zGyvkUlUPmJw030o4giIlw/XPUs9epuBxeyoYjp/wSptiQlcfNxayey4Zv4O3N9TfSntQAgH/vgxWboFq7tcQDVh83F7NLPi3iNI/q6moWLlzIkiVLOHDgAB07dmTs2LHMmzeP1q1bBzo8r504fYRPt/8VhyMYhyO48SeYnJXycTrhT583fkg3Ohx+ner6+cm/ufZk16X0HPzhU5h9G7Sy+WicNWsWr776ar2Pf/nll5w7d45XX32VyZMnExYW1uDyEhISavzep08fDh48WOe8EyZM4JVXXvE+aBOz0rhpjNVyOXDCtUe6IZ7WAIDN++HS9jDsKt/FaEZff/01S5YsabAObNy40XANgJZVB6w2bhpj5Xxs/vbtMmvWLDIyMkhJSSE9PZ3du3eTkZFBTk4On3zyCQ4LHF/btn8ddzwRhdNZzdkKV1W+JzmdiDDXh4F5b97Ddb1GctugyQDsPZzD/D+P45WZOYSFmu/E3Mby+Wz7SpZ//Osazzl0bBdT71zIHUOmNHu8523a5zrn2ZdOFMM/tkJqP98u12zS0tL48Y9/3OA8586dIzMzk4kTJzb6RnqxDz74oN7LcrVp08arZZmVneqAVWtARRWs2Ni0Uzvq8vcc6N0FYqN9u1yzaawONKUGgP3rgJ1qAFi3DlzM9s30zp07WbRoEampqbzzzjvu6d27d+ehhx4iKyuLcePGBTBCzyR0G8gv732Dc5XlrN/2Fjn//YSf/vhp9+NTRy9kVuZQhiamEh3RnoV/m8L0uxabcvBA4/kMTUxhaGKK+/cNO97lD6sf5+Z+9wciXMB1SatVW/2z7H/tgeEJ0MHGXyRv27Ytbdu29dvyL7vsMr8t2yzsVAesWAPA9YH6qB+OQJ+rgg//AxOu9/2yzaSxOlBc3LRriNq9DtipBoB168DFzL9LtgHbtm1j9OjRxMTE0KZNG+666y7y8/OJjo7m3nvvBWDFihU4nU5mzpxZ47kPPvggkZGR/PGPfwxA5N5rFRpBfGxPusddzcRb5hHXvjuL353hfjw2Jp67kx/h1VWz+cemV+ka24ukK38UwIgb1lg+33e8MI9FK6fxxPgswsMimznSC7YdguKz/lm2E/j8v/5ZttiHneqAFWuA0+m6/J2/5BxyfZdCpD52qgFgzTpQF8s209nZ2QwaNIg9e/YwZ84c5s+fT15eHqNGjaK4uJi+ffsCsHnzZhwOBwMGDKjx/PDwcPr27cvmzZsDEH3T/eTmuXy0ZRl7ci+cuHfnkGkcPLqTv6x9lp/f8WIAo/NeXfmA63z3Z1dM4N4b/pcrulwToOhcvvjWv8vfvN/3h46tJiQkhLvvvpuQENsfNPMJO9UBK9SAvJNQcNp/y6+qhq/qPt23xVAN8I6dagBYow7UxZLN9PHjx0lLSyMpKYmcnBxmz57N9OnTyc7Odl+E/XwzfeTIEWJjY2nVqlWt5cTHx3PixAnOnTvXnOH7RNeOVzK49x0s+/AJ9zSHw8Htg37BgIRbaRvVMYDRea+ufAD+lP00keFtuGto3Z9Um4vT6bo5iz+dKYfCUv++htmFh4fz9NNPEx5uzkOSZmOnOmD2GgBw0M81AODQCf+/hpmpBnjHTjUArFEH6mLJj37PPfccp06dYtmyZTVuthATE0NSUhLZ2dnuZrq0tLTORhpwD9bS0lJDX3S4WGVlJQUFBR7PX1HRCaj/TlCNGTNiNjMzr2fbvnX8sMcIAIKCHAQFefcZqaKigry8o4bjcC2jablA7Xx2fLuBD794jZdnfuVlLE3P52KFZcGUnetcY5ojqP6brrSJqPvn7ysqr305rK3/PcGVsfY8zltSUtLoPOXl5fz2t79l9uzZjb6Z5uXl+Sq0gPHHuAHr1gEz1wCAPbntgAtXgGpqDYDadWD/Mf/EbgaqAXVTL1BTIOtAXFycoaMilrxpS9euXenZsyfr1q2r9dhNN93Ejh073E1tYmIix44d4+jR2it07NixvP3225w9e9bdTL/11ltkZGSwdetWYmNjOXDggMdx5eXl0a1bN4/nX5q+g8vj+ng8vyc+2vw63+RtYUbKYo+fc6BgJw++eHWTXtfXuRSXFTJlQRLpY16jb88bvHquL/K5WFzPQaTN3VhjWkzEhUtfGVHX5bKyX5vMjrVLjS/UxGbNmtXoPGfPnuWll15i6tSp9X4IPu93v/udr0ILGH/UALBHHTBbDQC445H3uSLpDvfvTa0BULsOlBWd4NUp1tqb6CnVgLqpF6hfc9eB3Nxcunbt6tVzwIJ7pgsKCjh8+DBpaWm1Hquurmb79u3uW4MCdOnShV27dnH27NlaA/Pw4cPExsbW2Cvdrl07pk+fztGjR20zUK3o7xtf5uSZfF5+v2bxHdnvfu5Obrwg+1pQM93v19s9CSJ2ZbYaAM1TB1QDRC4wYx2oi+X2TO/bt4+ePXuSnp7OCy+8UOOxlStXkpqayqOPPsqzzz4LwJw5c3jmmWf49NNPGTZsmHve8vJyOnToQHJyMqtXr671Ou+++y4zZ870as+0t6d57P+gE+fONO1wiC+EtangilubdmjHLLmAb/K52ImSEF7fEldjWmOHeNNHuX5+cTWcqeOGDXWd5nF77+9IuKSBuztYWF1Hhy5WXFzMiBEjWLduHVFRDV8nsFOnTr4KLWDsNm7Mko8/agDAP3a3Y/cxz0/zaKwGQO06EBNeyYMDPX8fsRLVgLrZadyYJRcwlo/R0zwst2e6W7duBAcHs379+hrTDx48yIwZrhPTz58vDa4LxM+fP58FCxbUaKaXLl1KaWkp48eP91lsISEhXh0eyA0FM3z1MTQ01NBhje8zSy7gm3wu1rkaQnNcN2w4r9rZ8F3NzjtT5tl8AIk9O9DJ+vcVqJMn148NDQ1l2rRptGvXrtHvMfj6bxwIdhs3ZsnHHzUA4MozsPvYhd/9UQMu6+jd+4iVqAbUzU7jxiy5gP/qQF0s10yHhYVx3333sWzZMkaPHs1tt91Gbm4uS5cupVOnThw+fLhGM52YmMi0adNYvHgxqamp3Hrrre47IA4fPtwSN2yRwAt2QHw7122E/aVVCHS0+d3PGhMWFsb06dMDHYZInbp1aIbXaO//1zAz1QCxIkuenJWRkcHkyZPZtGkT6enpbNq0iZUrV9KlSxciIyPp1atXjfkXLFjACy+8wM6dO5k2bRpZWVnMmDGDVatWWeJW4mIO1/r5xlrXXuY6bNySlZaWMmnSJEpLW/g1AsWUrujo+tKhP/W19w38GqUaIFZkuT3TAFFRUSxZsoQlS5bUmL5jxw4SExNrNcjBwcGkp6eTnp7enGGKzfS/Av6x1XXbX3+4vlfj89hddXU1GzZsoLq6OtChiNQS7IDBPeHD7f5ZfkJnHZ1SDRArss1u2cLCQvLy8mqc4mFEVVUV5eXlVFRU4HQ6KS8v5+xZP91D2ksfbPo9Dy8ewszMoXybX3c1T395BAve+UUzR2aM1fKJDIMRvf2z7Ku76vCueMZq46YhVsxlaC+IaviKbYYEAbck+n65Yj9WHDcNsUM+tmmmt293/QGa2kwvX76ciIgIxo4dy6FDh4iIiOCqq67yQYRNc6b0JKs2vsyLU9aTPuY1Xnrv4Vrz/HvXKiJbWWO3hlXzGXk1dI7x7TIjw2DMgMbnE7HquKmLVXOJCod7/DBeR/SG7va8vLT4kFXHTX3sko+a6YtMnDgRp9NZ4583l8fzlz2HvuCaHiMICQ6l2yVXcbrkRI3DYNXV1bz/eSZ3DpkWwCg9Z9V8QoLhvqEQ0cgNM4vKXTdjePJvrp/r4wiC8YP9fx6mVYSFhTFv3jyf3JHUjqw6bupi5Vz6XuraQ90QT2sAQPdYGHWN7+KzMtWAhll53NTFLvnYppmeOnUqTqeTQYMGBToUvygqO0l0RDv37xGtoikpP+3+fc2XbzA0MZWw0IZvv2oWVs6nc1uYcqNrj3J9zl8y63RZ7WtJnxfscDXmfexxdSefCAsLY8yYMXojrYeVx83FrJ5Laj/X+dP18aQGgGtv9IM3QJglv8Hke6oBDbP6uLmYXfKxTTNtd1ER7SguK3T/Xna2iNbhrvMNzlWU88+v/sQt/X4aoOi8Z/V8Lu3guiHDlQbvGdCpDTx0s2sPl1xQUlLC7bffTklJSaBDMSWrj5vvs3oujiAYOwDSBroua+mtIOCG3o1/MG9pVAMaZvVxczG75KPPwhaRcOlA3lzzJFVVlRScOkBM61j3VUvyT35LcXkhc/5wO0VlJzlZVMDHW97k5n73BTjq+tkhnw5RMOVH8MU+WLsbjp5p/DkxEa6rdtzQG0KD/R+j1TidTvbt24fFbszabOwwbs6zQy5BQa690wmdYfV/IOdgzRs71fkcIKGL6/sXOke6NtWAhtlh3HyfXfJRM20RbSLbM2rAJB55OZmgIAczUjLZ/PWHFJWd5MZrx/HSw1sA2LZvHWu3ZplyY/s+u+TjCIJBPWFgD9h7DPbkQ+5JOHra9aYa4nA13d06QI9LoE+86/QOESPsMm7AXrm0aw3jBsPoJNh6EA5+B3knXedKO52u71jEt4Ou7V1Ho2LN/V0qMTE7jRuwTz5BTn38C5iNy6Dku0BHAa07wOAmHkUxSy7gm3zE977++utG5ykuLqZ///5s3ryZqKioBudNSEjwVWgBY7dxY5Z8VAPMSTWgbnYaN2bJBZq3DmgfmYiYRnh4OEuXLiU83NxfNhER/1ANECvSaR4iYhohISEMHTo00GGISICoBogVac+0iJhGcXEx/fr1o7i4ONChiEgAqAaIFWnPdABFtA10BC6+iMMsuYC5YhHvtaRLYplpW7VTHTBLHGJMS6oBYJ7t1U41AJo3FjXTAdQ3JdAR+I6dchFpLnYbN3bLR6Q52Gnc2CkXb+g0DxERERERg9RMi4hpRERE8P777xMRERHoUEQkAFQDxIrUTIuIaTgcDjp37uy+A5aItCyqAWJF2lpFxDRKSkro379/i/sCkoi4qAaIFamZFhERERExSM20iIiIiIhBaqZFRERERAwKcjqdzkAHISIC4HQ6KSoqIjo6mqCgoECHIyLNTDVArEjNtIiIiIiIQTrNQ0RERETEIDXTIiIiIiIGqZkWERERETFIzbSIiIiIiEFqpkVEREREDFIzLSIiIiJikJppERERERGD1EyLiIiIiBikZlpERERExCA10yIiIiIiBqmZFhERERExSM20iIiIiIhBaqZFRERERAz6/zgJlAU96AuwAAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "subcircuits[\"A\"].draw(\"mpl\", scale=0.8)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "11e45e83", - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "subcircuits[\"B\"].draw(\"mpl\", scale=0.8)" - ] - }, - { - "cell_type": "markdown", - "id": "4f8017b6-2954-4b51-8a07-f4de49832509", - "metadata": { - "editable": true, - "raw_mimetype": "", - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "source": [ - "### Calculate the sampling overhead for the chosen cuts\n", - "\n", - "Here we cut two CNOT gates, resulting in a sampling overhead of $9^2$.\n", - "\n", - "For more on the sampling overhead incurred by circuit cutting, refer to the [explanatory material](../explanation/index.rst)." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "3d606ef8", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Sampling overhead: 81.0\n" - ] - } - ], - "source": [ - "import numpy as np\n", - "\n", - "print(f\"Sampling overhead: {np.prod([basis.overhead for basis in bases])}\")" - ] - }, - { - "cell_type": "markdown", - "id": "ef3b061c-cd1d-4931-85f6-155e00b355be", - "metadata": {}, - "source": [ - "### Generate the subexperiments to run on the backend\n", - "\n", - "`generate_cutting_experiments` accepts `circuits`/`observables` args as dictionaries mapping qubit partition labels to the respective `subcircuit`/`subobservables`.\n", - "\n", - "To simulate the expectation value of the full-sized circuit, many subexperiments are generated from the decomposed gates' joint quasiprobability distribution and then executed on one or more backends. The number of samples taken from the distribution is controlled by `num_samples`, and one combined coefficient is given for each unique sample. For more information on how the coefficients are calculated, refer to the [explanatory material](../explanation/index.rst)." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "2029d18e-0e91-4160-b8c9-02cb9e1ba3cb", - "metadata": {}, - "outputs": [], - "source": [ - "from circuit_knitting.cutting import generate_cutting_experiments\n", - "\n", - "subexperiments, coefficients = generate_cutting_experiments(\n", - " circuits=subcircuits, observables=subobservables, num_samples=np.inf\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "d8870454-2173-4454-90b4-a034779510e0", - "metadata": {}, - "source": [ - "### Run the subexperiments using the Qiskit Sampler primitive" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "7430eef1", - "metadata": {}, - "outputs": [], - "source": [ - "from qiskit_aer.primitives import Sampler\n", - "\n", - "# Set up a Qiskit Aer Sampler primitive for each circuit partition\n", - "samplers = {\n", - " label: Sampler(run_options={\"shots\": 2**12}) for label in subexperiments.keys()\n", - "}\n", - "\n", - "# Retrieve results from each partition's subexperiments\n", - "results = {\n", - " label: sampler.run(subexperiments[label]).result()\n", - " for label, sampler in samplers.items()\n", - "}" - ] - }, - { - "cell_type": "markdown", - "id": "68eb0522-8c01-4f56-aacc-0bfc60159896", - "metadata": {}, - "source": [ - "To use the Qiskit Runtime Sampler, replace the code above with this commented block." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "3c9a7e78-4bf9-4dbd-a8f9-3db185591d9c", - "metadata": {}, - "outputs": [], - "source": [ - "# from qiskit_ibm_runtime import Session, Options, Sampler\n", - "#\n", - "# with Session(backend=\"ibmq_qasm_simulator\") as session:\n", - "# # Set up Qiskit Runtime Sampler primitives.\n", - "# samplers = {\n", - "# label: Sampler(Options(execution={\"shots\": 2**12})) for label in subexperiments.keys()\n", - "# }\n", - "#\n", - "# # Retrieve results from each subexperiment\n", - "# results = {\n", - "# label: sampler.run(subexperiments[label]).result()\n", - "# for label, sampler in samplers.items()\n", - "# }\n", - "#\n", - "# session.close()" - ] - }, - { - "cell_type": "markdown", - "id": "f0032570", - "metadata": {}, - "source": [ - "### Reconstruct the expectation values\n", - "\n", - "Use the subexperiment results, subobservables, and sampling coefficients to reconstruct the expectation value of the original circuit.\n", - "\n", - "Include the number of bits used for cutting measurements in the results metadata. This will be automated in a future release, but users must specify it manually for now." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "7d57339c", - "metadata": {}, - "outputs": [], - "source": [ - "from circuit_knitting.cutting import reconstruct_expectation_values\n", - "\n", - "for label, circuits in subexperiments.items():\n", - " for i, circuit in enumerate(circuits):\n", - " results[label].metadata[i][\"num_qpd_bits\"] = len(circuit.cregs[0])\n", - "\n", - "reconstructed_expvals = reconstruct_expectation_values(\n", - " results,\n", - " coefficients,\n", - " subobservables,\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "53beaca3", - "metadata": {}, - "source": [ - "### Compare the reconstructed expectation values with the exact expectation values from the original circuit" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "e3385ba5", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Reconstructed expectation values: [0.37551016, 0.52859873, 0.58741736, 0.12230408, 0.29614246, -0.1243059]\n", - "Exact expectation values: [0.36916216, 0.52511814, 0.59161991, 0.10927476, 0.28001606, -0.12940509]\n", - "Errors in estimation: [0.00634799, 0.00348059, -0.00420255, 0.01302933, 0.01612639, 0.00509918]\n", - "Relative errors in estimation: [0.01719568, 0.0066282, -0.00710346, 0.11923456, 0.05759096, -0.0394048]\n" - ] - } - ], - "source": [ - "from qiskit_aer.primitives import Estimator\n", - "\n", - "estimator = Estimator(run_options={\"shots\": None}, approximation=True)\n", - "exact_expvals = (\n", - " estimator.run([qc] * len(observables), list(observables)).result().values\n", - ")\n", - "print(\n", - " f\"Reconstructed expectation values: {[np.round(reconstructed_expvals[i], 8) for i in range(len(exact_expvals))]}\"\n", - ")\n", - "print(\n", - " f\"Exact expectation values: {[np.round(exact_expvals[i], 8) for i in range(len(exact_expvals))]}\"\n", - ")\n", - "print(\n", - " f\"Errors in estimation: {[np.round(reconstructed_expvals[i]-exact_expvals[i], 8) for i in range(len(exact_expvals))]}\"\n", - ")\n", - "print(\n", - " f\"Relative errors in estimation: {[np.round((reconstructed_expvals[i]-exact_expvals[i]) / exact_expvals[i], 8) for i in range(len(exact_expvals))]}\"\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "1faa748e", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "

Version Information

SoftwareVersion
qiskit0.44.1
qiskit-terra0.25.1
qiskit_aer0.12.1
qiskit_ibm_provider0.6.3
System information
Python version3.8.16
Python compilerClang 14.0.6
Python builddefault, Mar 1 2023 21:19:10
OSDarwin
CPUs8
Memory (Gb)32.0
Mon Sep 11 16:23:04 2023 CDT
" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import qiskit.tools.jupyter # noqa: F401\n", - "\n", - "%qiskit_version_table" - ] - } - ], - "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.8.16" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/test/cutting/test_cutting_roundtrip.py b/test/cutting/test_cutting_roundtrip.py index 867ff6fdc..a02905f08 100644 --- a/test/cutting/test_cutting_roundtrip.py +++ b/test/cutting/test_cutting_roundtrip.py @@ -42,6 +42,7 @@ from qiskit.extensions import UnitaryGate from qiskit.quantum_info import PauliList, random_unitary from qiskit.primitives import Estimator +from qiskit_aer.primitives import Sampler from circuit_knitting.utils.simulation import ExactSampler from circuit_knitting.cutting import ( @@ -146,6 +147,7 @@ def test_cutting_exact_reconstruction(example_circuit): observables = PauliList(["III", "IIY", "XII", "XYZ", "iZZZ", "-XZI"]) phases = np.array([(-1j) ** obs.phase for obs in observables]) observables_nophase = PauliList(["III", "IIY", "XII", "XYZ", "ZZZ", "XZI"]) + estimator = Estimator() exact_expvals = ( @@ -179,3 +181,30 @@ def test_cutting_exact_reconstruction(example_circuit): logger.info("Max error: %f", np.max(np.abs(exact_expvals - simulated_expvals))) assert np.allclose(exact_expvals, simulated_expvals, atol=1e-8) + + +def test_sampler_fail(example_circuit): + +""" This test checks if the sampler throws an error if you pass it a subscircuit with no measurements. Tests temporary workaround to Issue #422. + This test passes if no exceptions are raised. +""" + + qc=example_circuit + observable_to_test=PauliList(["IIZ"]) #Without the workaround to Issue #422, this throws a Sampler error. + sampler=Sampler() + subcircuits, bases, subobservables = partition_problem( + qc, "AAB", observables=observable_to_test + ) + subexperiments, coefficients = generate_cutting_experiments( + subcircuits, subobservables, num_samples=np.inf + ) + samplers = { + label: Sampler() for label in subexperiments.keys() + } + results = { + label: sampler.run(subexperiments[label]).result() + for label, sampler in samplers.items() + } + _=results + +