{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Bell State Generator\n", "This notebook examines a lossy bell-state generator, similar to that shown in Figure 1 of (bartolucci2021).\n", "\n", "First, the required modules are imported." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", "import lightworks as lw\n", "from lightworks import emulator" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "The circuit for this can be built in the following way, in which modes 0-3 are the inputs, all containing a single photon and modes 4-7 are ancilla. This is not a physical circuit, and instead some re-arrangement of the modes would be required." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "0\n", "1\n", "2\n", "3\n", "4\n", "5\n", "6\n", "7\n", "\n", "\n", "\n", "\n", "\n", "\n", "BS\n", "r = 0.5\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "PS\n", "φ = π/2\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "BS\n", "r = 0.5\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "BS\n", "r = 0.5\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "PS\n", "φ = π/2\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "BS\n", "r = 0.5\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "BS\n", "r = 0.5\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "PS\n", "φ = π/2\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "BS\n", "r = 0.5\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "BS\n", "r = 0.5\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "PS\n", "φ = π/2\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "BS\n", "r = 0.5\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "BS\n", "r = 0.5\n", "\n", "\n", "\n", "\n", "PS\n", "φ = π/2\n", "\n", "\n", "\n", "\n", "\n", "BS\n", "r = 0.5\n", "\n", "\n", "\n", "\n", "\n", "BS\n", "r = 0.5\n", "\n", "\n", "\n", "\n", "PS\n", "φ = π/2\n", "\n", "\n", "\n", "\n", "\n", "BS\n", "r = 0.5\n", "\n", "\n", "\n", "\n", "\n", "BS\n", "r = 0.5\n", "\n", "\n", "\n", "\n", "PS\n", "φ = 0\n", "\n", "\n", "\n", "\n", "\n", "BS\n", "r = 0.5\n", "\n", "\n", "\n", "\n", "\n", "\n", "BS\n", "r = 0.5\n", "\n", "\n", "\n", "\n", "PS\n", "φ = π/2\n", "\n", "\n", "\n", "\n", "\n", "BS\n", "r = 0.5\n", "\n", "\n", "\n", "\n", "\n", "\n", "BS\n", "r = 0.5\n", "\n", "\n", "\n", "\n", "PS\n", "φ = π/2\n", "\n", "\n", "\n", "\n", "\n", "BS\n", "r = 0.5\n", "\n", "\n", "\n", "\n", "\n", "BS\n", "r = 0.5\n", "\n", "\n", "\n", "\n", "PS\n", "φ = 0\n", "\n", "\n", "\n", "\n", "\n", "BS\n", "r = 0.5\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "circ = lw.PhotonicCircuit(8)\n", "\n", "# Assigned per-element loss to 0.05\n", "loss = lw.Parameter(0.05, label=\"loss\")\n", "\n", "for i in range(4):\n", " circ.bs(i, 4 + i, loss=loss)\n", " circ.ps(i, np.pi / 2)\n", " circ.bs(i, 4 + i, loss=loss)\n", "\n", "circ.bs(4, 5, loss=loss)\n", "circ.ps(4, np.pi / 2)\n", "circ.bs(4, 5, loss=loss)\n", "\n", "circ.bs(6, 7, loss=loss)\n", "circ.ps(6, np.pi / 2)\n", "circ.bs(6, 7, loss=loss)\n", "\n", "circ.bs(5, 6, loss=loss)\n", "circ.ps(5, 0)\n", "circ.bs(5, 6, loss=loss)\n", "\n", "circ.bs(4, 5, loss=loss)\n", "circ.ps(4, np.pi / 2)\n", "circ.bs(4, 5, loss=loss)\n", "\n", "circ.bs(6, 7, loss=loss)\n", "circ.ps(6, np.pi / 2)\n", "circ.bs(6, 7, loss=loss)\n", "\n", "circ.bs(5, 6, loss=loss)\n", "circ.ps(5, 0)\n", "circ.bs(5, 6, loss=loss)\n", "\n", "circ.display()" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Sampling\n", "In this case, we use the heralding function to select a particular measurement outcome from the ancilla modes. We then use the min_detection option to ensure that 4 photons total leave the circuit." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "in_state = lw.State([1, 1, 1, 1, 0, 0, 0, 0])\n", "herald_func = lambda s: s[4] == 1 and s[5] == 1 and s[6] == 0 and s[7] == 0\n", "\n", "N_rep = 100000\n", "sampler = lw.Sampler(\n", " circ,\n", " in_state,\n", " N_rep,\n", " post_selection=herald_func,\n", " min_detection=4,\n", " random_seed=10,\n", ")\n", "\n", "backend = emulator.Backend(\"slos\")\n", "results = backend.run(sampler)\n", "\n", "states, counts = [], []\n", "for s, c in results.items():\n", " states.append(s[:4])\n", " counts.append(c)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "As can be seen from the plot below, for the measurement pattern [1,1,0,0] on the ancilla modes, we usually get the states |1,0,0,1> and |0,1,1,0> across the other 4 modes, which is as expected. If we convert this to dual rail encoded qubits, then this corresponds to the state |01> + |10>, which is a bell state, showing the generator works correctly. We can also see how loss in the circuit leads to some errors presenting themselves in the operation." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjkAAAGdCAYAAADwjmIIAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAMX5JREFUeJzt3XtUVXX+//EXoBzwcg7hBSLxUjoVXTQx8VRTWeSpqNHJJnNcSWa5dLCVMqY5U1h9p6XLVqWmZZNjWN8azfmNXSQxwttUpIYyKSVZWTpjB+kCR1FB4fP7o8X+ehKMi4h8fD7WOmt19ue99/7s/Wmf83Kz9z4hxhgjAAAAy4S2dAcAAACaAyEHAABYiZADAACsRMgBAABWIuQAAAArEXIAAICVCDkAAMBKbVq6Ay2purpae/fuVceOHRUSEtLS3QEAAPVgjNH+/fsVFxen0NC6z9ec0SFn7969io+Pb+luAACARtizZ4+6detWZ/sZHXI6duwo6aed5Ha7W7g3AACgPgKBgOLj453v8bqc0SGn5k9UbrebkAMAQCvzS5eacOExAACwEiEHAABYiZADAACsRMixzKxZsxQSEqJJkyY507788kv99re/VZcuXeR2u3XHHXeouLg4aL7PP/9cQ4cOVefOneV2u3XVVVdp7dq1Tvv333+vG2+8UXFxcXK5XIqPj9fEiRMVCASCllNRUaE///nP6tGjh1wul3r27KnFixc36zafKRo7tlu2bNENN9ygqKgoderUSePGjdOBAwec9vqO7YIFC3ThhRcqMjJS559/vl5++eVm3V4AaCpCjkU2b96sF154QZdeeqkzrby8XEOGDFFISIjWrFmjDz74QJWVlbr11ltVXV3t1N1yyy06evSo1qxZo/z8fPXt21e33HKL/H6/JCk0NFRDhw7VW2+9pc8//1yZmZl67733NH78+KA+3HHHHcrNzdXf/vY3FRUV6e9//7vOP//8U7MDLNbYsd27d6+Sk5PVu3dvbdy4UdnZ2SosLNTdd9/tLKc+Y/v8889r+vTpevTRR1VYWKjHHntMaWlpevvtt0/ZPgCABjNnsLKyMiPJlJWVtXRXmmz//v2mT58+Jicnx1xzzTXmgQceMMYYs3r1ahMaGhq0jaWlpSYkJMTk5OQYY4wpKSkxksyGDRucmkAgYCQ5NbWZO3eu6datm/N+1apVxuPxmO+///4kb92ZrSlj+8ILL5iuXbuaqqoqp+aTTz4xkszOnTvrXOfPx9br9ZopU6YE1aSnp5srr7zyZGwiADRIfb+/OZNjibS0NKWkpCg5OTloekVFhUJCQuRyuZxpERERCg0N1fvvvy9J6tSpk/Pnh/Lych09elQvvPCCunbtqsTExFrXt3fvXv3zn//UNddc40x76623NGDAAM2ePVvnnHOOfvWrX2nKlCk6dOhQM2zxmaMpY1tRUaHw8PCgJ4JGRkZKklPzc7WNbUVFhSIiIoLqIiMjtWnTJh05cqRpGwgAzYSQY4GlS5dqy5Ytmjlz5nFtgwYNUvv27TVt2jQdPHhQ5eXlmjJliqqqqvTtt99K+uk5A++99562bt2qjh07KiIiQk8//bSys7N11llnBS1v5MiRateunc455xy53W4tWrTIafvqq6/0/vvva/v27VqxYoXmzJmjf/zjH/rDH/7QvDvAYk0d2+uuu05+v19PPvmkKisr9eOPP+qhhx6SJKemxonG1ufzadGiRcrPz5cxRh9//LEWLVqkI0eO6LvvvmvGPQAAjUfIaeX27NmjBx54QK+++upx/9KWpC5dumj58uV6++231aFDB3k8HpWWlqp///7Ov+6NMUpLS1PXrl31r3/9S5s2bdKwYcN06623HvdF+Mwzz2jLli1688039eWXXyo9Pd1pq66uVkhIiF599VUNHDhQN998s55++mktWbKEszmNcDLG9qKLLtKSJUv01FNPqV27doqNjVWvXr0UExNz3O+9nGhsH3nkEd10000aNGiQ2rZtq6FDhyo1NVWSTvi7MQDQok7JH89OUzZck7NixQojyYSFhTkvSSYkJMSEhYWZo0ePOrUlJSXmxx9/NMYYExMTY2bPnm2MMea999477toOY4zp3bu3mTlzZp3r/te//mUkmb179xpjjBk9erQ577zzgmo+/fRTI8l8/vnnJ2NzzygnY2yP5ff7zf79+82BAwdMaGioef311+tc98/HtkZlZaXZs2ePOXr0qHnuuedMx44dg673AYBTob7f32f0zzrY4Prrr9e2bduCpo0ZM0YXXHCBpk2bprCwMGd6586dJUlr1qzRvn379Jvf/EaSdPDgQUnH/4s8NDQ06A6sn6tpq6iokCRdeeWVWr58uQ4cOKAOHTpI+unW9NDQ0BP+gBpqdzLG9lgxMTGSpMWLFysiIkI33HBDnev++djWaNu2rTOWS5cu1S233MKZHACnr4YkpxkzZhhJQa/zzz/faT906JD5wx/+YKKjo0379u3NbbfdZvx+f9AyvvnmG3PzzTebyMhI06VLFzNlyhRz5MiRoJq1a9eayy67zISHh5vzzjvPvPTSS8f1Zf78+aZHjx7G5XKZgQMHmo0bNzZkU4wxdpzJqc2xd+AYY8zixYtNXl6e+eKLL8wrr7xioqOjTXp6utNeUlJiOnXqZG677TZTUFBgioqKzJQpU0zbtm1NQUGBMcaYrKwss3jxYrNt2zaza9cus3LlSnPhhRcG3V2zf/9+061bN3P77bebwsJCs379etOnTx9z7733nrJtt11Dx9YYY5599lmTn59vioqKzPz5801kZKSZO3eu016fsS0qKjKvvPKK+fzzz83GjRvNiBEjTHR0tNm1a1dzbzIAHKe+398NDjkXXXSR+fbbb51XSUmJ0z5+/HgTHx9vcnNzzccff2wGDRpkrrjiCqf96NGj5uKLLzbJyclm69at5p133jGdO3c206dPd2q++uor065dO5Oenm4+/fRT8+yzz5qwsDCTnZ3t1CxdutSEh4ebxYsXm8LCQnPfffeZqKgoU1xc3JDNOWNCzrRp00xMTIxp27at6dOnj3nqqadMdXV10DybN282Q4YMMdHR0aZjx45m0KBB5p133nHa16xZY7xer/F4PCYiIsL06dPHTJs2zfkTSY3PPvvMJCcnm8jISNOtWzeTnp5uDh482Jybe0ZpzNjeddddJjo62oSHh5tLL73UvPzyy0Ht9RnbTz/91PTr189ERkYat9tthg4danbs2NGcmwoAdWq2kNO3b99a20pLS03btm3N8uXLnWmfffaZkWTy8vKMMca88847JjQ0NOjszvPPP2/cbrepqKgwxhgzdepUc9FFFwUte8SIEcbn8znvBw4caNLS0pz3VVVVJi4u7oTXjxhjzOHDh01ZWZnz2rNnj5UhBwAAmzXbc3J27typuLg4nXvuuRo1apR2794tScrPz9eRI0eCnuVxwQUXqHv37srLy5Mk5eXl6ZJLLnGuDZB+ujU1EAiosLDQqfn580B8Pp+zjMrKSuXn5wfVhIaGKjk52ampy8yZM+XxeJxXfHx8QzcfAAC0Eg268DgpKUmZmZk6//zz9e233+qxxx7Tr3/9a23fvl1+v1/h4eGKiooKmicmJsb5aQC/3x8UcGraa9pOVBMIBHTo0CH9+OOPqqqqqrVmx44dJ+z/9OnTg26LDQQCBB00WM+Hslq6C2esr2eltHQXALQiDQo5N910k/Pfl156qZKSktSjRw+9/vrrzlNUT2culyvo6bDNiS/ClsMXIQBAauLDAKOiovSrX/1KX3zxhWJjY1VZWanS0tKgmuLiYsXGxkqSYmNjj/uF5Jr3v1TjdrsVGRmpzp07KywsrNaammUAAAA0KeQcOHBAX375pc4++2wlJiaqbdu2ys3NddqLioq0e/dueb1eSZLX69W2bdu0b98+pyYnJ0dut1sJCQlOzbHLqKmpWUZ4eLgSExODaqqrq5Wbm+vUAAAANCjkTJkyRevXr9fXX3+tDz/8UL/97W8VFhamkSNHyuPxaOzYsUpPT9fatWuVn5+vMWPGyOv1atCgQZKkIUOGKCEhQXfddZf+/e9/a/Xq1Xr44YeVlpbm/Blp/Pjx+uqrrzR16lTt2LFDzz33nF5//XVNnjzZ6Ud6erpefPFFLVmyRJ999pkmTJig8vJyjRkz5iTuGgAA0Jo16Jqc//znPxo5cqS+//57denSRVdddZU++ugjdenSRdJPv30TGhqq4cOHq6KiQj6fT88995wzf1hYmFauXKkJEybI6/Wqffv2Sk1N1eOPP+7U9OrVS1lZWZo8ebLmzp2rbt26adGiRfL5fE7NiBEjVFJSooyMDPn9fvXr10/Z2dnHXYwMAADOXCHGGNPSnWgpgUBAHo9HZWVlcrvdJ3XZXHjccpr7wmPGtuVwUTkAqf7f3/zoDAAAsBIhBwAAWImQAwAArETIAQAAViLkAAAAKxFyAACAlQg5AADASoQcAABgJUIOAACwEiEHAABYiZADAACsRMgBAABWIuQAAAArEXIAAICVCDkAAMBKhBwAAGAlQg4AALASIQcAAFiJkAMAAKxEyAEAAFYi5AAAACsRcgAAgJUIOQAAwEqEHAAAYCVCDgAAsBIhBwAAWImQAwAArETIAQAAViLkAAAAKxFyAACAlQg5AADASoQcAABgJUIOAACwEiEHAABYiZADAACsRMgBAABWIuQAAAArEXIAAICVCDkAAMBKhBwAAGAlQg4AALASIQcAAFiJkAMAAKxEyAEAAFYi5AAAACsRcgAAgJUIOQAAwEqEHAAAYCVCDgAAsBIhBwAAWImQAwAArETIAQAAViLkAAAAKxFyAACAlQg5AADASoQcAABgJUIOAACwEiEHAABYiZADAACs1KSQM2vWLIWEhGjSpEnOtMOHDystLU2dOnVShw4dNHz4cBUXFwfNt3v3bqWkpKhdu3bq2rWrHnzwQR09ejSoZt26derfv79cLpd69+6tzMzM49a/YMEC9ezZUxEREUpKStKmTZuasjkAAMAijQ45mzdv1gsvvKBLL700aPrkyZP19ttva/ny5Vq/fr327t2r2267zWmvqqpSSkqKKisr9eGHH2rJkiXKzMxURkaGU7Nr1y6lpKRo8ODBKigo0KRJk3Tvvfdq9erVTs2yZcuUnp6uGTNmaMuWLerbt698Pp/27dvX2E0CAAAWaVTIOXDggEaNGqUXX3xRZ511ljO9rKxMf/vb3/T000/ruuuuU2Jiol566SV9+OGH+uijjyRJ7777rj799FP97//+r/r166ebbrpJ//M//6MFCxaosrJSkrRw4UL16tVLTz31lC688EJNnDhRt99+u5555hlnXU8//bTuu+8+jRkzRgkJCVq4cKHatWunxYsXN2V/AAAASzQq5KSlpSklJUXJyclB0/Pz83XkyJGg6RdccIG6d++uvLw8SVJeXp4uueQSxcTEODU+n0+BQECFhYVOzc+X7fP5nGVUVlYqPz8/qCY0NFTJyclOTW0qKioUCASCXgAAwE5tGjrD0qVLtWXLFm3evPm4Nr/fr/DwcEVFRQVNj4mJkd/vd2qODTg17TVtJ6oJBAI6dOiQfvzxR1VVVdVas2PHjjr7PnPmTD322GP121AAANCqNehMzp49e/TAAw/o1VdfVURERHP1qdlMnz5dZWVlzmvPnj0t3SUAANBMGhRy8vPztW/fPvXv319t2rRRmzZttH79es2bN09t2rRRTEyMKisrVVpaGjRfcXGxYmNjJUmxsbHH3W1V8/6XatxutyIjI9W5c2eFhYXVWlOzjNq4XC653e6gFwAAsFODQs7111+vbdu2qaCgwHkNGDBAo0aNcv67bdu2ys3NdeYpKirS7t275fV6JUler1fbtm0LugsqJydHbrdbCQkJTs2xy6ipqVlGeHi4EhMTg2qqq6uVm5vr1AAAgDNbg67J6dixoy6++OKgae3bt1enTp2c6WPHjlV6erqio6Pldrt1//33y+v1atCgQZKkIUOGKCEhQXfddZdmz54tv9+vhx9+WGlpaXK5XJKk8ePHa/78+Zo6daruuecerVmzRq+//rqysrKc9aanpys1NVUDBgzQwIEDNWfOHJWXl2vMmDFN2iEAAMAODb7w+Jc888wzCg0N1fDhw1VRUSGfz6fnnnvOaQ8LC9PKlSs1YcIEeb1etW/fXqmpqXr88cedml69eikrK0uTJ0/W3Llz1a1bNy1atEg+n8+pGTFihEpKSpSRkSG/369+/fopOzv7uIuRAQDAmSnEGGNauhMtJRAIyOPxqKys7KRfn9PzoaxfLkKz+HpWSrMun7FtOc09tgBah/p+f/PbVQAAwEqEHAAAYCVCDgAAsBIhBwAAWImQAwAArETIAQAAViLkAAAAKxFyAACAlQg5AADASoQcAABgJUIOAACwEiEHAABYiZADAACsRMgBAABWIuQAAAArEXIAAICVCDkAAMBKhBwAAGAlQg4AALASIQcAAFiJkAMAAKxEyAEAAFYi5AAAACsRcgAAgJUIOQAAwEqEHAAAYCVCDgAAsBIhBwAAWImQAwAArETIAQAAViLkAAAAKxFyAACAlQg5AADASoQcAABgJUIOAACwEiEHAABYiZADAACsRMgBAABWIuQAAAArEXIAAICVCDkAAMBKhBwAAGAlQg4AALASIQcAAFiJkAMAAKxEyAEAAFYi5AAAACsRcgAAgJUIOQAAwEqEHAAAYCVCDgAAsBIhBwAAWImQAwAArETIAQAAViLkAAAAKxFyAACAlQg5AADASoQcAABgJUIOAACwEiEHAABYqUEh5/nnn9ell14qt9stt9str9erVatWOe2HDx9WWlqaOnXqpA4dOmj48OEqLi4OWsbu3buVkpKidu3aqWvXrnrwwQd19OjRoJp169apf//+crlc6t27tzIzM4/ry4IFC9SzZ09FREQoKSlJmzZtasimAAAAyzUo5HTr1k2zZs1Sfn6+Pv74Y1133XUaOnSoCgsLJUmTJ0/W22+/reXLl2v9+vXau3evbrvtNmf+qqoqpaSkqLKyUh9++KGWLFmizMxMZWRkODW7du1SSkqKBg8erIKCAk2aNEn33nuvVq9e7dQsW7ZM6enpmjFjhrZs2aK+ffvK5/Np3759Td0fAADAEiHGGNOUBURHR+vJJ5/U7bffri5duui1117T7bffLkna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IuQAAAArEXIAAICVCDkAAMBKDQ45GzZs0K233qq4uDiFhITojTfeCGo3xigjI0Nnn322IiMjlZycrJ07dwbV/PDDDxo1apTcbreioqI0duxYHThwIKjmk08+0a9//WtFREQoPj5es2fPPq4vy5cv1wUXXKCIiAhdcskleueddxq6OQAAwFINDjnl5eXq27evFixYUGv77NmzNW/ePC1cuFAbN25U+/bt5fP5dPjwYadm1KhRKiwsVE5OjlauXKkNGzZo3LhxTnsgENCQIUPUo0cP5efn68knn9Sjjz6qv/71r07Nhx9+qJEjR2rs2LHaunWrhg0bpmHDhmn79u0N3SQAAGChEGOMafTMISFasWKFhg0bJumnszhxcXH64x//qClTpkiSysrKFBMTo8zMTN1555367LPPlJCQoM2bN2vAgAGSpOzsbN188836z3/+o7i4OD3//PP685//LL/fr/DwcEnSQw89pDfeeEM7duyQJI0YMULl5eVauXKl059BgwapX79+WrhwYa39raioUEVFhfM+EAgoPj5eZWVlcrvdjd0Nter5UNZJXR7q7+tZKc26fMa25TT32AJoHQKBgDwezy9+f5/Ua3J27dolv9+v5ORkZ5rH41FSUpLy8vIkSXl5eYqKinICjiQlJycrNDRUGzdudGquvvpqJ+BIks/nU1FRkX788Uen5tj11NTUrKc2M2fOlMfjcV7x8fFN32gAAHBaOqkhx+/3S5JiYmKCpsfExDhtfr9fXbt2DWpv06aNoqOjg2pqW8ax66irpqa9NtOnT1dZWZnz2rNnT0M3EQAAtBJtWroDp5LL5ZLL5WrpbgAAgFPgpJ7JiY2NlSQVFxcHTS8uLnbaYmNjtW/fvqD2o0eP6ocffgiqqW0Zx66jrpqadgAAcGY7qSGnV69eio2NVW5urjMtEAho48aN8nq9kiSv16vS0lLl5+c7NWvWrFF1dbWSkpKcmg0bNujIkSNOTU5Ojs4//3ydddZZTs2x66mpqVkPAAA4szU45Bw4cEAFBQUqKCiQ9NPFxgUFBdq9e7dCQkI0adIk/eUvf9Fbb72lbdu2afTo0YqLi3PuwLrwwgt144036r777tOmTZv0wQcfaOLEibrzzjsVFxcnSfr973+v8PBwjR07VoWFhVq2bJnmzp2r9PR0px8PPPCAsrOz9dRTT2nHjh169NFH9fHHH2vixIlN3ysAAKDVa/A1OR9//LEGDx7svK8JHqmpqcrMzNTUqVNVXl6ucePGqbS0VFdddZWys7MVERHhzPPqq69q4sSJuv766xUaGqrhw4dr3rx5TrvH49G7776rtLQ0JSYmqnPnzsrIyAh6ls4VV1yh1157TQ8//LD+9Kc/qU+fPnrjjTd08cUXN2pHAAAAuzTpOTmtXX3vs28MnqXScnhOjr14Tg4AqYWekwMAAHC6IOQAAAArEXIAAICVCDkAAMBKhBwAAGAlQg4AALASIQcAAFiJkAMAAKxEyAEAAFYi5AAAACsRcgAAgJUIOQAAwEqEHAAAYCVCDgAAsBIhBwAAWImQAwAArETIAQAAViLkAAAAKxFyAACAlQg5AADASoQcAABgJUIOAACwEiEHAABYiZADAACsRMgBAABWIuQAAAArEXIAAICVCDkAAMBKhBwAAGAlQg4AALASIQcAAFiJkAMAAKxEyAEAAFYi5AAAACsRcgAAgJUIOQAAwEqEHAAAYCVCDgAAsBIhBwAAWImQAwAArETIAQAAViLkAAAAKxFyAACAlQg5AADASoQcAABgJUIOAACwEiEHAABYiZADAACsRMgBAABWIuQAAAArEXIA4DS0YcMG3XrrrYqLi1NISIjeeOMNp+3IkSOaNm2aLrnkErVv315xcXEaPXq09u7dW+uyKioq1K9fP4WEhKigoODUbADqdKKxlSRjjDIyMnT22WcrMjJSycnJ2rlzZ1DNE088oSuuuELt2rVTVFTUqet8K0PIAYDTUHl5ufr27asFCxYc13bw4EFt2bJFjzzyiLZs2aJ//vOfKioq0m9+85talzV16lTFxcU1d5dRTycaW0maPXu25s2bp4ULF2rjxo1q3769fD6fDh8+7NRUVlbqd7/7nSZMmHCqut0qtWnpDgAAjnfTTTfppptuqrXN4/EoJycnaNr8+fM1cOBA7d69W927d3emr1q1Su+++67+3//7f1q1alWz9hn1c6KxNcZozpw5evjhhzV06FBJ0ssvv6yYmBi98cYbuvPOOyVJjz32mCQpMzPzlPS5teJMDgBYoKysTCEhIUF/uiguLtZ9992nV155Re3atWu5zqHedu3aJb/fr+TkZGeax+NRUlKS8vLyWrBnrRMhBwBaucOHD2vatGkaOXKk3G63pJ/OCNx9990aP368BgwY0MI9RH35/X5JUkxMTND0mJgYpw31R8gBgFbsyJEjuuOOO2SM0fPPP+9Mf/bZZ7V//35Nnz69BXsHtCxCDgC0UjUB55tvvlFOTo5zFkeS1qxZo7y8PLlcLrVp00a9e/eWJA0YMECpqakt1WX8gtjYWEk//anxWMXFxU4b6o+QAwCtUE3A2blzp9577z116tQpqH3evHn697//rYKCAhUUFOidd96RJC1btkxPPPFES3QZ9dCrVy/FxsYqNzfXmRYIBLRx40Z5vd4W7FnrxN1VAHAaOnDggL744gvn/a5du1RQUKDo6GidffbZuv3227VlyxatXLlSVVVVzvUa0dHRCg8PD7rDSpI6dOggSTrvvPPUrVu3U7chOM6JxrZ79+6aNGmS/vKXv6hPnz7q1auXHnnkEcXFxWnYsGHOPLt379YPP/yg3bt3q6qqynn+Ue/evZ2xhgUhZ8GCBXryySfl9/vVt29fPfvssxo4cGBLdwsAmuTjjz/W4MGDnffp6emSpNTUVD366KN66623JEn9+vULmm/t2rW69tprT1U30QgnGtvMzExNnTpV5eXlGjdunEpLS3XVVVcpOztbERERzjwZGRlasmSJ8/6yyy6TxPj/XIgxxrR0Jxpr2bJlGj16tBYuXKikpCTNmTNHy5cvV1FRkbp27fqL8wcCAXk8HpWVlQX9Lftk6PlQ1kldHurv61kpzbp8xrblNPfYAmgd6vv93aqvyXn66ad13333acyYMUpISNDChQvVrl07LV68uKW7BgAAWlir/XNVZWWl8vPzg26PDA0NVXJycp0PTKqoqFBFRYXzvqysTNJPifBkq644eNKXifppjvE8FmPbcppzbC+esbrZlo0T2/6Yr1mXz9i2nOYa25rPgl/6Y1SrDTnfffedqqqqan1g0o4dO2qdZ+bMmc6jsI8VHx/fLH1Ey/DMaekeoLkwtnZiXO3V3GO7f/9+eTyeOttbbchpjOnTpzsXeElSdXW1fvjhB3Xq1EkhISEt2LPTSyAQUHx8vPbs2XPSr1VCy2Fc7cXY2ouxrZ0xRvv37//FH55ttSGnc+fOCgsLa9ADk1wul1wuV9A0fqK+bm63m4PKQoyrvRhbezG2xzvRGZwarfbC4/DwcCUmJgY9MKm6ulq5ubk8MAkAALTeMznST88WSE1N1YABAzRw4EDNmTNH5eXlGjNmTEt3DQAAtLBWHXJGjBihkpISZWRkyO/3q1+/fsrOzj7uYmQ0jMvl0owZM4770x5aN8bVXoytvRjbpmnVDwMEAACoS6u9JgcAAOBECDkAAMBKhBwAAGAlQg4AALASIec0tm7dOvXs2bOlu4FmwNjaiXG1F2PbOhFyWpEffvhBo0aNktvtVlRUlMaOHasDBw6ccJ6//vWvuvbaa+V2uxUSEqLS0tJfXM+GDRt06623Ki4uTiEhIXrjjTfq1b9169apf//+crlc6t27tzIzM+s1H6QnnnhCV1xxhdq1a1fvp3AbY5SRkaGzzz5bkZGRSk5O1s6dO39xvgULFqhnz56KiIhQUlKSNm3adML6wsJCDR8+XD179lRISIjmzJlTr/7h1I0rx+ypd6o+jyWO2aYg5LQio0aNUmFhoXJycrRy5Upt2LBB48aNO+E8Bw8e1I033qg//elP9V5PeXm5+vbtqwULFtR7nl27diklJUWDBw9WQUGBJk2apHvvvVerV//fr//u3btXR48erfcyzySVlZX63e9+pwkTJtR7ntmzZ2vevHlauHChNm7cqPbt28vn8+nw4cN1zrNs2TKlp6drxowZ2rJli/r27Sufz6d9+/bVOc/Bgwd17rnnatasWXX+ZApjW7tTNa4cs6feqfo85phtIoPT1tq1a02PHj2MMcZ8+umnRpLZvHmz075q1SoTEhJi/vvf/9ZrWZLMjz/+2KA+SDIrVqz4xbqpU6eaiy66KGjaiBEjjM/nc94/+uijJiYmxvzxj380n3zySYP6YZtjx/ZYL730kvF4PL84f3V1tYmNjTVPPvmkM620tNS4XC7z97//vc75Bg4caNLS0pz3VVVVJi4uzsycObNe/e7Ro4d55plnjpvO2P6kpcb1WByzzaOlPo85ZpuGMzmtRF5enqKiojRgwABnWnJyskJDQ7Vx48YW7NlP8vLylJycHDTN5/MpLy/PeT9t2jTNnTtXn332mfr376/+/ftr3rx5KikpOdXdbfV27dolv98ftM89Ho+SkpKC9vmxKisrlZ+fHzRPaGiokpOT65ynvhjbk6Mx49pYHLONd6o+jzlmm46Q00r4/X517do1aFqbNm0UHR0tv9/fQr36P36//7if04iJiVEgENChQ4ckSRERERoxYoSysrL03//+V6NHj1ZmZqbOOeccDRs2TCtWrDgzTp+eBDVjXts+r+v/h++++05VVVUNmqe+GNuTozHj2pR1ccw2zqn6POaYbTpCDlpE165dNWnSJG3ZskVvvvmm8vLydNttt2n79u0t3TU0EWNrJ8bVXjaPLSGnlYiNjT3uQrOjR4/qhx9+qPPCslMpNjZWxcXFQdOKi4vldrsVGRl5XP3+/fv10ksv6brrrtOtt96qiy++WEuWLFFCQsKp6nKrVjPmte3zuv5/6Ny5s8LCwho0T2Mwto3XmHFtyro4ZhvnVH0ec8w2HSGnlfB6vSotLVV+fr4zbc2aNaqurlZSUlIL9uwnXq9Xubm5QdNycnLk9Xqd91VVVVq1apV+//vfKyYmRrNmzdL111+vr776Srm5uRo9erTCw8NPdddbpV69eik2NjZonwcCAW3cuDFonx8rPDxciYmJQfNUV1crNze3znnqi7E9ORozro3FMdt4p+rzmGP2JGjpK59Rt5/fqXHjjTeayy67zGzcuNG8//77pk+fPmbkyJEnXMa3335rtm7dal588UUjyWzYsMFs3brVfP/993XOs3//frN161azdetWI8k8/fTTZuvWreabb76pc56vvvrKtGvXzjz44IPms88+MwsWLDBhYWEmOzvbqXn88ceNx+Mx48aNMx988EH9d4SFfj6233zzjdm6dat57LHHTIcOHZz9v3///jqXMWvWLBMVFWXefPNN88knn5ihQ4eaXr16mUOHDtU5z9KlS43L5TKZmZnm008/NePGjTNRUVHG7/fXOU9FRYXTn7PPPttMmTLFbN261ezcudOpYWx/0lLjyjHb/Frq85hjtmkIOaexnx9U33//vRk5cqTp0KGDcbvdZsyYMcd9WEoyL730kvN+xowZRtJxr2NrrrnmGpOamhq03trmObZmxowZx90qu3btWtOvXz8THh5uzj333KB1GGPMrl27TvhBfSb5+dimpqbWus/Xrl3r1PTo0cPMmDHDeV9dXW0eeeQRExMTY1wul7n++utNUVFR0Hp+PrbGGPPss8+a7t27m/DwcDNw4EDz0UcfBbWnpqaaa665xnm/a9euWvv28xrGtuXGlWO2+bXU57ExHLNNQcg5jdX1zI26fPXVV6ZNmzbm888/b9B6unfvftyH2y8ZPXr0cQci6q+hY1teXm4iIiKCvhzrozFje/XVVwd96aL+Tudx5ZhtmtP585hjtm5tmuNPYGgZ77zzjsaNG6c+ffrUe57CwkJ5PB6NHj263vMYY7Ru3Tq9//77jekmGmHt2rW67rrrdO2119Z7nsaMbVlZmb788ktlZWU1opdoqFM1rhyzp96p+jzmmD2xEGOMaelOoHbr1q3T3Xffra+//rqlu4KTjLG1E+NqL8a2deLuqtNYz549NWnSpJbuBpoBY2snxtVejG3rxJkcAABgJc7kAAAAKxFyAACAlQg5AADASoQcAABgJUIOAACwEiEHAABYiZADAACs9P8Bc9uAxklcM6wAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "bars = plt.bar(range(len(states)), counts)\n", "plt.bar_label(bars, counts)\n", "plt.xticks(range(len(states)), states)\n", "plt.show()" ] } ], "metadata": { "kernelspec": { "display_name": "venv", "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.6" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 }