{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Quantum Circuit Born Machine \n", "\n", "This notebook demonstrates training a parameterized quantum circuit Born machine (QCBM) for an unsupervised generative modelling task. We use Braket parametric circuits and a SciPy optimizer to minimize the loss function on a toy dataset.\n", "\n", "\n", "## References\n", "\n", "\n", "[1] Benedetti, Marcello, Delfina Garcia-Pintos, Oscar Perdomo, Vicente Leyton-Ortega, Yunseong Nam, and Alejandro Perdomo-Ortiz. “A Generative Modeling Approach for Benchmarking and Training Shallow Quantum Circuits.†Npj Quantum Information 5, no. 1 (May 27, 2019): 1–9. https://doi.org/10.1038/s41534-019-0157-8.\n", "\n", "[2] Liu, Jin-Guo, and Lei Wang. “Differentiable Learning of Quantum Circuit Born Machine.†Physical Review A 98, no. 6 (December 19, 2018): 062324. https://doi.org/10.1103/PhysRevA.98.062324.\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "from braket.devices import LocalSimulator\n", "\n", "from braket.experimental.algorithms.quantum_circuit_born_machine import QCBM, mmd_loss\n", "from braket.tracking import Tracker\n", "\n", "tracker = Tracker().start() # track Braket costs \n", "\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "n_qubits = 3\n", "n_layers = 1" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "T : | 0 | 1 | 2 |3|4|Result Types|\n", " \n", "q0 : -Rx(theta_0_0_0)-Rz(theta_0_0_1)-Rx(theta_0_0_2)-C---Probability--\n", " | | \n", "q1 : -Rx(theta_0_1_0)-Rz(theta_0_1_1)-Rx(theta_0_1_2)-X-C-Probability--\n", " | | \n", "q2 : -Rx(theta_0_2_0)-Rz(theta_0_2_1)-Rx(theta_0_2_2)---X-Probability--\n", "\n", "T : | 0 | 1 | 2 |3|4|Result Types|\n", "\n", "Unassigned parameters: [theta_0_0_0, theta_0_0_1, theta_0_0_2, theta_0_1_0, theta_0_1_1, theta_0_1_2, theta_0_2_0, theta_0_2_1, theta_0_2_2].\n" ] } ], "source": [ "data = np.random.rand(1)\n", "\n", "device = LocalSimulator()\n", "\n", "qcbm = QCBM(device, n_qubits, n_layers, data)\n", "\n", "print(qcbm.parametric_circuit)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Training data\n", "\n", "As an example, we consider the toy example of learning a mixture of Gaussian distributions. We set a numpy random seed to produce the same data each time, but try experimenting with the number of peaks and number of qubits to produce harder or easier data sets. For this example, the target distribution $p(x)$ is a Gaussian on 3 qubits (so $2^3$ possible values), with peaks at $\\mu_1=1$ and $\\mu_2=10$, with standard deviations $\\sigma_1=1$, $\\sigma_2 = 2$. We generate and plot the data as a probability density function in the cell below." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "def gaussian(n_qubits, mu, sigma=1):\n", " x = np.arange(2**n_qubits)\n", " gaussian = 1.0 / np.sqrt(2 * np.pi * sigma**2) * np.exp(-((x - mu) ** 2) / (2 * sigma**2))\n", " return gaussian / sum(gaussian)\n", "\n", "\n", "data = gaussian(n_qubits, mu=1, sigma=1) + gaussian(n_qubits, mu=10, sigma=2)\n", "data = data / sum(data)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAk4AAAHnCAYAAABOotJOAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABVPElEQVR4nO3deVxV1f7/8fcBGVQUwYHBUJxnRUVx1mskml211NRuqWR1s9FIKxvUsq5Dlt7StDKn6qZpZVZmKklZ4myamqmFQyqII4YKCuv3hz/ON2Jwg4fhwOv5eJzH5eyz9tqfdQ5X3u299jo2Y4wRAAAArsulqAsAAABwFgQnAAAAiwhOAAAAFhGcAAAALCI4AQAAWERwAgAAsIjgBAAAYBHBCQAAwCKCEwAAgEUEJwD5EhMTI5vNpmXLlhV1KUXq0KFDstlsWrBgQVGXYtetWzd169bN/rwwa1ywYIFsNpsOHTpk3xYcHKzbbrutwI8t/d/vZUxMTKEcD6UPwQmwwGazWXrwj3XeJCUl6ZVXXlFoaKi8vb3l4eGhmjVratCgQfrqq6+KurxS76233ipWgfCvinNtKNnKFHUBgDN4//33Mz1ftGiR1qxZk2V7o0aNCrMsp3bw4EFFRETo8OHDuv322zV06FB5eXnp6NGjWrlypW677TYtWrRI99xzT1GXmquaNWvq0qVLcnNzK+pScpTfGt966y1VqVJFw4cPt7zPPffco8GDB8vDwyOPVeZNTrV16dJFly5dkru7e4EeH6UXwQmw4O677870fOPGjVqzZk2W7bDm6tWruv3225WQkKDvvvtOHTt2zPT6+PHjtXr1aqWlpRVRhdbZbDZ5enoWdRm5Kowak5OTVb58ebm6usrV1bVAj5UbFxeXYv95wLlxqQ5wgDvuuEOtWrXKtO2f//ynbDabVqxYYd+2adMm2Ww2ff311/Ztv//+uwYOHChfX1+VK1dO7dq1s3yZKmPuyrRp0zR9+nTVrFlTZcuWVdeuXbV79+4s7fft26cBAwbI19dXnp6eCg0NzVSfJJ05c0ajR49Ws2bN5OXlpYoVK6pXr17auXPndetJSUnRbbfdJm9vb23YsCHHdkuXLtXu3bv1wgsvZAlNGXr06KFevXrlua7s5thI2c99OXDggPr37y9/f395enrqpptu0uDBg3X+/Hl7mzVr1qhTp06qVKmSvLy81KBBAz377LP217ObP7Rr1y4NHz5ctWvXlqenp/z9/XXvvffq9OnTmWqaMGGCbDabDh48qOHDh6tSpUry9vZWZGSkLl68mOP791fvvPOO6tSpo7Jly6pt27Zav359ljbZ1RgfH6/IyEjddNNN8vDwUEBAgPr27Wt/34KDg7Vnzx5999139kvRGfOmMt7j7777Tg899JCqVaumm266Kdf3X5JWr16tkJAQeXp6qnHjxvr000+zfT/+7u995lZbTnOcli5dqtatW6ts2bKqUqWK7r77bh07dixTm+HDh8vLy0vHjh1Tv3795OXlpapVq2r06NFOEeJRODjjBDhA586d9fnnnyspKUkVK1aUMUY//vijXFxctH79evXp00eStH79erm4uNjDQkJCgjp06KCLFy/qscceU+XKlbVw4UL16dNHy5Yt0+23327p+IsWLdKFCxf08MMP6/Lly/rvf/+r7t276+eff5afn58kac+ePerYsaOqV6+uZ555RuXLl9fHH3+sfv366ZNPPrEf6/fff9fy5cs1cOBA1apVSwkJCXr77bfVtWtX7d27V4GBgdnWcOnSJfXt21dbt27V2rVr1aZNmxzr/eKLLyRlPZOXm/zWlZPU1FRFREQoJSVFjz76qPz9/XXs2DF9+eWXOnfunLy9vbVnzx7ddtttat68uV566SV5eHjo4MGD+vHHH3Pte82aNfr9998VGRkpf39/7dmzR++884727NmjjRs3ZgkHd955p2rVqqVJkyZp+/btmjt3rqpVq6YpU6bkepz33ntP//73v9WhQweNGjVKv//+u/r06SNfX18FBQXlum///v21Z88ePfroowoODtbJkye1Zs0aHTlyRMHBwZoxY4YeffRReXl56bnnnpMk++9ShoceekhVq1bVuHHjlJycnOvxDhw4oEGDBunBBx/UsGHDNH/+fA0cOFCrVq3SLbfckuu+f2eltr9asGCBIiMj1aZNG02aNEkJCQn673//qx9//FE7duxQpUqV7G3T0tIUERGhsLAwTZs2TWvXrtVrr72mOnXqaOTIkXmqEyWUAZBnDz/8sPnr/322bNliJJmVK1caY4zZtWuXkWQGDhxowsLC7O369OljWrZsaX8+atQoI8msX7/evu3ChQumVq1aJjg42KSlpeVaR1xcnJFkypYta/744w/79k2bNhlJ5oknnrBvu/nmm02zZs3M5cuX7dvS09NNhw4dTL169ezbLl++nOW4cXFxxsPDw7z00kv2bevWrTOSzNKlS82FCxdM165dTZUqVcyOHTtyrdkYY1q2bGkqVaqUZfuff/5pEhMT7Y/z58/nua758+cbSSYuLi5T24x6161bZ4wxZseOHfb6czJ9+nQjySQmJubYJuMzmD9/vn3bxYsXs7T76KOPjCTz/fff27eNHz/eSDL33ntvpra33367qVy5co7HNMaY1NRUU61aNRMSEmJSUlLs29955x0jyXTt2jXHGs+ePWskmVdffTXXYzRp0iRTPxky3uNOnTqZq1evZvvaX9//mjVrGknmk08+sW87f/68CQgIyPT/h4z3I6fj/bXPnGr7++ec8T41bdrUXLp0yd7uyy+/NJLMuHHj7NuGDRtmJGX6fTLm2u9r69atsxwLpROX6gAHaNmypby8vPT9999LunZm6aabbtLQoUO1fft2Xbx4UcYY/fDDD+rcubN9v5UrV6pt27bq1KmTfZuXl5ceeOABHTp0SHv37rV0/H79+ql69er2523btlVYWJhWrlwp6dplrm+//VZ33nmnLly4oFOnTunUqVM6ffq0IiIidODAAftlCw8PD7m4XPunIS0tTadPn7Zfotq+fXuWY58/f149evTQvn37FBMTo5CQkOvWm5SUJC8vryzbn3vuOVWtWtX+uOuuu+yv5bWu6/H29pYkffPNNzleFss4E/H5558rPT3dct9ly5a1/3z58mWdOnVK7dq1k6Rsa33wwQczPe/cubNOnz6tpKSkHI+xdetWnTx5Ug8++GCmidDDhw+3jy23+tzd3RUTE6OzZ89aGlN27r//fsvzmQIDAzOdQa1YsaKGDh2qHTt2KD4+Pt81XE/G+/TQQw9lmvvUu3dvNWzYMNvL4tl9Hr///nuB1QjnQnACHMDV1VXt27e3zy9Zv369OnfurE6dOiktLU0bN27U3r17debMmUzB6fDhw2rQoEGW/jLuzjt8+LCka8EnPj7e/vjrHBxJqlevXpY+6tevb58TcvDgQRlj9MILL2QKJlWrVtX48eMlSSdPnpQkpaena/r06apXr548PDxUpUoVVa1aVbt27cpyXEkaNWqUtmzZorVr16pJkyaW3q8KFSrozz//zLL9oYce0po1a7RmzZosl17yWtf11KpVS1FRUZo7d66qVKmiiIgIzZo1K1NfgwYNUseOHXXffffJz89PgwcP1scff3zdEHXmzBk9/vjj8vPzU9myZVW1alXVqlVLkrKttUaNGpme+/j4SFKuoSbjd+Pvn72bm5tq166da30eHh6aMmWKvv76a/n5+alLly6aOnVqngNMxpisqFu3bpZLlPXr15ekbOdDOUrG+5Td/88aNmxofz2Dp6enqlatmmmbj4/PDQVMlCwEJ8BBOnXqpC1btujy5cv24FSpUiU1bdpU69evt4eqvwYnq+644w4FBATYH48//nie9s/4Qz969Gh7MPn7o27dupKk//znP4qKilKXLl30wQcf6JtvvtGaNWvUpEmTbAND3759ZYzR5MmTLZ+Vadiwoc6dO5dlcm79+vUVHh6u8PDwLHdGWa0ru8nFkrKd3Pvaa69p165devbZZ3Xp0iU99thjatKkif744w9J187MfP/991q7dq3uuece7dq1S4MGDdItt9yS62ThO++8U++++64efPBBffrpp1q9erVWrVolSdm+RzmdtTHG5HiMGzVq1Cjt379fkyZNkqenp1544QU1atRIO3bssNzHX8+sOUJePruCUpR3BMI5MDkccJDOnTsrNTVVH330kY4dO2YPSF26dNH69evl5+en+vXrZzqTUrNmTf36669Z+tq3b5/9denaH/i//hfv3ydCHzhwIEsf+/fvV3BwsCTZz0C4ubkpPDw813EsW7ZM//jHP/Tee+9l2n7u3DlVqVIlS/t+/fqpR48eGj58uCpUqKDZs2fn2r8k3XbbbVq8eLE+/PBDPfXUU9dtn5e6Ms7WnDt3LlO7v59ZyNCsWTM1a9ZMzz//vDZs2KCOHTtqzpw5evnllyVdu7395ptv1s0336zXX39d//nPf/Tcc89p3bp12b6XZ8+eVXR0tF588UWNGzfOvj27z+hGZPxuHDhwQN27d7dvv3LliuLi4tSiRYvr9lGnTh09+eSTevLJJ3XgwAGFhITotdde0wcffCAp5yCTHxlnPf/a5/79+yXJ/nv618/urxO2s/vsrNaW8T79+uuvmd6njG0ZrwNWccYJcJCwsDC5ublpypQp8vX1tV+26ty5szZu3Kjvvvsuy9mmW2+9VZs3b1ZsbKx9W3Jyst555x0FBwercePGkqTWrVvbz8SEh4fbt2dYvnx5prM3mzdv1qZNm+y381er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Vq00ZMgQ9evXT8uXL9exY8d05coVXb16VceOHdPy5ct1++23a9CgQWrVqpWio6Pl7e3tqDIAAAAKTJ7XcXJ1db1uG2OMvvjiC33xxRe5ttm6datq164tm81WrL/HDgAAQMpHcLK67JOVdg5aQgoAAKBQ5Dk4jR8/viDqAAAAKPYITgAAABY5bHI4AABASUdwAgAAsCjPl+qsunLlirZv367du3frzJkzkiRfX181bdpUrVq1kpubW0EdGgAAoEA4PDhdvHhREydO1LvvvquzZ89m28bHx0cPPPCAnn/+eZUrV87RJQAAABQIh16qO3LkiEJCQjR16lSdOXNGxphsH2fOnNGUKVPUsmVL/fHHH44sAQAAoMA47IzTlStX1KtXLx08eFCS1LBhQ0VGRiosLEz+/v6SpPj4eG3evFkLFizQ3r17deDAAfXq1Us7duxQmTIFdtUQAABLgp/5qqhLyLdDk3sXdQmlgsPOOM2dO1e//PKLbDabnnvuOf38888aM2aMunTpovr166t+/frq0qWLRo8erV27dun555+XJO3du1dz5851VBkAAAAFxmGneZYuXSqbzaZ+/fpp4sSJubZ1cXHRSy+9pD179uizzz7T0qVL9eCDDzqqFKDYc9b/quW/aAGUdg4LTrt375Yk3XvvvZb3GTFihD777DP9/PPPjiqjROOPLQAARcthl+rOnz8vSQoMDLS8T0BAgCQpKSnJUWUAAAAUGIcFJ19fX0lSXFyc5X0y2mbsCwAAUJw5LDi1atVKxhjNmjXL8j5vvfWWbDabWrZs6agyAAAACozDgtOQIUMkSTExMbr33nuVnJycY9uLFy/qvvvu07fffitJuuuuuxxVBgAAQIFx2OTwf/3rX5ozZ442bNighQsXauXKlbrzzjsVFhamatWqyWazKSEhQZs2bdLHH3+sxMRESVLHjh31r3/9y1FlAAAAFBiHBSebzaYvvvhCvXv31saNG3Xy5EnNmjUr20t3xhhJUvv27fX55587qgQAAIAC5dCvXPHx8dEPP/ygN998U40aNcrxK1caNWqkmTNnav369fLx8XFkCQAAAAXG4d9z4uLioocfflgPP/ywTpw4od27d+vMmTOSrt0917RpU/syBAAAAM7EYcEpY+HLXr16aeDAgZKurdNESAIAACWFw4LTwoULJUmDBg1yVJcAAADFisPm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nP0zPX/+vL766qscP8vevXs79Vd0lWoGpcaPP/5oOnbsaFxcXIyLi4ux2WyZHi4uLqZDhw7mhx9+KOpSC8XLL79sXFxcirqMfFmyZImpUaNGtp9jxmcZFBRkFi9eXNSlFgpn/iwz8Jlm5syf6dSpU02FChWMzWYzrq6uplq1aqZGjRqmWrVqxtXV1dhsNuPl5WUmT55c1KUWip9//tksXLiwqMtwGC7VlRJr165Vt27dlJCQoFdeeUVr1qzRnj179Ntvv2nPnj1au3atJk6cqMTERHXv3l1r164t6pKRg8WLF2vw4MEKDg7Whx9+qIMHDyo5OVlpaWlKTk7WwYMH9f777ys4OFh33XWXFi9eXNQl4zr4TEuOmTNn6umnn1bfvn21YcMGXbp0SQkJCTp8+LASEhJ06dIl/fDDD+rXr5+effZZvfnmm0VdcoH7/PPP7d8jWxKwcngp0a5dO5UpU0bR0dG5LoWfmpqqf/zjH0pLS9PGjRsLsULHWLRokeW2K1as0Geffaa0tLQCrMjxWrRooZo1a2rFihXXbXvbbbfpyJEj2rVrVyFU5lh5+eqj7777TjExMU73WWbgM83KWT/T+vXrq0OHDlqwYMF12w4bNkyxsbHav39/wRdWhF555RWNGzfO6T7LnDDHqZTYtWuX3njjjet+f5C7u7uGDx+uxx9/vJAqc6zhw4fLZrPJ6n8POON8kf379+uxxx6z1Pb222/P8fsci7sJEyaU+M8yA59p9pzxMz169Kg6d+5sqW2XLl308ccfF3BFBePee++13Hbnzp0FWEnhIziVEj4+Pjp48KCltgcPHpSPj08BV1QwfHx8FBISoqlTp1637Xvvvae33367EKpyrICAAG3dulUjRoy4btstW7YoICCgEKpyvGrVqqlVq1Z6//33r9v2tdde05QpUwqhqoLBZ5qVs36mtWrV0urVqy19lt98841q1apVCFU53oIFC+Tm5iZ3d/frtr1y5UohVFSIinSGFQrNU089Zdzd3c3rr79uLly4kG2bCxcumNdee824u7ubp556qpArdIyePXua4OBgS22ddfLplClTjM1mM4899pj55Zdfsm3zyy+/mEcffdS4uLg47QTUPn36mMDAQEttnfWzzMBnmpWzfqZz5841NpvN9OnTx6xatcokJiZmej0xMdF8/fXXpk+fPsbFxcXMnTu3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LTLu7u7Z9lO/fn1z4sQJY4wxr776qrHZbNm2a9Wqlblw4UK2x+ratauRZLp27WpWrlxpypcvn20fLi4uZvr06TnWnNFu/Pjx2b6elpZmnnjiiRxrlGTKlClj3n77bcvvNYDsccYJQIHz9fVVzZo1JUk7d+7UlClTlJ6enud+rl69qtq1a+vJJ5/UkiVLFBsbqy1btmjZsmV68MEH5e7urtOnT+v222/XyZMnc+1r586duu+++1S3bl3NmzdPW7Zs0bfffqu7775b0rXJ7KNHj9ann36qMWPGKCwsTB9++KG2bt2qVatW6dZbb5V07SzPyy+/nOuxjh8/rrvuuktlypTRf/7zH23YsEEbNmzQK6+8oooVKyo9PV1PPPGEli9fnuf3RJIeffRRTZ8+XcYYdenSRfPmzVNMTIw2b96sd999V02aNNHVq1f173//WytWrMjXMQD8f0Wd3ACUDtOmTct0BiQ4ONg89thjZvHixeb333+31MfBgwdNenp6jq/v2rXLeHl5GUnm+eefz7ZNxhknSaZDhw4mOTk5S5sBAwYYScbV1dX4+vqa/v37m6tXr2Zqc/XqVdOuXTv7Wa4rV65k6SfjjJMk4+3tbfbu3Zulze7du03FihWNJFO9enWTmpqapY1yOeO0evVq++tz587NdsyXLl0y3bt3N5JMzZo1s60VgDUEJwCFIi0tzdx77705Xkry8/MzgwYNMitWrMg1HF3PqFGjjCTTtGnTbF/PCE42my3bIGOMMd9++629rnLlypnTp09n227evHn2djt37szy+l+D07Rp03KsecqUKfZ2S5cuzfJ6bsEpIxD1798/x/6NMWbv3r32flavXp1rWwA541IdgELh4uKi9957T6tXr1bPnj1Vpkzm1VASEhK0ZMkS9enTR23bttVvv/123T7Pnj2r3377TXv27NHu3bu1e/duVapUSZK0d+9eXblyJcd9mzdvrkaNGmX7WosWLew/33LLLfL19b1uu99//z3HY9lsNg0bNizH1yMjI2Wz2SRJa9euzbHd3yUlJSkmJkaSNGDAgFzbNmrUSFWqVJF0bSFSAPnDOk4ACtUtt9yiW265RUlJSfrxxx+1ZcsWbd26Vd9//73Onz8vSdq6das6d+6sbdu2KSAgINP+P//8s6ZPn66vv/4615XF09PTdfbsWVWrVi3b1+vXr5/jvhnhKy/tcru7rlatWvbQkp2qVasqODhYcXFx+vnnn3Ns93c7duywzxUbMmSIhgwZYmk/VmQH8o8zTgCKRMWKFdWrVy+NGzdOK1asUEJCgubNmycfHx9J0okTJ/TCCy9k2ue9995Tq1atNH/+fEt//DOWQMhOuXLlcnzNxcUlz+3S0tJybJdTePsrPz8/SdKZM2eu2zbD9SbA5+TixYv52g8AZ5wAFBMeHh6KjIxUYGCgevbsKUn69NNP9c4778jFxUX79u3Tgw8+qKtXr6patWoaM2aMunfvruDgYFWoUEFubm6SpHnz5mnEiBGSJGNMkY3nrzIuwznaX8Pa22+/rQ4dOljaLyOcAsg7ghOAYiUiIkJBQUE6evSozp49q9OnT6tq1apasGCBrl69KldXV3333Xdq2LBhtvvn5YxNYUlISLDcJqf5VNmpXLmy/edy5cqpadOmeS8OQJ5wqQ5AsRMYGGj/OeNszZ49eyRdm5CdU2iSrs2PKm7i4uJ0+vTpHF9PTEzUoUOHJClP4SckJMT+/vz44483VCMAawhOAIqVixcvau/evZKuzYPKOKty9epVSVJycnKO+544caJYLvBojNGiRYtyfH3BggX2y4rh4eGW+61ataratWsnSfrf//6nxMTEGysUwHURnAAUuD///FNhYWH68ssvc10xPD09XY8++qj9DrU+ffrYz6jUq1dPknTgwAFt2LAhy74XL17UXXfdleuE8KI0ceJE/frrr1m2//LLL3rllVckSQEBAerbt2+e+n3++eclXVuaYMCAATp37lyObVNSUjRr1ixdvnw5T8cA8H+Y4wSgUGzevFn//Oc/Vb16dfXr10/t27dXzZo1VaFCBZ07d047duzQvHnz7Lfje3t7a+LEifb977nnHr355ptKT09X7969NWbMGHXq1Emenp7atm2bpk+frgMHDqhjx47F7rJV3bp1lZiYqHbt2unpp5+2f+lvTEyMJk+ebF+G4c0335S7u3ue+r711lv1+OOP67///a++//57NWrUSA8++KA6deqkypUrKzk5WQcPHtT69ev16aef6uzZs7muKQUgdwQnAAWuTJky8vf3V3x8vI4dO6ZZs2Zp1qxZObavV6+ePvroIwUHB9u3tWnTRi+++KLGjx+vc+fO6bnnnsuy35NPPqmmTZsWu+BUvXp1zZgxQ3feeafGjh2b5XUXFxdNnTpV/fv3z1f/06dPl6+vryZOnKj4+HhNmDAhx7bly5eXq6trvo4DgEt1AAqBp6enjh07ph9//FEvvviievXqpdq1a9v/iFesWFENGzbUoEGD9L///U+7d+9W69ats/Qzbtw4ffXVV+rRo4d8fHzk7u6um266SXfccYdWr16tadOmFcHorOndu7e2bt2qyMhI1axZU+7u7qpWrZr69++vH374QU8++WS++7bZbBo3bpz279+vp556SqGhofL19ZWrq6sqVKigxo0b61//+pcWLlyoEydOqGzZsg4cGVC62ExxWegEAEqYbt266bvvvlPXrl3tX40CwLlxxgkAAMAighMAAIBFBCcAAACLCE4AAAAWEZwAAAAs4q46AAAAizjjBAAAYBHBCQAAwCKCEwAAgEUEJwAAAIsITgAAABYRnAAAACwiOAEAAFhEcAIAALCI4AQAAGDR/wM4z7L5UeRNwAAAAABJRU5ErkJggg==", "text/plain": [ "<Figure size 640x480 with 1 Axes>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "labels = [format(i, \"b\").zfill(n_qubits) for i in range(len(data))]\n", "plt.bar(range(2**n_qubits), data)\n", "plt.xticks(list(range(len(data))), labels, rotation=\"vertical\", size=12)\n", "plt.xlabel(\"Sample\", size=20)\n", "plt.ylabel(\"Probability\", size=20)\n", "plt.title(\"Two-peak Gaussian distribution\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Hyperparameters \n", "\n", "Next, we set the hyperparameters for training the QCBM. To keep it simple, we only consider the following hyperparameters: number of qubits `n_qubits`, number of layers in the QCBM `n_layers`, and the number of iterations in the optimization algorithm.\n", "\n", "The number of layers determines how many parameters are in the quantum circuit. For the QCBM, we need `n_params = 3 * n_layers * n_qubits`." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "# Declare hyperparameters for QCBM\n", "n_iterations = 5\n", "n_layers = 3\n", "\n", "init_params = np.random.rand(3 * n_layers * n_qubits)\n", "\n", "qcbm = QCBM(device, n_qubits, n_layers, data)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We use the scipy optimizer \"L-BFGS-B\" below." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " fun: 0.0034091453255005177\n", " hess_inv: <27x27 LbfgsInvHessProduct with dtype=float64>\n", " jac: array([-0.01892042, -0.00042703, -0.01871226, -0.01175861, -0.01773734,\n", " 0.00017732, -0.00373153, -0.00147817, 0.00159875, -0.00598535,\n", " -0.00220797, -0.00646174, -0.00127055, 0.00989479, -0.00186534,\n", " 0.00216637, -0.01453949, 0.00337597, -0.00102238, -0.00230746,\n", " 0.00482481, -0.0020789 , 0.00129113, -0.00062512, 0.00318669,\n", " 0.00397262, 0.00421108])\n", " message: 'STOP: TOTAL NO. of ITERATIONS REACHED LIMIT'\n", " nfev: 6\n", " nit: 5\n", " njev: 6\n", " status: 1\n", " success: False\n", " x: array([ 0.45928415, 0.14177025, 0.79213072, 0.66622247, 0.45517018,\n", " 0.83223744, 0.17799168, 0.71590234, 0.15869034, 0.19095004,\n", " 0.14470633, 0.5942404 , 1.22185465, -0.00962039, 1.28063797,\n", " 0.29197856, 0.73894836, 0.05226552, -0.02050081, 0.62222851,\n", " -0.18777548, 0.79719876, 0.39829109, 0.25189807, 0.57331064,\n", " 0.10176262, 0.51968577])\n" ] } ], "source": [ "# Training the circuit\n", "from scipy.optimize import minimize\n", "\n", "history = []\n", "\n", "\n", "def callback(x):\n", " loss = mmd_loss(qcbm.get_probabilities(x), data)\n", " history.append(loss)\n", "\n", "\n", "result = minimize(\n", " lambda x: mmd_loss(qcbm.get_probabilities(x), data),\n", " x0=init_params,\n", " method=\"L-BFGS-B\",\n", " jac=lambda x: qcbm.gradient(x),\n", " options={\"maxiter\": n_iterations},\n", " callback=callback,\n", ")\n", "\n", "print(result)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Below is a plot for the convergence of the loss function." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 1.0, 'Convergence of the loss function')" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkAAAAHHCAYAAABXx+fLAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABOw0lEQVR4nO3deXhTVf4/8HfSNkm3pIXuiy2LUkpLSyvFggpKBZVBUJDKzACDqKOCwpcRBf0Ni4yDOAqiMALOuAzqiKwiIggIiIIDtBQpm4gspSulNC3dSc7vjzahoemSkvRmeb+eJw/05iQ5J7chb+4593NlQggBIiIiIhcil7oDRERERB2NAYiIiIhcDgMQERERuRwGICIiInI5DEBERETkchiAiIiIyOUwABEREZHLYQAiIiIil8MARERERC6HAYiInMbWrVuRmJgIlUoFmUyG0tJSi59DJpNhypQp1u/cDaKjo/GnP/3J5q9jqYMHD6J///7w9vaGTCZDVlaW1F0yy17fP3IcDEDk1M6cOYM///nP6Nq1K1QqFdRqNQYMGIAlS5agqqpK6u6RFV2+fBljxoyBp6cnli1bhlWrVsHb29ts23379mHu3LntCkjOrK6uDo8++ihKSkqwePFirFq1ClFRUZL1h/uJbMld6g4Q2crXX3+NRx99FEqlEuPHj0dcXBxqa2vxww8/YMaMGTh27BhWrlwpdTfJSg4ePIjy8nLMnz8faWlpLbbdt28f5s2bhz/96U/w8/PrmA46gDNnzuD8+fN4//338cQTT0jdnRb306lTpyCX8//w1H4MQOSUzp49i8ceewxRUVH47rvvEBoaarxv8uTJ+PXXX/H1119L2MObV11dDYVCwS+BBkVFRQDAQHMTHOk9VCqVUneBHJ0gckJPP/20ACB+/PHHNrWvq6sTr776qujatatQKBQiKipKzJo1S1RXV5u0i4qKEsOGDRN79+4Vffv2FUqlUnTp0kV8/PHHxjYHDx4UAMRHH33U5HW2bt0qAIivvvrKuO3ixYti4sSJIigoSCgUChEbGyv+/e9/mzxu165dAoD473//K1555RURFhYmZDKZuHLlihBCiC+++EL07NlTKJVK0atXL7F+/XoxYcIEERUVZfI8Op1OLF68WMTGxgqlUimCgoLEU089JUpKSiwep8GVK1fEtGnTRFRUlFAoFCI8PFyMGzdOXLp0ydimurpazJ49W3Tr1k0oFAoREREhZsyY0eT9bc4XX3whkpKShEqlEp07dxZ/+MMfxMWLF433Dxw4UAAwuU2YMMHsc82ZM6dJWwDi7NmzQgghAIjJkyeLDRs2iF69ehn3yTfffNPkudqy75oTFRXVpI9nzpwRo0ePFv7+/sLT01P069dPbN68uclj33nnHREbGys8PT2Fn5+fSE5OFp9++qnx/rKyMjF16lTjPgkMDBRpaWkiIyOj2f5MmDChyXsycOBAIUT9+2v4+42Pafw7dvbsWQFA/OMf/xArVqwwfp5uv/12ceDAgSaPP3HihHj00UdFQECAUKlU4rbbbhMvv/yyEKL1/dTe98/wWVq9erX429/+JsLDw4VSqRT33nuvOH36dLPvDzkfBiBySuHh4aJr165tbm/4x3/06NFi2bJlYvz48QKAGDlypEm7qKgo0aNHDxEcHCxefvllsXTpUpGUlCRkMpnIzs42tuvatat48MEHm7zOxIkThb+/v6itrRVCCFFQUCAiIiJEZGSkePXVV8V7770nHnroIQFALF682Pg4wz/asbGxIjExUSxatEgsWLBAVFRUiM2bNwuZTCZ69+4tFi1aJP76178Kf39/ERcX1yQAPfHEE8Ld3V08+eSTYvny5eKll14S3t7eom/fvsY+WTLO8vJyERcXJ9zc3MSTTz4p3nvvPTF//nzRt29fcfjwYSFEfegaMmSI8PLyEtOmTRMrVqwQU6ZMEe7u7mLEiBGt7psPP/xQABB9+/YVixcvFjNnzhSenp4iOjraGAC//fZb8dRTTwkA4tVXXxWrVq0S+/btM/t8R44cEWPHjjW+x6tWrRKrVq0SV69eFULUB6CEhAQRGhoq5s+fL95++23RtWtX4eXlJYqLi43P09Z915wbv8ALCgpEcHCw8PX1Fa+88opYtGiRSEhIEHK5XKxfv97YbuXKlcbf1RUrVoglS5aISZMmieeff97Y5ve//71QKBRi+vTp4l//+pdYuHChGD58uPjkk0+a7c++ffvEyy+/LACI559/XqxatUp8++23QgjLA1CfPn1E9+7dxcKFC8Ubb7whAgICREREhMnv2JEjR4RarRadO3cWs2bNEitWrBAvvviiiI+Pb9N+au/7Z/gs9enTRyQnJ4vFixeLuXPnCi8vL5GSktLyTiOnwgBETker1QoAbfpyFUKIrKwsAUA88cQTJttfeOEFAUB89913xm1RUVECgPj++++N24qKioRSqRR/+ctfjNtmzZolPDw8TI6s1NTUCD8/P/H4448bt02aNEmEhoaafLEKIcRjjz0mNBqNqKysFEJc/0e7a9euxm0G8fHxIiIiQpSXlxu37d69WwAw+XLau3evAGBypECI60elGm9v6zhnz54tAJh8wRjo9XohhBCrVq0Scrlc7N271+T+5cuXt3qUrra2VgQFBYm4uDhRVVVl3L5582YBQMyePdu4zRCUDh482OzzGfzjH/8wOZrQGAChUCjEr7/+atx25MgRAUC8++67xm1t3XfNufELfNq0aQKAyftUXl4uunTpIqKjo4VOpxNCCDFixAjRq1evFp9bo9GIyZMnt9jGHMPv2Zo1a0y2WxqAOnfubPK7/+WXXzY58nn33XcLX19fcf78eZPnNPzeCNHyfmrv+2cYY8+ePUVNTY2x7ZIlSwQAcfToUfNvDjkdLh4gp1NWVgYA8PX1bVP7LVu2AACmT59usv0vf/kLADRZKxQbG4u77rrL+HNgYCB69OiB3377zbgtPT0ddXV1WL9+vXHbt99+i9LSUqSnpwMAhBBYt24dhg8fDiEEiouLjbehQ4dCq9UiMzPT5LUnTJgAT09P4895eXk4evQoxo8fDx8fH+P2gQMHIj4+3uSxa9asgUajwX333WfyWsnJyfDx8cGuXbssHue6deuQkJCAhx9+uMn7KpPJjK/bs2dPxMTEmLzuvffeCwBNXrexQ4cOoaioCM8++yxUKpVx+7BhwxATE2OzdVxpaWno1q2b8efevXtDrVYbx96efdeaLVu2ICUlBXfeeadxm4+PD5566imcO3cOx48fB1C/PufixYs4ePBgs8/l5+eH//3vf8jLy7OoD9aSnp4Of39/48+G3yPD+3fp0iV8//33ePzxx3HLLbeYPNbwe2Optr5/BhMnToRCoWi2j+T8GIDI6ajVagBAeXl5m9qfP38ecrkc3bt3N9keEhICPz8/nD9/3mT7jf9gA4C/vz+uXLli/DkhIQExMTFYvXq1cdvq1asREBBg/OK/dOkSSktLsXLlSgQGBprcJk6cCOD6olSDLl26NOk7gCZ9N7ft9OnT0Gq1CAoKavJ6V69ebfJabRnnmTNnEBcX16Tdja977NixJq952223mR2jufH1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vb1N7jt37hx+97vf4ZlnnsFrr72GTp064YcffsCkSZNQW1sLLy8vq/bTw8PD5GeZTAa9Xm/V1yAi62AAIiK7olAooNPpTLYlJSVh3bp1iI6Ohrt72//ZysjIgF6vx1tvvQW5vP6A9xdffNHq692oZ8+eyMnJQU5OjvEo0PHjx1FaWorY2Ng294eI7AenwIjIrkRHR+N///sfzp07h+LiYuj1ekyePBklJSUYO3YsDh48iDNnzmDbtm2YOHFii+Gle/fuqKurw7vvvovffvsNq1atMi6Obvx6V69exc6dO1FcXGx2aiwtLQ3x8fH4wx/+gMzMTBw4cADjx4/HwIEDcfvtt1v9PSAi22MAIiK78sILL8DNzQ2xsbEIDAzEhQsXEBYWhh9//BE6nQ5DhgxBfHw8pk2bBj8/P+ORHXMSEhKwaNEiLFy4EHFxcfj000+xYMECkzb9+/fH008/jfT0dAQGBjZZRA3UT2V9+eWX8Pf3x9133420tDR07doVq1evtvr4iahjyIQQQupOEBEREXUkHgEiIiIil8MARERERC6HAYiIiIhcDgMQERERuRwGICIiInI5DEBERETkchiAiIiIyOUwABEREZHLYQAiIiIil8MARERERC6HAYiIiIhcDgMQERERuZz/D/zLNjYfapi0AAAAAElFTkSuQmCC", "text/plain": [ "<Figure size 640x480 with 1 Axes>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(history, \"-o\")\n", "plt.xlabel(\"Iteration\")\n", "plt.ylabel(\"Loss\")\n", "plt.title(\"Convergence of the loss function\")" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "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31siIvqAe6g0TCwWw9TUFImJiQAAQ0NDPkeNyhxBEPDvv/8iMTERpqamxTqtnYioPGNCVQbUqFEDAGRJFVFZZWpqKvt9JSKi/8OEqgwQiUSwsrKCpaUlMjMzNR0OUZ50dXW5MkVEpAQTqjJELBbzLywiIiItxE3pRERERCpiQkVERESkIiZURERERCpiQkVERESkIiZURERERCpiQkVERESkIiZURERERCpiQkVERESkIiZURERERCpiQkVERESkIiZURERERCpiQkVERESkIiZURERERCpiQkVERESkIiZURERERCpiQkVERESkIiZURERERCpiQkVERESkIiZURERERCpiQkVERESkIiZURERERCpiQkVERESkIiZURERERCpiQkVERESkIiZURERERCpiQkVERESkIiZURERERCpiQkVERESkIq1NqKRSKWbOnAlra2sYGBjA3d0dp0+fLrDdoUOHMHDgQNSpUweGhoZwcnLC9OnT8fr1a4W69vb2EIlECq9x48aVwIyIiIhIW1XSdADF5ePjg+DgYEyZMgV169ZFUFAQevTogfPnz6Nt27ZK240dOxbW1tYYNmwYbG1tcevWLWzcuBG///47bty4AQMDA7n6Li4umD59ulyZo6NjicyJiIiItJNWJlQhISHYt28f/P394efnBwDw9vaGs7MzZsyYgStXrihtGxwcDA8PD7kyV1dXjBgxAnv37sXo0aPlrtWsWRPDhg1T+xyIiIio/NDKW37BwcEQi8UYO3asrEwikcDX1xdXr17FkydPlLb9bzIFAH379gUA3LlzJ882GRkZePfunWpBExERUbmllQlVeHg4HB0dYWJiIlfu5uYGAIiIiChSf8+fPwcAVKtWTeHauXPnYGhoCGNjY9jb22P9+vUF9ieVSpGamir3IiIiovJLK2/5JSQkwMrKSqE8tyw+Pr5I/a1YsQJisRheXl5y5Y0bN0bbtm3h5OSEV69eISgoCFOmTEF8fDxWrFihtL9ly5Zh4cKFRYqBiIiItJdWJlTp6enQ19dXKJdIJLLrhfXTTz8hICAAM2bMQN26deWuHT16VO79yJEj0b17d6xZswaTJk1CrVq18uxz1qxZmDZtmux9amoqbGxsCh0TERERaRetvOVnYGAAqVSqUP7+/XvZ9cL466+/4Ovri65du2LJkiUF1heJRJg6dSqy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lNb18/ND48aNcerUKVSq9OFHZWJigqVLl2Ly5MmoV6+eWudFRERE2qlYK1SaFhwcDLFYjLFjx8rKJBIJfH19cfXqVTx58kRpW3Nzc1SuXLnAMaKjoxEdHY2xY8fKkikAmDBhAgRBQHBwsGqTICIionJDpRWqzZs3w9LSUi315s2bV+hxw8PD4ejoCBMTE7lyNzc3AEBERARsbGwK3Z+yMQDFfWLW1taoVauW7DoRERGRSgnVli1b8r0uEokKVQ8oWkKVkJAAKysrhfLcsvj4+EL3ld8YH/f533HyG0MqlUIqlcrep6amqhwPERERlV3FvuWn7IT04ryKKj09Hfr6+grlEolEdl1VuX0oGye/MZYtW4YqVarIXqqulhEREVHZVqwVqvPnz6s7jiIxMDCQWwHKlfttQgMDA7WMAUDpOPmNMWvWLEybNk32PjU1lUkVERFROVashKp9+/bqjqNIrKys8OzZM4Xy3Nt01tbWahkjt8//JkMJCQmy/Vp50dfXz3Nli4iIiMonrfyWn4uLC2JiYhT2Jl2/fl12XR1jAEBYWJhceXx8PJ4+faqWMYiIiKh80MqEysvLC9nZ2di2bZusTCqVIjAwEO7u7rIVpbi4ONy9e7dYYzRs2BD16tXDtm3bkJ2dLSvfsmULRCIRvLy8VJsEERERlRulcrCnurm7u6N///6YNWsWEhMT4eDggF27diE2NhYBAQGyet7e3rh48aLcxvc3b95gw4YNAIDLly8DADZu3AhTU1OYmppi4sSJsrr+/v7o3bs3unTpgkGDBiEqKgobN27E6NGjCzxlnYiIiCoOrUyoAGD37t2YO3cu9uzZg5SUFDRu3BjHjh1Du3bt8m2XkpKCuXPnypWtXr0aAGBnZyeXUPXq1QuHDh3CwoULMWnSJFhYWGD27NlFOuKBiIiIyj+tTagkEgn8/f3h7++vtM6FCxcUyuzt7Yt0VIOnpyc8PT2LESERERFVFFq5h4qIiIioLGFCRURERKQiJlREREREKmJCRURERKQiJlREREREKmJCRURERKQiJlREREREKmJCRURERKQiJlREREREKmJCRURERKQiJlREREREKmJCRURERKQiJlREREREKmJCRURERKQiJlREREREKmJCRURERKQiJlREREREKmJCRURERKQiJlREREREKmJCRURERKQiJlREREREKmJCRURERKQiJlREREREKmJCRURERKQiJlREREREKmJCRURERKQiJlREREREKmJCRURERKQiJlREREREKmJCRURERKQiJlREREREKmJCRURERKQiJlREREREKmJCRURERKQiJlREREREKmJCRURERKQiJlREREREKmJCRURERKQiJlREREREKmJCRURERKQiJlREREREKqqk6QCIqOIZeGygpkMolv299ms6BCIqo7R2hUoqlWLmzJmwtraGgYEB3N3dcfr06UK1ffbsGQYMGABTU1OYmJigT58+ePTokUI9kUiU52v58uXqng4RERFpMa1dofLx8UFwcDCmTJmCunXrIigoCD169MD58+fRtm1bpe3evn2LDh064M2bN5g9ezZ0dXWxdu1atG/fHhEREahatapc/c6dO8Pb21uurGnTpiUyJyIiItJOWplQhYSEYN++ffD394efnx8AwNvbG87OzpgxYwauXLmitO3mzZtx//59hISEoEWLFgCA7t27w9nZGatXr8bSpUvl6js6OmLYsGElNxkiIiLSelp5yy84OBhisRhjx46VlUkkEvj6+uLq1at48uRJvm1btGghS6YAoF69evj0009x4MCBPNukp6fj/fv36psAERERlStamVCFh4fD0dERJiYmcuVubm4AgIiIiDzb5eTk4ObNm2jevLnCNTc3Nzx8+BBpaWly5UFBQTAyMoKBgQEaNGiAn376ST2TICIionJDK2/5JSQkwMrKSqE8tyw+Pj7PdsnJyZBKpQW2dXJyAgC0bt0aAwYMQO3atREfH49NmzZh6NChePPmDcaPH680PqlUCqlUKnufmppa+MkRERGR1tHKhCo9PR36+voK5RKJRHZdWTsAhW57+fJluTqjRo2Cq6srZs+eDR8fHxgYGOQ5zrJly7Bw4cJCzISIiIjKA6285WdgYCC3ApQrd5+TskQnt7w4bQFAT08PEydOxOvXr/H3338rrTdr1iy8efNG9spvTxcRERFpP61cobKyssKzZ88UyhMSEgAA1tbWebYzNzeHvr6+rF5R2uaysbEB8OH2oTL6+vp5roIRERFR+aSVK1QuLi6IiYlR2Jt0/fp12fW86OjooFGjRggLC1O4dv36ddSpUweVK1fOd+zcA0AtLCyKETkRERGVR1qZUHl5eSE7Oxvbtm2TlUmlUgQGBsLd3V22ihQXF4e7d+8qtA0NDZVLqu7du4dz586hf//+srKkpCSFcdPS0rBu3TpUq1YNrq6u6p4WERERaSmtvOXn7u6O/v37Y9asWUhMTISDgwN27dqF2NhYBAQEyOp5e3vj4sWLEARBVjZhwgRs374dPXv2hJ+fH3R1dbFmzRpUr14d06dPl9XbtGkTjhw5gs8++wy2trZISEjAzp07ERcXhz179kBPT69U50xERERll1YmVACwe/duzJ07F3v27EFKSgoaN26MY8eOoV27dvm2q1y5Mi5cuICpU6di8eLFyMnJgYeHB9auXSt3G69Nmza4cuUKduzYgVevXsHIyAhubm7YuXMnOnbsWNLTIyIiIi2itQmVRCKBv78//P39lda5cOFCnuW1atXCwYMH8+2/c+fO6Ny5syohEhERUQWhtQkVERGVDfbfHNd0CMUSu7ynpkOgckQrN6UTERERlSVMqIiIiIhUxISKiIiISEVMqIiIiIhUxISKiIiISEVMqIiIiIhUxISKiIiISEVMqIiIiIhUxISKiIiISEVMqIiIiIhUxISKiIiISEVMqIiIiIhUxIcjE1Gpu/X0jaZDICJSK65QEREREamICRURERGRiphQEREREamICRURERGRiphQEREREamICRURERGRiphQEREREamI51AREZWQgccGajqEYtnfa7+mQyDSOlyhIiIiIlIREyoiIiIiFTGhIiIiIlIREyoiIiIiFTGhIiIiIlIREyoiIiIiFTGhIiIiIlIREyoiIiIiFTGhIiIiIlIREyoiIiIiFTGhIiIiIlIRn+VHRFRCbj19o+kQiKiUcIWKiIiISEVMqIiIiIhUxISKiIiISEVMqIiIiIhUxISKiIiISEVMqIiIiIhUxISKiIiISEU8h4qIiFRiaL9B0yEUU09NB0DlCFeoiIiIiFSktQmVVCrFzJkzYW1tDQMDA7i7u+P06dOFavvs2TMMGDAApqamMDExQZ8+ffDo0aM86wYEBKB+/fqQSCSoW7cuNmzQ1n+JERERUUnR2oTKx8cHa9aswdChQ7F+/XqIxWL06NEDly5dyrfd27dv0aFDB1y8eBGzZ8/GwoULER4ejvbt2+PVq1dydbdu3YrRo0ejYcOG2LBhA1q1aoWvvvoKK1asKMmpERERkZbRyj1UISEh2LdvH/z9/eHn5wcA8Pb2hrOzM2bMmIErV64obbt582bcv38fISEhaNGiBQCge/fucHZ2xurVq7F06VIAQHp6Or799lv07NkTwcHBAIAxY8YgJycHixYtwtixY2FmZlbCMyUiIiJtoJUrVMHBwRCLxRg7dqysTCKRwNfXF1evXsWTJ0/ybduiRQtZMgUA9erVw6effooDBw7Iys6fP49Xr15hwoQJcu2//PJLvHv3DsePH1fjjIiIiEibaeUKVXh4OBwdHWFiYiJX7ubmBgCIiIiAjY2NQrucnBzcvHkTo0aNUrjm5uaGU6dOIS0tDZUrV0Z4eDgAoHnz5nL1XF1doaOjg/DwcAwbNizP+KRSKaRSqez9mzcfnjifmppahFkWXnZ6Von0W9KK+vOoCPPU1jkCFWOe/J3NG+dZtlWE/zaBkvk7NrdPQRAKrKuVCVVCQgKsrKwUynPL4uPj82yXnJwMqVRaYFsnJyckJCRALBbD0tJSrp6enh6qVq2qdAwAWLZsGRYuXKhQnleSV5FVmVZF0yGUCs6z/KgIcwQ4z/KG81RdWloaqlTJv3+tTKjS09Ohr6+vUC6RSGTXlbUDUKi26enp0NPTy7MfiUSidAwAmDVrFqZNmyZ7n5OTg+TkZFStWhUikUhpu7ImNTUVNjY2ePLkicJqYHlSEeZZEeYIcJ7lDedZfmjrHAVBQFpaGqytrQusq5UJlYGBgdwttVzv37+XXVfWDkCh2hoYGCAjIyPPft6/f690DOBDwvbfpM3U1FRp/bLOxMREq/4DKK6KMM+KMEeA8yxvOM/yQxvnWNDKVC6t3JRuZWWFhIQEhfLcMmWZpLm5OfT19QvV1srKCtnZ2UhMTJSrl5GRgVevXhUqWyUiIqKKQSsTKhcXF8TExChsQLt+/brsel50dHTQqFEjhIWFKVy7fv066tSpg8qVK8v18d+6YWFhyMnJUToGERERVTxamVB5eXkhOzsb27Ztk5VJpVIEBgbC3d1dtvk7Li4Od+/eVWgbGhoqlyjdu3cP586dQ//+/WVlHTt2hLm5ObZs2SLXfsuWLTA0NETPnuX/GVD6+vqYP39+nnvOypOKMM+KMEeA8yxvOM/yoyLMUSQU5ruAZdCAAQNw+PBhTJ06FQ4ODti1axdCQkJw9uxZtGvXDgDg4eGBixcvyn3dMS0tDU2bNkVaWhr8/Pygq6uLNWvWIDs7GxEREbCwsJDV3bx5M7788kt4eXmha9eu+Ouvv7B7924sWbIEs2fPLvU5ExERUdmktQnV+/fvMXfuXPz4449ISUlB48aNsWjRInTt2lVWJ6+ECgCePn2KqVOn4tSpU8jJyYGHhwfWrl0LBwcHhXG2b9+O1atX4/Hjx7CxscHEiRMxefJkrfq2HhEREZUsrU2oiIiIiMoKrdxDRURERFSWMKEiIiIiUhETKiIiIiIVMaEiIiIiUhETKiIiIiIVaeWz/KhkPHv2DBEREYiPj0d6ejoMDAxgbW0NFxcX1KxZU9PhlZq0tDSkpKTA1tZW06EUmyAIuHr1KsLDw/P8PFu3bl0hjv548uQJHj9+LDubTlvx8/w/5eEzffPmDY4fP6708+zZs6dWP/+1sKKionDjxg14e3trOhT1EKjCu3z5stCmTRtBR0dH0NHREUQikdxLR0dHaN26tXDp0iVNh1oqFi9eLOjo6Gg6jGLbv3+/YGtrm+dnmft52tjYCPv27dN0qCVO2z9LQeDn+V/a/pmuXLlSqFy5siASiQSxWCxYWloKtra2gqWlpSAWiwWRSCQYGxsLy5cv13SoJU7bP8v/4i2/Cu7MmTPw8PDAixcvsGTJEpw+fRq3b9/Gw4cPcfv2bZw5cwaLFi1CUlISOnbsiDNnzmg6ZMrHvn37MGjQINjb22Pv3r148OAB3r17h+zsbLx79w4PHjzAnj17YG9vjyFDhmDfvn2aDpnywc+zfNm4cSNmzpyJPn364MqVK0hPT8eLFy/wzz//4MWLF0hPT8elS5fg6emJ2bNnY8OGDZoOmYqAB3tWcC1btkSlSpVw9uzZfJ+xlJGRgQ4dOiA7OxvXrl0rxQjVY/fu3YWue/ToURw+fBjZ2dklGFHJaNKkCezs7HD06NEC6/bq1QtxcXG4efNmKUSmPt99912h6168eBEXLlzQys8SqBifJ1BxPlNHR0e0bt0aQUFBBdYdMWIErl69ipiYmJIPTI1GjRpV6LqRkZGIiIjQys8yL9xDVcHdvHkT33//fYEPrNTT04OPjw8mT55cSpGpl4+PD0QikcJjiJTR1v0oMTEx+OqrrwpVt2/fvpg4cWIJR6R+CxYsqBCfJVAxPk+g4nymT548wf/+979C1W3Xrh0OHDhQwhGpX1BQEHR1daGnp1dg3czMzFKIqPTwll8FZ2ZmhgcPHhSq7oMHD2BmZlbCEZUMMzMzeHh4IDQ0tMDXuHHjNB1usVlZWSEsLKxQdUNDQ2FlZVXCEamfpaUlunbtiqSkpAJf33zzjabDVUlF+DyBivOZ1q5dG6dOnSpU3ZMnT6J27dolHJH62djYoFOnTkhLSyvwNWfOHE2Hq1Zcoarghg0bhrVr16J69eoYM2YMjI2NFeq8ffsW27Ztw7p16zBlypTSD1IN3NzccPfuXbi6uhZY98SJE6UQUckYN24cvvnmG+jp6WH8+PGoV6+eQp27d+9i8+bN2L59O5YuXaqBKFXj7u6OsLAwVK1atcC6RkZGpRBRyakInydQcT7T6dOnY8yYMXj//j0mTJgAV1dXVKtWTXb95cuXCAsLw5YtW3Ds2DFs27ZNg9EWj7u7O86fP1+outq60qiURrfEk8ZJpVJh0KBBgkgkEnR1dYWGDRsKnTp1Enr27Cl06tRJaNiwoaCrqyuIRCJhwIABglQq1XTIxTJv3jxBJBIJL168KLDuxo0bBXt7+1KISv1ycnKEb775RtDT0xN0dHSEypUrCw4ODkLDhg0FBwcHwdjYWNDR0RH09PSEGTNmaDrcYlm8eLEgEomEf/75p8C6e/bsETw8PEohqpJRET5PQahYn+kPP/wgVKtWTfatal1dXcHIyEjQ1dWVfZOzatWqwubNmzUdarFs3rxZsLe3F+Li4gqs+9tvvwk+Pj6lEFXp4KZ0AgCEhIQgODgYERERSEhIkJ2LYmVlBRcXF3h5ecHNzU3TYRbbu3fv8PLlS1hbW0NXV1fT4ZS4+Ph4HDlyROnn2adPnwp1tpi24+dZvrx//x7nz59HeHh4np9nx44dIZFINB0mFRETKiIiIiIVcVM6EZEWyczMRGpqarn7htR/VZR5UvnBhIoAfDjgc+zYsWjRogVq1qwJc3Nz1KxZEy1atMCYMWNw+vRpTYeoFhVlnoVx7NixIp0Zo43KwxyzsrKwY8cOdOnSBRYWFpBIJDAzM4NEIoGFhQU6d+6M7du3a33iUVHmWVg//vgjOnbsqOkwSlR5myNv+VVw7969w4ABA3DixAkYGRnBxcUFVlZWkEgkeP/+PRISEhAREYF3796ha9euOHjwoFZ+y6aizLMolixZgnnz5pWbQ/Xyou1zfPnyJbp06YKIiAg4OjrCzc1N4fc2JCQEMTExaNKkCU6dOgULCwtNh11kFWWeRaHtv7uFUe7mqMkd8aR5X331lSCRSIQdO3YIGRkZedbJyMgQduzYIRgYGAhfffVVKUeoHhVlnkVR3p6jlRdtn+Pw4cMFc3Nz4cyZM/nWO3PmjGBubi54e3uXUmTqVVHmWRTa/rtbGOVtjlyhquCsrKwwZsyYQj36Yc6cOdixYweeP39eCpGpV0WZZ506dQpd982bN3j9+rXW/euwIswxV9WqVfH1118X6jDLZcuWYdWqVXj16lUpRKZeFWWeYrG4yG207Xe3IsxRGR7sWcGlpqaiVq1ahaprY2ODtLS0Eo6oZFSUecbFxaFmzZpo3LhxgXUfPHiA169fl3xQalYR5pgrIyMDlStXLlTdypUrIyMjo4QjKhkVZZ5isRiffPIJOnXqVGDdsLAwhISElEJU6lUR5qiUppfISLPatGkjuLq6Cm/fvs233tu3b4VmzZoJbdu2LaXI1KuizNPZ2bnQsWvrcntFmGOurl27CnXr1hWePn2ab72nT58KDg4OQrdu3UopMvWqKPN0dXUVWrRoUai62vq7WxHmqAxXqCq4lStXolOnTnBycsLw4cPh6uoKKysr6OvrQyqVIiEhAWFhYfjxxx+RnJyMM2fOaDrkYqko83Rzc8O+ffuQnZ1drKV3bVAR5phr3bp1+N///gcnJyf06tULzZs3z/P39tixYzA0NMSaNWs0HXKxVJR5urm5YefOnZBKpQU+kB5AoR8WXZZUhDkqpemMjjQvPDxc6N69u+wRM7mPRMh9DIKurq7QvXt34caNG5oOVSUVYZ6nTp0SfHx8hISEhALr3rx5UwgKCiqFqNSrIszxY0+fPhXGjx8vVK9eXRCJRAovS0tLYfz48cKTJ080HapKKsI8Q0JChAULFgiJiYkF1v3nn3+ECxculEJU6lUR5qgMN6WTTFpaGm7duqXwKARnZ2eYmJhoOjy1qSjzpPInPj5e4ffW2tpa02GpXUWZJ5UvvOVHMqmpqUhJSUFycrLsf2QSiQRpaWnlKtGoKPN89uwZIiIiEB8fL5untbU1XFxcys1z3yrCHD9mbW2tNLFIS0tDSkoKbG1tSzkq9aso88xPRZhnuZujppfISPMuX74stGnTRu7218cvHR0doXXr1sKlS5c0HapKOM/yM8+KMMeiKm8bfJXhPMuP8jZHrlBVcGfOnEGPHj1gZ2eHJUuW5HlC8bVr1xAUFISOHTvi+PHjhfo6bFnDeZafeVaEORKR9uEeqgquZcuWqFSpEs6ePZvvNzIyMjLQoUMHZGdn49q1a6UYoXpwnvK0eZ4VYY65du/eXei6R48exeHDh7XykETOU5G2zrMizFEpTS+RkWYZGBgI27dvL1Tdbdu2CQYGBiUcUcngPBVp6zwrwhxz5d6+zOtbb3m9tPX2CedZfuZZEeaoDG/5VXBmZmZ48OBBoeo+ePAAZmZmJRxRyeA8FWnrPCvCHHOZmZnBxcUFK1euLLBuQEAAtm7dWgpRqR/nqUhb51kR5qgME6oKbtiwYVi7di2qV6+OMWPGwNjYWKHO27dvsW3bNqxbtw5Tpkwp/SDVgPP8P9o+z4owx1xubm64e/cuXF1dC6x74sSJUoioZHCeirR1nhVhjsowoargFi1ahLi4OEyfPh0zZ86Eo6OjwgnFMTExyMrKQv/+/bFo0SJNh1wsnGf5mWdFmGMuNzc3nDx5EomJibC0tMy3rqmpqdZ+/ZzzVKSt86wIc1SGm9IJABASEoLg4GBEREQoHKjn4uICLy8vuLm5aTpMlXGe5WeeFWGO7969w8uXL2FtbQ1dXV1Nh1NiOM/yoyLMURkmVEREREQq0tF0AERERETajgkVERERkYqYUBERERGpiAkVERERkYqYUBERaSmRSASRSIQFCxZoOhSiCo/nUBFRmfDu3Tvs2bMHR48eRWRkJF69egVBEGBiYgJ7e3s0atQIrVq1Qrdu3WBjY6PpcImI5DChIiKNu3r1KgYNGoS4uDiFay9fvsTLly8RFhaGwMBAVK9eHc+fP9dAlEREyjGhIiKNiomJQdeuXZGWlgYA6N27N7y8vODo6Ag9PT28fPkSkZGROH36NM6fP6/haImI8saEiog06ttvv5UlU4GBgfDx8VGo07lzZ/j5+SEpKQkHDhwo5QiJiArGTelEpDHZ2dk4fvw4AKB58+Z5JlMfs7CwwJdfflkKkRERFQ0TKiLSmKSkJKSnpwMAHBwcit1PRkYGfvvtN0ycOBEtWrSAmZkZdHV1UbVqVbi7u2PBggV4+fJlvn3Y29tDJBLJkrobN25g6NChsLGxgYGBARwcHDBt2jSFfq5cuYL+/fvD1tYWEokEn3zyCWbOnClbdcuLh4cHRCIRPDw8AAD37t3D2LFjUbt2bUgkElhZWWHAgAG4du1asX8mH7tx4wbGjRsHJycnGBsbw8jICE5OThg/fjxiYmLUMgZRhScQEWnIq1evBAACAKFJkybF7mfEiBGyfpS9qlatKly6dElpH3Z2dgIAYcSIEcLu3bsFPT29PPtxdHQUEhISBEEQBH9/f0EkEuVZr1mzZkJaWlqeY7Vv314AILRv3174/fffBSMjozz70NHREdauXas05tx68+fPz/N6dna2MHXqVKUxAhAqVaokbN26tdA/ayLKG1eoiEhjzM3NYWdnBwCIjIzEihUrkJOTU+R+srKyUKdOHUyfPh379+/H1atXERoaiuDgYIwbNw56enp49eoV+vbti8TExHz7ioyMxOjRo+Hg4ICdO3ciNDQU586dw7BhwwB82ETv5+eHQ4cO4euvv4a7uzv27t2LsLAwnDhxAj169ADwYVVo8eLF+Y4VHx+PIUOGoFKlSli6dCmuXLmCK1euYMmSJTAxMUFOTg6mTp2KI0eOFPlnAgCTJk3C2rVrIQgC2rVrh507d+LChQsICQnB9u3b0bBhQ2RlZeGLL77A0aNHizUGEf1/ms7oiKhiW7VqldyKib29vfDVV18J+/btEx49elSoPh48eCDk5OQovX7z5k3B2NhYACDMmTMnzzq5K1QAhNatWwvv3r1TqOPl5SUAEMRisWBubi7069dPyMrKkquTlZUltGzZUrYqlpmZqdBP7goVAKFKlSpCdHS0Qp2oqCjBxMREACDUrFlTyMjIUKiDfFaoTp06Jbu+Y8eOPOecnp4udOzYUQAg2NnZ5RkrERUOEyoi0qjs7Gxh1KhRSm9JVa9eXRg4cKBw9OjRfJOmgkyZMkUAIDg7O+d5PTehEolEeSY4giAI586dk8VlaGgovHr1Ks96O3fulNWLjIxUuP5xQrVq1SqlMa9YsUJW7+DBgwrX80uochOlfv36Ke1fEAQhOjpa1s+pU6fyrUtEyvGWHxFplI6ODgICAnDq1Cl069YNlSrJn+by4sUL7N+/H71794abmxsePnxYYJ8pKSl4+PAhbt++jaioKERFRcHU1BQAEB0djczMTKVtGzdujPr16+d5rUmTJrI/d+7cGebm5gXWe/TokdKxRCIRRowYofT6yJEjIRKJAABnzpxRWu+/UlNTceHCBQCAl5dXvnXr16+PatWqAfhwwCoRFQ/PoSKiMqFz587o3LkzUlNTcfnyZYSGhiIsLAx//vkn3rx5AwAICwvD//73P/z999+wsrKSa3/r1i2sXbsWf/zxR74nqefk5CAlJQWWlpZ5Xnd0dFTaNjcpK0q9/L7tV7t2bVkykxcLCwvY29vj8ePHuHXrltJ6/xUeHi7bizZ48GAMHjy4UO14Aj1R8XGFiojKFBMTE3Tv3h3z5s3D0aNH8eLFC+zcuRNmZmYAgISEBMydO1euTUBAAJo1a4bAwMBCJQW5RzXkxdDQUOk1HR2dItfLzs5WWk9ZUvex6tWrAwCSk5MLrJuroI33yvz777/FakdEXKEiojJOX18fI0eOhLW1Nbp16wYAOHToELZt2wYdHR3cvXsX48aNQ1ZWFiwtLfH111+jY8eOsLe3R+XKlaGrqwsA2LlzJ3x9fQEAgiBobD4fy72dp24fJ3Fbt25F69atC9UuN2kloqJjQkVEWqFr166wsbHBkydPkJKSglevXsHCwgJBQUHIysqCWCzGxYsXUa9evTzbF2WFp7S8ePGi0HWU7dfKS9WqVWV/NjQ0hLOzc9GDI6Ii4S0/ItIa1tbWsj/nru7cvn0bwIeN4MqSKeDD/quy5vHjx3j16pXS60lJSYiNjQWAIiVFLi4usp/P5cuXVYqRiAqHCRURaYV///0X0dHRAD7ss8pdhcnKygIAvHv3TmnbhISEMnlwpSAI2L17t9LrQUFBstuTnTp1KnS/FhYWaNmyJQDgp59+QlJSkmqBElGBmFARkca8ffsW7u7uOHbsWL4npOfk5GDSpEmyb8z17t1btgJTt25dAMD9+/dx5coVhbb//vsvhgwZku9GdE1atGgR7t27p1B+584dLFmyBABgZWWFPn36FKnfOXPmAPhwhIKXlxdev36ttK5UKsWmTZvw/v37Io1BRP+He6iISKNCQkLw2WefoWbNmvD09ESrVq1gZ2eHypUr4/Xr1wgPD8fOnTtlxwZUqVIFixYtkrUfPnw4NmzYgJycHPTs2RNff/012rZtC4lEgr///htr167F/fv30aZNmzJ3+8vBwQFJSUlo2bIlZs6cKXtY8oULF7B8+XLZcREbNmyAnp5ekfru0aMHJk+ejPXr1+PPP/9E/fr1MW7cOLRt2xZVq1bFu3fv8ODBA/z11184dOgQUlJS8j0Ti4jyx4SKiDSmUqVKqFGjBp4/f45nz55h06ZN2LRpk9L6devWxc8//wx7e3tZWYsWLbBw4ULMnz8fr1+/xrfffqvQbvr06XB2di5zCVXNmjWxbt06DBgwALNmzVK4rqOjg5UrV6Jfv37F6n/t2rUwNzfHokWL8Pz5cyxYsEBpXSMjI4jF4mKNQ0S85UdEGiSRSPDs2TNcvnwZCxcuRPfu3VGnTh3ZX+4mJiaoV68eBg4ciJ9++glRUVFwdXVV6GfevHk4fvw4unTpAjMzM+jp6aFWrVr4/PPPcerUKaxatUoDsyucnj17IiwsDCNHjoSdnR309PRgaWmJfv364dKlS5g+fXqx+xaJRJg3bx5iYmIwY8YMNG/eHObm5hCLxahcuTIaNGiAoUOHYteuXUhISICBgYEaZ0ZUsYiEsnIgCxFRBeHh4YGLFy+iffv2skfEEJF24woVERERkYqYUBERERGpiAkVERERkYqYUBERERGpiAkVERERkYr4LT8iIiIiFXGFioiIiEhFTKiIiIiIVMSEioiIiEhFTKiIiIiIVMSEioiIiEhFTKiIiIiIVMSEioiIiEhFTKiIiIiIVPT/ANFdOL8pd0GaAAAAAElFTkSuQmCC", "text/plain": [ "<Figure size 640x480 with 1 Axes>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Plotting the original probability distribution, and the QCBM prediction probability\n", "\n", "qcbm_probs = qcbm.get_probabilities(result[\"x\"])\n", "\n", "plt.bar(range(2**n_qubits), data, label=\"target probability\", alpha=1, color=\"tab:blue\")\n", "plt.bar(range(2**n_qubits), qcbm_probs, label=\"QCBM probability\", alpha=0.8, color=\"tab:green\")\n", "plt.xticks(list(range(len(data))), labels, rotation=\"vertical\", size=12)\n", "plt.yticks(size=12)\n", "\n", "plt.xlabel(\"Sample\", size=20)\n", "plt.ylabel(\"Probability\", size=20)\n", "\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Great! As expected, the QCBM probability distribution closes matches the target distribution. " ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Task Summary\n", "{} \n", "\n", "Estimated cost to run this example: 0.00 USD\n" ] } ], "source": [ "print(\"Task Summary\")\n", "print(f\"{tracker.quantum_tasks_statistics()} \\n\")\n", "print(f\"Estimated cost to run this example: {tracker.qpu_tasks_cost() + tracker.simulator_tasks_cost():.2f} USD\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note: Charges shown are estimates based on your Amazon Braket simulator and quantum processing unit (QPU) task usage. Estimated charges shown may differ from your actual charges. Estimated charges do not factor in any discounts or credits, and you may experience additional charges based on your use of other services such as Amazon Elastic Compute Cloud (Amazon EC2)." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3.9.5 64-bit ('braket')", "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.9.5" }, "vscode": { "interpreter": { "hash": "5904cb9a2089448a2e1aeb5d493d227c9de33e591d7c07e4016fb81e71061a5d" } } }, "nbformat": 4, "nbformat_minor": 4 }