{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Boson sampling\n",
"Boson sampling was first proposed in (Aaronson2010) as a near-term way of demonstrating quantum advantage, primarily targetted at photon systems. This is possible as calculating the output probability distribution of n-photons into a linear interferometer requires calculation of the permanent of the unitary which is programmed into the interferometer. The calculation of the permanent is #P-hard, marking this very expensive to compute classically for larger systems.\n",
"\n",
"Artemis consists of a multi-photon input generator and a universal interferometer, making it ideal for testing this approach to quantum computing."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import lightworks as lw\n",
"from lightworks import remote\n",
"\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"\n",
"try:\n",
" remote.token.load(\"main_token\")\n",
"except remote.TokenError:\n",
" print(\n",
" \"Token could not be automatically loaded, this will need to be \"\n",
" \"manually configured.\"\n",
" )"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Setup\n",
"\n",
"To demonstrate boson sampling on the system, we'll start by generating a random 20 x 20 unitary. There is an included function within Lightworks for this."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"unitary = lw.random_unitary(20, seed=111)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Plotting this unitary, it can be seen how it has a real and imaginary component, both of which are distributed across all inputs and outputs of the interferometer (i.e. it is not a sparse matrix). "
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA94AAAHoCAYAAAC/0TeyAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAQdlJREFUeJzt3QecVfWdN/7f9KEX6UWwAAoqKipiiRpdS4xGTWxPXEvU7Lox/+RhdQ15Ys8/JDExZfVRkw2i61qzitnokliCJYgG0ERsAQQBaaL0MgMz93mdk50RhEGQ348pvt+v12Hm3nvuh3Pm3Hu+93vaLSoUCoUAAAAAJFGcJhYAAADIaLwBAAAgIY03AAAAJKTxBgAAgIQ03gAAAJCQxhsAAAAS0ngDAABAQhpvAAAASEjjDQAAAAlpvIHNPPjgg6Fz585h1apVnzjjnHPOCWeddVbU6QIA4lHvYefReEMzNnbs2FBUVFQ/lJaWht69e4cLL7wwvPvuu58os6amJlx77bXh61//emjbtm39/Vn+5ZdfvsXn/PrXv84fnzBhQv19V111VfjP//zP8Oc///kTTQcAsGm9nzx5crRM9R52Lo03tAA33HBD+Pd///dw++23h5NOOincc8894aijjgrr1q3b7qz/+q//Cm+99Vb46le/ukPTdMABB4SDDjoo/PjHP96hHAAgPvUedi6NN7QAWbN93nnnhUsuuST827/9W7jiiivCzJkzw29+85vtzrrzzjvD4Ycfnu8531HZoWcPP/zwDh3CBgDEp97DzqXxhhboyCOPzH9mzXedN998M3zpS1/Kz+WqrKzMt05/tDHP9pCPHz8+HHfccVGm4+/+7u/C6tWrwxNPPBElDwAI+Sll2eHhc+bMCZ///Ofz37MG+tZbb80ff/XVV8NnP/vZ0KZNm9CvX79w7733bvJ89R52Po03tECzZ8/Of3bq1Cn/+dprr4VDDz00vPHGG+Fb3/pWfjhYVoxPO+208Mgjj9Q/b8qUKaG6ujoceOCBUaZj8ODBoVWrVuGPf/xjlDwA4MNztLMj3vr27Rt++MMfhv79++fnZmfng5944on5BvYf/OAHoV27duH8888Ps2bNqn+ueg87X2kj/J9AZMuXLw9LlizJt2C/+OKL4frrrw8VFRX5VvDMN77xjbDrrruGP/3pT/n9mX/6p38KRxxxRH5RlNNPP71+r3hmt912izJd2cXesg8Er7/+epQ8AOBvspqfnWY2atSo/Pb/+l//K/Tq1St85StfCffdd184++yz6/dG77XXXuGuu+4K1113XX6feg87nz3e0AJkh4p17do1L3rZ4eTZ3uzsMPI+ffqEDz74IDz99NP5+VcrV67MG/RseP/998MJJ5wQpk+fXn8F9Oy+jfeUx5BlZf8fABBXdm2XOh07dgyDBg3KPwNs/PVe2X3ZY2+//Xb9feo97Hz2eEMLkJ3TNXDgwHzP95gxY8Kzzz5bv2d7xowZoVAohKuvvjoftmTx4sWbXFwlG/+TyL5i5KOyrC3dDwB8ctn1WrKN7hvr0KFDvtH9o3U3u3/p0qWbZaj3sPNovKEFOOSQQ/JzuTLZedvZIeTZIWfZ14TU1tbm92dXOs/2cG/Jnnvumf/cZZdd8p9Zcc4K98ayRn7t2rVbfP6aNWvqPwR8VJY1YMCAHZo/AGBTJSUl23X/xk22eg87n8YbWpis4I4ePTocc8wx4ZZbbsnP9cqUlZV97NVLs3PAMtkFWPbdd99NHsuuipo18ltSd382zsY2bNgQ5s6dG0499dQdmicAIB71HnY+53hDC3T00Ufne8F/+tOfhvbt2+e377jjjrBgwYLNxn3vvffqfx82bFgoLy8PkydP3my8z33uc2HSpEn5lVA3tmzZsvAf//EfYf/99w89evTY5LHsIivZxV8OO+ywqPMHAHxy6j3sfBpvaKGuvPLKsGjRovxrRbJzwLNDzLKt2tnVT3/5y1+G7373u+Hkk0/eZC94dujY8ccfH5588snN8rKvIcsK7Wc+85kwcuTI8Itf/CK/OmpWgLOG/uabb97sOdn3ebZu3Tq/oioA0DSo97DzOdQcWqgzzjgj7LHHHuFHP/pRuPTSS/Ot2tnXjGWNeHY1027duoUDDjggXHPNNZs8Lzs0/Ytf/GJ+yFh2lfQ63bt3z7+qLCu+Dz74YN7UZ3vTs63bDzzwQBg+fPhm0/DQQw/l05F9hygA0HSo97BzFRU+6eUMgRappqYmDB48OP8qkhtvvPET57zyyivhwAMPDFOnTs23kgMATYd6DzuXxhvYTLZF+7LLLgtz5swJbdu2/UQZ55xzTn5F9WxrOQDQ9Kj3sPNovAEAACAhF1cDAACAhDTeAAAAkJDGGwAAABLSeAMAAEBCLeJ7vLMrKc6fPz//7sCioqLGnhwACNm1S1euXBl69eoViott545BvQegudb6FtF4Z0W4b9++jT0ZALCZuXPnhj59+jT2ZLQI6j0AzbXWt4jGO9vyndn3rKtDSVlltNwlwzeE2M496MXomb+5/4iQQlFt/Mw1+62Nnlk6pzJ+5pr4e1IKCXbOtH03/rcBDrr09ZDCK48MiZ7Z6a310TPnnVkTPbP03Yromet3ib9+6tnng5DCsondo2eefNoL0TN/87tDo+bVVq0Ls394Y32NYsfV/S373/bPobhVvPdVUXH8dWnPMeXRM6s6pPnYdtE1j0bP/Mm9Z0TP7PX86uiZq69aFT3zgxVtomeGv36y79jemtL4H8lyhQQH+LRaEv89+sH+8ev94L3mRc9cs74seub8Sb1DCtV9q6Jnls+Pvy4tWRvvQ3lN1brw9r/esE21vkU03nWHm2VNd0l5vCasuFX8D7YVbeO/eUoq4jeeqRrv4tbxV5zFlfHnv6SmeTTeJeXx/57lbeOv4FK9TkvLSqJnFreKX4iLK+M33inWT6Vt4k9nqmWfYl2aYl2ScUh0/L9l1nQXt45Y7xM03qWl8delNWVpPra1alvaPNb5pQk2jLaJvwG3eEP8eS9K8Vknwee8VI13is87Kep9WZv47/vS9Qkaz0T1rrhV/HpXXJlg/muLGqXWO+kMAAAAEtJ4AwAAQEIabwAAAGiOjfett94a+vfvHyorK8Pw4cPDSy+9tNXxH3roobDXXnvl4++7777h8ccfTzVpAEAEaj0ANGLj/cADD4SRI0eGa6+9NkydOjUMHTo0nHDCCWHx4sVbHH/ixInh3HPPDRdffHF4+eWXw2mnnZYP06ZNSzF5AMAOUusBoJEb75tvvjlceuml4aKLLgqDBw8Ot99+e2jdunUYM2bMFsf/2c9+Fk488cRw5ZVXhr333jvceOON4cADDwy33HJLiskDAHaQWg8Ajdh4V1dXhylTpoTjjjvuw/+kuDi//cILW/7e1ez+jcfPZFvNGxq/qqoqrFixYpMBANg5dkatz6j3ALQU0RvvJUuWhJqamtC9e/dN7s9uL1y4cIvPye7fnvFHjx4dOnToUD/07ds34hwAAI1d6zPqPQAtRbO8qvmoUaPC8uXL64e5c+c29iQBAJGp9wC0FKWxA7t06RJKSkrCokWLNrk/u92jR48tPie7f3vGr6ioyAcAYOfbGbU+o94D0FJE3+NdXl4ehg0bFp566qn6+2pra/PbI0aM2OJzsvs3Hj/zxBNPNDg+ANB41HoAaOQ93pns60UuuOCCcNBBB4VDDjkk/PSnPw2rV6/Or3yaOf/880Pv3r3zc7cy3/jGN8JRRx0VfvzjH4eTTz453H///WHy5MnhF7/4RYrJAwB2kFoPAI3ceJ999tnhvffeC9dcc01+0ZT9998/jB8/vv6iKnPmzMmvflrnsMMOC/fee2/4zne+E7797W+HAQMGhHHjxoV99tknxeQBADtIrQeARm68M5dffnk+bMmECRM2u+/MM8/MBwCgeVDrAaAFX9UcAAAAmguNNwAAACSk8QYAAIDmeI53Y1jZtyiUVBbFC6yNmPU/Hr7nqOiZG9qEJNoevCR65uql8Se241+jR4ael8yMnvnXJ/aIntn70hnRMydMGxRSaFMWP7Ns5frombv8oVX0zJrK6JFhafdC9Mx3Z3cJKbRKsIn3vpeGR89stTbyOr8qfg3hb3b/ztJQWhzv+70X3Bq/Ni06qF30zO6Tq0IK/3bVGdEzO1TWRs+c+aX46+cev4q/gm593vLomWWz4q/z15y6IqRQ/EKH6JklCV767f8avw16tWjX6Jl9fhe/lhx05eshhT/NjT//Xf4cfznVXPR+vKzV2/7itMcbAAAAEtJ4AwAAQEIabwAAAEhI4w0AAAAJabwBAAAgIY03AAAAJKTxBgAAgIQ03gAAAJCQxhsAAAAS0ngDAABAQhpvAAAASEjjDQAAAAlpvAEAACAhjTcAAAAkpPEGAACAhDTeAAAAkJDGGwAAABLSeAMAAEBCGm8AAABISOMNAAAACZWGFqTjjNpQWlYbLW/hLkUhtjW9401fneJ18aczs2pyl+iZV509Lnrmj8qOi555Sqd3omded/Fvomeed8f/jp7ZZVEhpFCxsiZ65oH/+kr0zFc+6BM9871f942eGdbH327ate/SkMIHq3eJnlk5vyx65to+G6Lm1a6Nm8eH3rq6ayhuVRktr7A4wX6I3eIv//VvloQUVuwa/+NgxbIEtaQofubyPeL/TdfM6xA9s8Pp8dfPne9sH1IorlofPXPpwPjr/JDgJdr27fjvpSVDo0eG6tv3jh8aQuh53oLomcvPq46euWxBx2hZtWvXbfO49ngDAABAQhpvAAAASEjjDQAAAAlpvAEAACAhjTcAAAAkpPEGAACAhDTeAAAAkJDGGwAAABLSeAMAAEBCGm8AAABISOMNAAAACWm8AQAAICGNNwAAACSk8QYAAICENN4AAACQkMYbAAAAEtJ4AwAAQHNqvEePHh0OPvjg0K5du9CtW7dw2mmnhbfeemurzxk7dmwoKiraZKisrIw9aQBABGo9ADRy4/3MM8+Er33ta2HSpEnhiSeeCOvXrw/HH398WL169Vaf1759+7BgwYL64Z133ok9aQBABGo9AGyf0hDZ+PHjN9vCnW0NnzJlSvjMZz7T4POyLd89evSIPTkAQGRqPQA0cuP9UcuXL89/du7ceavjrVq1KvTr1y/U1taGAw88MHzve98LQ4YM2eK4VVVV+VBnxYoVf/u/9igOJRXxduLvdcuiENs7o+MfVld4uUNIYe0eH/6NY/nB5BOiZxaXFKJn3vnnEdEzH3z5s9Ez//6iJ6Jn3jvzoJDCxQOfjZ75q7cPj565/vddmsWattOfS6JnbuiV5rIfRTVF0TPLVkWPDLvstiRq3obVVWFe+HRIUeu3Vu/LZ1WGkop49fTzp70QYnv69kOjZy44LKRRiF9H1ybYvtJ2Tvx1VHF19MhQ8V789XPffZZFz5zfpVNI4fIr/jN65s1vHhs9c/0r8ee/apea6JmF0vjvz8r30rSAwzu/Gz3zqf88OHpm+7XxsmqqapvGxdWywvrNb34zHH744WGfffZpcLxBgwaFMWPGhEcffTTcc889+fMOO+ywMG/evAbPLevQoUP90Ldv34RzAQDs7FqfUe8BaCmSNt7Z+V/Tpk0L999//1bHGzFiRDj//PPD/vvvH4466qjw8MMPh65du4Y77rhji+OPGjUq37peN8ydOzfRHAAAjVHrM+o9AC1FskPNL7/88vDb3/42PPvss6FPnz7b9dyysrJwwAEHhBkzZmzx8YqKinwAABpPylqfUe8BaCmi7/EuFAp5IX7kkUfC008/HXbbbbftzqipqQmvvvpq6NmzZ+zJAwB2kFoPAI28xzs75Ozee+/Nz+HKvt9z4cKF+f3ZuVmtWrXKf88ONevdu3d+7lbmhhtuCIceemjYc889w7Jly8JNN92Uf8XIJZdcEnvyAIAdpNYDQCM33rfddlv+8+ijj97k/jvvvDNceOGF+e9z5swJxcUf7mxfunRpuPTSS/PC3alTpzBs2LAwceLEMHjw4NiTBwDsILUeABq58c4OP/s4EyZM2OT2T37yk3wAAJo+tR4AmtBVzQEAAODTTuMNAAAACWm8AQAAICGNNwAAACSk8QYAAICENN4AAACQkMYbAAAAEtJ4AwAAQEIabwAAAEhI4w0AAAAJabwBAAAgIY03AAAAJKTxBgAAgIQ03gAAAJBQaWhBassLIVQUouVNv65diK1ofW30zPX9q0MK3bsvj565+ulu0TPXHbgmemaPrvHn/b1uldEznz11cPTMNZd1DClU7rU+ema7n8Z/j/a5cVr0zAXf2iN6Zofvzo2eOXvsgJBCjw/ir/favr0ieuabQzpHzatduy5qHh/qe/jcUNqmIlrer6ccFGIr7xs9MpTuvip+aAih4rn469JCSfTIsL5N/MwuszZEz6zqHP/j9Wsv94+eWbxnSOL6P54aPbPjy+XRM9f1jtcz1ClUxK93pcviv57WHxv/c27m948dHD2zeu/4tbRkYbz6Ubtu219H9ngDAABAQhpvAAAASEjjDQAAAAlpvAEAACAhjTcAAAAkpPEGAACAhDTeAAAAkJDGGwAAABLSeAMAAEBCGm8AAABISOMNAAAACWm8AQAAICGNNwAAACSk8QYAAICENN4AAACQkMYbAAAAEtJ4AwAAQEIabwAAAEhI4w0AAAAJabwBAAAgodLQgqzvUBuKW9VGyyueXxlia73n8uiZbZ5rG1Kofa5r9MxVR1VHz+zzUEX0zKWDekTPrN13bfTM6d/rGD2zULsupHDD786Inrl7TfzX06yb9o6euejE+Ns4T2n9QfTMIf/fsyGFu188LHpm61mdomd2frEQNa+muibMi5pInRmze4TiVvFqdHGrDSG2YZ+dET1zQNvFIYX/nHJU9MziQ5dGz1y7sF30zHndi6Jnlq6Muy7JdBv0XvTMorvif87LLNujPHpm15fXRM+sLWsdPXPAL+K/R2ed1zt6ZtVf24ckWsV/7ZfMj/85f5dp8aazproQZm/juPZ4AwAAQEIabwAAAEhI4w0AAAAJabwBAAAgIY03AAAAJKTxBgAAgObUeF933XWhqKhok2Gvvfba6nMeeuihfJzKysqw7777hscffzz2ZAEAkaj1ANAE9ngPGTIkLFiwoH54/vnnGxx34sSJ4dxzzw0XX3xxePnll8Npp52WD9OmTUsxaQBABGo9ADRy411aWhp69OhRP3Tp0qXBcX/2s5+FE088MVx55ZVh7733DjfeeGM48MADwy233JJi0gCACNR6AGjkxnv69OmhV69eYffddw9f/vKXw5w5cxoc94UXXgjHHXfcJvedcMIJ+f0NqaqqCitWrNhkAAB2ntS1PqPeA9BSRG+8hw8fHsaOHRvGjx8fbrvttjBr1qxw5JFHhpUrV25x/IULF4bu3btvcl92O7u/IaNHjw4dOnSoH/r27Rt7NgCARqz1GfUegJYieuN90kknhTPPPDPst99++dbs7OIpy5YtCw8++GC0/2PUqFFh+fLl9cPcuXOjZQMAjV/rM+o9AC1Faer/oGPHjmHgwIFhxowZW3w8Oy9s0aJFm9yX3c7ub0hFRUU+AACNL0Wtz6j3ALQUyb/He9WqVWHmzJmhZ8+eW3x8xIgR4amnntrkvieeeCK/HwBo+tR6ANjJjfcVV1wRnnnmmTB79uz860NOP/30UFJSkn+NSOb888/PDx2r841vfCM/R+zHP/5xePPNN/PvBp08eXK4/PLLY08aABCBWg8AjXyo+bx58/LC+/7774euXbuGI444IkyaNCn/PZNd9bS4+MN+/7DDDgv33ntv+M53vhO+/e1vhwEDBoRx48aFffbZJ/akAQARqPUA0MiN9/3337/VxydMmLDZfdkFWrIBAGj61HoAaGLneAMAAMCnmcYbAAAAEtJ4AwAAQHP+Hu+dadBNc0JpcXm0vLf/tVuIreR3HaNnLh26IaRw1vCXomc+9Nzw6Jnv71MSPbNySSF6ZtXcyuiZtfFnPdR0qY4fmr32q4uiZ87+fLz3e50++y6Mn/nDXaJnvjjl4OiZSwckeEFlBsR/TdUcsDJ65ppp7aLm1VTFf83zN51eLg0l5fE+wtSWlIXYXgz9o2e+37NNSKEowceIle+1jZ45+Pvx188r74i/3iv/fqfombPL4n8mreyfZh1VkuBjxKxTWkXPbPNu9Mgw86Je0TP7Pb4qeua7R8V/f+aGL48eWTG+ffTM4ojrvNqa7fh/4/23AAAAwEdpvAEAACAhjTcAAAAkpPEGAACAhDTeAAAAkJDGGwAAABLSeAMAAEBCGm8AAABISOMNAAAACWm8AQAAICGNNwAAACSk8QYAAICENN4AAACQkMYbAAAAEtJ4AwAAQEIabwAAAEhI4w0AAAAJabwBAAAgIY03AAAAJKTxBgAAgIRKQwuy8qC+obSsMlpe9bz42yXO+cdnomfe/ZfhIYXnF+0ePbPQpiZ6Zvn0kuiZZatCs1DUe230zF2eahVSqNqlKHrmhlbxM995u1v0zBHXT4+eOX91h+iZFQ/3DCn0va0qeuZbX423rq/T7sClUfOK18Sfb/5mfZuiUFsR7/1fSLAbomRu/Nfoopd2DSn0mrQyeubiI9dHz3z9Wz2iZ3a7J8FniP/zbvTMoim9o2eu6VkbUijuEn/dV/56/M8m67pEjwzV/ePP++yT20TP7H/1xJDCoq8fFj1z+cD4r9O+T8brR0rWb3uWPd4AAACQkMYbAAAAEtJ4AwAAQEIabwAAAEhI4w0AAAAJabwBAAAgIY03AAAAJKTxBgAAgIQ03gAAAJCQxhsAAAAS0ngDAABAQhpvAAAASEjjDQAAAAlpvAEAACAhjTcAAAAkpPEGAACAhDTeAAAA0Jwa7/79+4eioqLNhq997WtbHH/s2LGbjVtZWRl7sgCASNR6ANg+pSGyP/3pT6Gmpqb+9rRp08Lf/d3fhTPPPLPB57Rv3z689dZb9bezggwANE1qPQA0cuPdtWvXTW5///vfD3vssUc46qijGnxOVnx79OgRe1IAgATUegBo5MZ7Y9XV1eGee+4JI0eO3OqW7VWrVoV+/fqF2tracOCBB4bvfe97YciQIQ2OX1VVlQ91VqxYkf+cf0pNKG714Rb4HTXp2J+E2EY8c3n0zKKFaQ7XW/Z6q+iZZe0K0TPbLIy3zOt8cNaa6JnlU9tFz1z7Xvxlv/tFfw0pTL9vUPTMQ7/45+iZT/91YPTM1369d/TMtd3jv5c27FsbUqjqFP+1335a9MiwoU2nqHk1VevCp0GqWr+1el+2qhBKquO9B5YmeO13mRL/MjrV8d9KuRlfj/9xsENRdfTMkvbxM1f3ah09c+1/94me2fv19dEzV/ZN0waccNmU6Jn3rTskeube/zw9euaC87a+TvskVveJX++n3zo8pFCyMv60HjLiwyOlYpkxba9oWTXVpU3j4mrjxo0Ly5YtCxdeeGGD4wwaNCiMGTMmPProo3nhzgryYYcdFubNm9fgc0aPHh06dOhQP/Tt2zfRHAAAjVHrM+o9AC1F0sb7V7/6VTjppJNCr169GhxnxIgR4fzzzw/7779/fojaww8/nB/CdscddzT4nFGjRoXly5fXD3Pnzk00BwBAY9T6jHoPQEuR7FDzd955Jzz55JN5cd0eZWVl4YADDggzZsxocJyKiop8AAAaT8pan1HvAWgpku3xvvPOO0O3bt3CySefvF3Py66S+uqrr4aePXummjQAIAK1HgAasfHOzt3KivEFF1wQSks33ameHWqWHTpW54Ybbgi///3vw9tvvx2mTp0azjvvvHwL+iWXXJJi0gCACNR6AGjkQ82zw87mzJkTvvKVr2z2WHZ/cfGH/f7SpUvDpZdeGhYuXBg6deoUhg0bFiZOnBgGDx6cYtIAgAjUegBo5Mb7+OOPD4XCli8nP2HChE1u/+QnP8kHAKD5UOsBoIlc1RwAAAA+7TTeAAAAkJDGGwAAABLSeAMAAEBCGm8AAABISOMNAAAACWm8AQAAICGNNwAAACSk8QYAAICENN4AAACQkMYbAAAAEtJ4AwAAQEIabwAAAEioNLQgpQvKQ3FlebS8biVtQmzF8yujZxZ6rwspFC9qFT2zpnUhembfb06Pnjl/2h7RM8sTzHvbfsujZ87/6Z4hheWnxH+dPjd+aPTMivXRI8OKARuiZ/bbc3H0zM6Vq0MKry2L/5qqLS+KnrmuZ9zlVLs2/nLnbwolfxtiaT89Ytj/WLp3/HV+z4lpXlPdpsaf1sXDdome2S7B7F/29XHRM8f8/6dGzyy7YmH0zOWv9A4pTFvRK3pm0ar4LcvCu3tEz1z9Wvz30n6Hx/+c+5d34y+jzIZC/N7hzX/fK3pmoW28zxA11dueZY83AAAAJKTxBgAAgIQ03gAAAJCQxhsAAAAS0ngDAABAQhpvAAAASEjjDQAAAAlpvAEAACAhjTcAAAAkpPEGAACAhDTeAAAAkJDGGwAAABLSeAMAAEBCGm8AAABISOMNAAAACWm8AQAAICGNNwAAACSk8QYAAICENN4AAACQkMYbAAAAEioNLcju/74olJZURMs79PV/DLG1bxM9Muz3mRnxQ0MIE6oHRs9s/0q85VNn+huDomf2WFmInrmqd1H0zLVr4v8925THn85M2bz401rVY330zH67vRc9c1DHRdEzf//nfaJnDjtwTkhhxgcDomeWro7/Hu3yl7iv/Q3ri8K8qInUWdUvhOLKeHk1bWpCbP0fjZ+5+IDykELnz8Zf71Xc0yp6ZvWXlkbP/L//97Tomd1mrYmeOX16z+iZlSvS7H+bNq1f9MwOf40/rcs6tI2e2W5R/M9Qb/x3/M/jPY5aEFJYOiX+33TtsSujZ66fE68hq11Xu83j2uMNAAAACWm8AQAAICGNNwAAACSk8QYAAICENN4AAACQkMYbAAAAEtJ4AwAAQFNqvJ999tlwyimnhF69eoWioqIwbty4TR4vFArhmmuuCT179gytWrUKxx13XJg+ffrH5t56662hf//+obKyMgwfPjy89NJL2ztpAEAEaj0ANHLjvXr16jB06NC8eG7JD3/4w/Dzn/883H777eHFF18Mbdq0CSeccEJYt25dg5kPPPBAGDlyZLj22mvD1KlT8/zsOYsXL97eyQMAdpBaDwCN3HifdNJJ4bvf/W44/fTTN3ss2wL+05/+NHznO98JX/jCF8J+++0X7r777jB//vzNtpZv7Oabbw6XXnppuOiii8LgwYPzQt66deswZsyYLY5fVVUVVqxYsckAAMTRFGp9Rr0HoKWIeo73rFmzwsKFC/NDzup06NAhP5zshRde2OJzqqurw5QpUzZ5TnFxcX67oeeMHj06z60b+vbtG3M2AIBGrvUZ9R6AliJq450V4kz37t03uT+7XffYRy1ZsiTU1NRs13NGjRoVli9fXj/MnTs32jwAAI1f6zPqPQAtRWlohioqKvIBAGi51HsAWoqoe7x79OiR/1y0aNEm92e36x77qC5duoSSkpLteg4A0DjUegBo5MZ7t912ywvoU089VX9fdiGU7IqnI0aM2OJzysvLw7BhwzZ5Tm1tbX67oecAAI1DrQeAnXCo+apVq8KMGTM2ucjKK6+8Ejp37hx23XXX8M1vfjO/EuqAAQPy4nz11Vfn3wN62mmn1T/n2GOPza+Uevnll+e3s68XueCCC8JBBx0UDjnkkPxqqdlXmWRXPgUAdi61HgAaufGePHlyOOaYY+pvZ4U0kxXTsWPHhn/5l3/JC+lXv/rVsGzZsnDEEUeE8ePHh8rKyvrnzJw5M7/QSp2zzz47vPfee+Gaa67JL7Ky//7758/56EVYAID01HoAaOTG++ijj86/w7MhRUVF4YYbbsiHhsyePXuz+7It4nVbxQGAxqPWA0ATPscbAAAA2JTGGwAAABLSeAMAAEBTOse7KXvvM91DSfmHF3bZUUuHNHx+2ydVvqwoeubUhX1CCmULy6NnrupfGz2z7xM10TMXDi+Lnlm927romZWvt46euc83/hxSeHLqkOiZFZ3i/02rfxX/O4X/2L9X9MwH/vFn0TNHXpnm3NuyCz68wFYsS5e2jZ5Z1GlV1LyaNVUh/FfUSP5HTWVtKLSKV08KZfFr07zPxq8jvf9QHVJYVNYzeuZpI5+PnvnoQ0dEzyxqEz0ylM2Jv84LZfFrU3XH+K/7TOny+Pv1lh0Q/7Xfu8fS6JlLOse/WGRVt/ifc4ufiP+ez6zuF39aw/z4b9KbTrk3WtaalTXhwm9v27j2eAMAAEBCGm8AAABISOMNAAAACWm8AQAAICGNNwAAACSk8QYAAICENN4AAACQkMYbAAAAEtJ4AwAAQEIabwAAAEhI4w0AAAAJabwBAAAgIY03AAAAJKTxBgAAgIQ03gAAAJCQxhsAAAAS0ngDAABAQhpvAAAASEjjDQAAAAlpvAEAACCh0tCCLB9QCMWVhWh5RRtCdNUdaqNnVs1rH1Jo80FR9MzWi6JHhnfOjP83DTXV0SMH3FYTPXPR8OiRYf7Zu8QPDSHs1WFl9Mx518V/jW6ojJ+5emD819M/vnpe9MzaniUhhQ1/7BI9s9PSeOv6Oss/Ezezdk2avychlK0oDsXV8fYdVPeKv35e32199MxVX18RUqisjb/ee3rBwOiZrd5L8L7fI3pkmH5T5+iZHZ8tj55ZSNQFrOkVfzmVLyyLnjm/vGP0zOLW8ee97dvxF9SqIVUhhVkn/Cp65t63/1P0zCt/f260rNq160IIf96mce3xBgAAgIQ03gAAAJCQxhsAAAAS0ngDAABAQhpvAAAASEjjDQAAAAlpvAEAACAhjTcAAAAkpPEGAACAhDTeAAAAkJDGGwAAABLSeAMAAEBCGm8AAABISOMNAAAACWm8AQAAICGNNwAAACSk8QYAAICm1Hg/++yz4ZRTTgm9evUKRUVFYdy4cfWPrV+/Plx11VVh3333DW3atMnHOf/888P8+fO3mnndddflWRsPe+211yebIwBgh6j1ANDIjffq1avD0KFDw6233rrZY2vWrAlTp04NV199df7z4YcfDm+99VY49dRTPzZ3yJAhYcGCBfXD888/v72TBgBEoNYDQFyl2/uEk046KR+2pEOHDuGJJ57Y5L5bbrklHHLIIWHOnDlh1113bXhCSktDjx49tmkaqqqq8qHOihUrtnn6AYCmX+sz6j0An9rGe3stX748P5ysY8eOWx1v+vTp+eFqlZWVYcSIEWH06NENFu/sseuvv36z+0tXFYeSDfFOWy/+sNZHs6bfhuiZHV5Lsxgrl9ZGzyyqiR4ZyhaVxw/tvzp65AeD20TPXNe1ED1z7hl9Qgqr+8Z/PXX6bVH0zAuu+m30zB8/cXL0zOrpu0TPbPd+/GWU2e2ct6JnHt05fubP7j4tal5NVfzXZ1OVotZvrd73eGF9KC0tCbG8c2q8rDptZsXP/GBF55DC7o/E/8Az++TK6JnlXeO/p8ril/tQk+Ctv/boldEzd//2qpDCOz9oHT1z7YK20TOLS+J/huo9IX4dnfPF9dEzi5eWhRT2/ek/xc88NX69X7i6fbSsDaurwtymcHG1devW5eeBnXvuuaF9+4ZncPjw4WHs2LFh/Pjx4bbbbguzZs0KRx55ZFi5cssrmVGjRuVFvm6YO3dbZxcAaA61PqPeA9BSJNvjnV185ayzzgqFQiEvsFuz8eFs++23X16c+/XrFx588MFw8cUXbzZ+RUVFPgAAjSdlrc+o9wC0FKUpC/E777wTnn766a1uAd+S7FC1gQMHhhkzZqSYPABgB6n1ALDtilMV4uw8rieffDLsssv2n4e4atWqMHPmzNCzZ8/YkwcA7CC1HgASN95ZoXzllVfyIZOdo5X9nl3JNCvEX/rSl8LkyZPDf/zHf4SampqwcOHCfKiurq7POPbYY/MroNa54oorwjPPPBNmz54dJk6cGE4//fRQUlKSny8GAOxcaj0ANPKh5lmhPeaYY+pvjxw5Mv95wQUXhOuuuy785je/yW/vv//+mzzvD3/4Qzj66KPz37Mt3EuWLKl/bN68eXnhff/990PXrl3DEUccESZNmpT/DgDsXGo9ADRy450V1OwiKg3Z2mN1sq3dG7v//vu3dzIAgETUegCIK+nXiQEAAMCnncYbAAAAEtJ4AwAAQEIabwAAAEhI4w0AAAAJabwBAAAgIY03AAAAJKTxBgAAgIQ03gAAAJCQxhsAAAAS0ngDAABAQhpvAAAASEjjDQAAAAmVhhakateqUNyqKFre8IGzQmwvTRkQPXPdkStDCmvebhs9s6a8ED2z0+vRI0OY0SZ65Joe8V6bdUoGrYie+Zl+00MKT/9mWPTMm//P/42eeeGzF0fPbDcr/jbOFYPXR89cvWf892em1fV7RM+8e2Sn6Jk0H+9duC6UtI73em0zqUOIbW3P2uiZ5x3zXEjh0bePip454N8WRc+c9/nu0TNL18Rf7w3tF//z49SFfaJnvvHtXUIKJetqome2erckeuaAfedHz5y5V/x6Vz4//rzXxo/MrdptQ/TM1x4bFD1z38+/GS1rfVH1No9rjzcAAAAkpPEGAACAhDTeAAAAkJDGGwAAABLSeAMAAEBCGm8AAABISOMNAAAACWm8AQAAICGNNwAAACSk8QYAAICENN4AAACQkMYbAAAAEtJ4AwAAQEIabwAAAEhI4w0AAAAJabwBAAAgIY03AAAAJKTxBgAAgIQ03gAAAJCQxhsAAAASKg0tSNdnykNJeXm0vBfX7hliO/jAGdEz//rAoJDCuiNXRs8se6Vd9My1Jy2PnrlubvzprG21IXpmjzZro2c+/tL+IYWyykL0zIv+eFH0zF6/jb9aXHTGmuiZJfMro2cWry8KKcw6Z330zL63d4meeeLVk6LmVa1aH6b/OGok/6N6drtQXBnvPVCR4NPQwNsWRc/8/eC9Qgo18VcnYeYF3aJntpsVv45c8L8fj5758z8fEz2zZklF9MyS6jTr/NYL4n0Wr1O+PP6yf+/W3aJnVu8Xfzo7vhk9Miw+Jn5dzux2f/zMjt+ZHj3z8I4zo2WtK90Qxm3juPZ4AwAAQEIabwAAAEhI4w0AAAAJabwBAAAgIY03AAAAJKTxBgAAgKbUeD/77LPhlFNOCb169QpFRUVh3LhNL6B+4YUX5vdvPJx44okfm3vrrbeG/v37h8rKyjB8+PDw0ksvbe+kAQARqPUA0MiN9+rVq8PQoUPz4tmQrPguWLCgfrjvvvu2mvnAAw+EkSNHhmuvvTZMnTo1zz/hhBPC4sWLt3fyAIAdpNYDQFyl2/uEk046KR+2pqKiIvTo0WObM2+++eZw6aWXhosuuii/ffvtt4fHHnssjBkzJnzrW9/a3kkEAHaAWg8AzeAc7wkTJoRu3bqFQYMGhcsuuyy8//77DY5bXV0dpkyZEo477rgPJ6q4OL/9wgsvbPE5VVVVYcWKFZsMAMDOk7rWZ9R7AFqK6I13dujZ3XffHZ566qnwgx/8IDzzzDP5VvOampotjr9kyZL8se7du29yf3Z74cKFW3zO6NGjQ4cOHeqHvn37xp4NAKARa31GvQfgU3uo+cc555xz6n/fd999w3777Rf22GOPfMv4scceG+X/GDVqVH6eWJ1sC7hiDAA7x86o9Rn1HoCWIvnXie2+++6hS5cuYcaMGVt8PHuspKQkLFq0aJP7s9sNnTuWnVfWvn37TQYAoHGkqPUZ9R6AliJ54z1v3rz8vK+ePXtu8fHy8vIwbNiw/HC1OrW1tfntESNGpJ48AGAHqfUAELnxXrVqVXjllVfyITNr1qz89zlz5uSPXXnllWHSpElh9uzZeUH9whe+EPbcc8/8K0PqZIeh3XLLLfW3s8PIfvnLX4a77rorvPHGG/lFWrKvMqm78ikAsPOo9QDQyOd4T548ORxzzDH1t+vOvbrgggvCbbfdFv7yl7/kRXXZsmWhV69e4fjjjw833nhjfrhYnZkzZ+YXWqlz9tlnh/feey9cc801+UVW9t9//zB+/PjNLsICAKSn1gNAIzfeRx99dCgUCg0+/rvf/e5jM7It5B91+eWX5wMA0LjUegBoZud4AwAAwKeZxhsAAAAS0ngDAABAUzrHuynr/PdzQmmbDy/ssqM23N8vxDZ17YDomaVdQhJtf9c2emb56tromcsLHaJnlpdFjwxVXRs+X/KT6vT1+H/P6mPTbI9btnf8+T9t8J+jZ45/49DomV3+qzJ65sKja6Jnfm7Y365gHdt/TT4geua8Y4uiZ67+xfCoeTXV60IIj0TN5G9KqkMojriqanfk4hDb+okdo2eufbxVSKHn1DXRM6efVx49s/r9+B9bfzr1s9EzS+bGX+dXVMdf51W3j/8ZIrNy7+romW3fjP96+mD/+PNf3Dlb78e1y90ro2cWSrqFFGoq4n82WXLzbtEzf7l7vH6spipb5s9s07j2eAMAAEBCGm8AAABISOMNAAAACWm8AQAAICGNNwAAACSk8QYAAICENN4AAACQkMYbAAAAEtJ4AwAAQEIabwAAAEhI4w0AAAAJabwBAAAgIY03AAAAJKTxBgAAgIQ03gAAAJCQxhsAAAAS0ngDAABAQhpvAAAASEjjDQAAAAlpvAEAACAhjTcAAAAkVBpakMEdFoaKtmXR8t44oE+IrWvfpdEzy8d0DiksPKM6euaxA96MnvnWtftEz9zQOv42qcVnro2e+cYVXaNn7nnfupBC9YlV0TMf/82h0TM37LMmeuai3hXRM/e8Z0P0zOd77h5S6DaxJHrmuk5F0TM/ODjuOq927foQxkSN5H9Ud6wJxa1qouXV/Dr+unThIfFfoyXxV6O5d49qHT2zU+/3o2d2vbM8euaSVW2jZ5bGL/ehfHW813ud5bvFXzdnqtaWxc/sXIieWdQx/ufcLo9VRs988//E/0xaSPB6ypXGX06t5sZ/PX321CnRsqpXrQ9v3rJt49rjDQAAAAlpvAEAACAhjTcAAAAkpPEGAACAhDTeAAAAkJDGGwAAABLSeAMAAEBCGm8AAABISOMNAAAACWm8AQAAICGNNwAAACSk8QYAAICENN4AAACQkMYbAAAAEtJ4AwAAQEIabwAAAGhKjfezzz4bTjnllNCrV69QVFQUxo0bt8nj2X1bGm666aYGM6+77rrNxt9rr70+2RwBADtErQeARm68V69eHYYOHRpuvfXWLT6+YMGCTYYxY8bkxfWLX/ziVnOHDBmyyfOef/757Z00ACACtR4A4ird3iecdNJJ+dCQHj16bHL70UcfDcccc0zYfffdtz4hpaWbPRcA2PnUegBoRud4L1q0KDz22GPh4osv/thxp0+fnh/SlhXtL3/5y2HOnDkNjltVVRVWrFixyQAA7Hypan1GvQfgU7vHe3vcddddoV27duGMM87Y6njDhw8PY8eODYMGDcoPPbv++uvDkUceGaZNm5Y//6NGjx6dj/NRv3nm4FBcWRlt+surikJsS5d1iZ7Zq6omemae22VZ9My3Rw6Knrn4qLLomWVrokeG2pqS6Jm777kweuac43uHFNr/Jt57s86Sw9ZHz2zz59bRM3v/YGL0zPlXHhY9s+y/4y+jzAeD42d2/Gshembrt8uj5tVU1YZPg1S1fmv1vqi2KB9iKUqwqErWxc/sMGtD/NBsvX9G/D9A1cr469I1V8Sf/9oZ0SNDu33fj57Zs/3y6Jnzp+4WUug6OX7mewfFzxy667zomdN7DYieOaDP4uiZ0+d2Dym0frMieubqfvHf969dvV+0rA3r1zWNPd7ZOV/ZFu3Kj2mGs8PZzjzzzLDffvuFE044ITz++ONh2bJl4cEHH9zi+KNGjQrLly+vH+bOnZtoDgCAxqj1GfUegJYi2R7v5557Lrz11lvhgQce2O7nduzYMQwcODDMmLHlzZAVFRX5AAA0npS1PqPeA9BSJNvj/atf/SoMGzYsvyrq9lq1alWYOXNm6NmzZ5JpAwB2nFoPAIka76xQvvLKK/mQmTVrVv77xhdIyS5+8tBDD4VLLrlkixnHHntsuOWWW+pvX3HFFeGZZ54Js2fPDhMnTgynn356KCkpCeeee+72Th4AsIPUegBo5EPNJ0+enH9lSJ2RI0fmPy+44IL8oimZ+++/PxQKhQaLabaFe8mSJfW3582bl4/7/vvvh65du4YjjjgiTJo0Kf8dANi51HoAaOTG++ijj84L7dZ89atfzYeGZFu7N5YVbwCgaVDrASCupFc1BwAAgE87jTcAAAAkpPEGAACAhDTeAAAAkJDGGwAAABLSeAMAAEBCGm8AAABISOMNAAAACWm8AQAAICGNNwAAACSk8QYAAICENN4AAACQkMYbAAAAEtJ4AwAAQEKloQUpW1YcSiribUsoHrY8xPbcwb+Mnnnc2/8cUuhSuj56Zm1JUfTMVksK0TPPuvzJ6Jn3zjwoeua8Sb2jZ5aujr+MMntc8mb0zFarOkTPnL+sR/TMpY8NiJ5Z+t/RI8Oy4dXxQ0MIbf9SET3z0ivHRc/8wX+fGjWvdl1t1Dw2rffF6+LV+/ePWxdiK9TGX5cu36ckpFC6pCx6Zk1l/Gk9/rBp0TMfq94nemarsZ2iZ04b0Tl6Zus9VoQUNkyLX5tL1kaPDNPm94yeWdsj/nr/3Sd2jZ5ZOnR1SKHk0DXRM0vf7Bg9c/7h8bJq15WGsI1tgz3eAAAAkJDGGwAAABLSeAMAAEBCGm8AAABISOMNAAAACWm8AQAAICGNNwAAACSk8QYAAICENN4AAACQkMYbAAAAEtJ4AwAAQEIabwAAAEhI4w0AAAAJabwBAAAgIY03AAAAJKTxBgAAgIQ03gAAAJCQxhsAAAAS0ngDAABAQqWhBSgUCvnP2qp1cXPXVIXYVq6sjZ5ZUx13vutsWB1//ms3xJ/WmurokWHdqvXRM2sSvJ5q1yX4e1YVhRTWr65uHq/RFH/TBMs+xfu+dm386czUVP1tHR3T2lUbmvyyr8urq1E03Xpfuyb++6lQiL8uLawtCSnUrov/cbC2EP/zTnWC2pxi2W9YH3/ea9cVNYvalKw+pfiom2DZ166Lv0+zpqq4WbzuMzWF9c3ic1mIOJl19Whban1RoQV8Ipg3b17o27dvY08GAGxm7ty5oU+fPo09GS2Ceg9Ac631LaLxrq2tDfPnzw/t2rULRUVb3yK4YsWKvGhnf5z27duHlsA8NQ8tbZ5a2vxkzFPz0FzmKSuvK1euDL169QrFxc7s2pn1vrm8RraHeWoezFPz0NLmqaXNT0ut9S3iUPNsJrd3b0K2AJvyQvwkzFPz0NLmqaXNT8Y8NQ/NYZ46dOjQ2JPQomxvvW8Or5HtZZ6aB/PUPLS0eWpp89PSar1N8AAAAJCQxhsAAAAS+tQ13hUVFeHaa6/Nf7YU5ql5aGnz1NLmJ2OemoeWOE/E1RJfI+apeTBPzUNLm6eWNj8tdZ5axMXVAAAAoKn61O3xBgAAgJ1J4w0AAAAJabwBAAAgIY03AAAAJKTxBgAAgIRaZON96623hv79+4fKysowfPjw8NJLL211/Iceeijstdde+fj77rtvePzxx0NTMXr06HDwwQeHdu3ahW7duoXTTjstvPXWW1t9ztixY0NRUdEmQzZvTcV111232fRlf//muowy2evto/OUDV/72teazTJ69tlnwymnnBJ69eqVT8+4ceM2eTz7AoRrrrkm9OzZM7Rq1Socd9xxYfr06dHfjztjftavXx+uuuqq/LXUpk2bfJzzzz8/zJ8/P/prd2cuowsvvHCz6TvxxBOb7DLalnna0vsqG2666aYmu5zYOdT6pldHNqbWN81l1NJqfUa9b/r1Xq1voY33Aw88EEaOHJl/79vUqVPD0KFDwwknnBAWL168xfEnTpwYzj333HDxxReHl19+OS922TBt2rTQFDzzzDP5Cn3SpEnhiSeeyFcgxx9/fFi9evVWn9e+ffuwYMGC+uGdd94JTcmQIUM2mb7nn3++wXGb+jLK/OlPf9pkfrJllTnzzDObzTLKXlPZ+yVbKW/JD3/4w/Dzn/883H777eHFF1/MC1j23lq3bl209+POmp81a9bk03P11VfnPx9++OH8Q+6pp54a9bW7s5dRJiu8G0/ffffdt9XMxlxG2zJPG89LNowZMyYvrl/84heb7HIiPbW+adaRj1Lrm94yamm1PqPeN/16r9b/j0ILc8ghhxS+9rWv1d+uqakp9OrVqzB69Ogtjn/WWWcVTj755E3uGz58eOEf/uEfCk3R4sWLs+9dLzzzzDMNjnPnnXcWOnToUGiqrr322sLQoUO3efzmtowy3/jGNwp77LFHoba2tlkuo+w19sgjj9TfzuajR48ehZtuuqn+vmXLlhUqKioK9913X7T3486any156aWX8vHeeeedaK/dnT1PF1xwQeELX/jCduU0lWW0rcspm7/PfvazWx2nKS0n0lDrm34dUeub/jJqabU+o94XmvxyCp/iWt+i9nhXV1eHKVOm5IfF1CkuLs5vv/DCC1t8Tnb/xuNnsq0/DY3f2JYvX57/7Ny581bHW7VqVejXr1/o27dv+MIXvhBee+210JRkhy1lh5vsvvvu4ctf/nKYM2dOg+M2t2WUvQ7vueee8JWvfCXfWtdcl9HGZs2aFRYuXLjJcujQoUN+mFJDy+GTvB8b+72VLa+OHTtGe+02hgkTJuSHqg4aNChcdtll4f33329w3Oa2jBYtWhQee+yxfI/Yx2nqy4lPTq1vPnVErW/6y+jTVusz6n3TXk6LWnCtb1GN95IlS0JNTU3o3r37Jvdnt7MVyZZk92/P+I2ptrY2fPOb3wyHH3542GeffRocL3sDZodoPProo3lRyJ532GGHhXnz5oWmIFuBZ+c9jR8/Ptx22235iv7II48MK1eubPbLKJOdt7Js2bL8/Jvmuow+qu5vvT3L4ZO8HxtLdghddg5YdphjdlhgrNfuzpYddnb33XeHp556KvzgBz/ID1896aST8uXQ3JdR5q677srPgT3jjDO2Ol5TX07sGLW+edQRtb7pL6NPW63PqPdNfznd1YJrfWljTwDbLjv/KzvX6ePOXxgxYkQ+1MlW8nvvvXe44447wo033hgaW7ZiqLPffvvlb5xsa/CDDz64TVu3mrpf/epX+TxmW+Ca6zL6NMnOpTzrrLPyC8pkK+7m/No955xz6n/PLiSTTeMee+yRbxU/9thjQ3OXfYDNtmh/3MWJmvpygq1R65sHtb75Ue+bhzEtuNa3qD3eXbp0CSUlJfkhChvLbvfo0WOLz8nu357xG8vll18efvvb34Y//OEPoU+fPtv13LKysnDAAQeEGTNmhKYoO9Rn4MCBDU5fc1lGmeyiKU8++WS45JJLWtQyqvtbb89y+CTvx8Yqwtlyyy6Ss7Wt35/ktdvYskOvsuXQ0PQ1h2VU57nnnssviLO9763msJzYPmp986wjan3TX0YttdZn1PvmsZyea+G1vkU13uXl5WHYsGH5YRd1ssN6stsbb3HcWHb/xuNnsjdkQ+PvbNlWuawQP/LII+Hpp58Ou+2223ZnZIeWvPrqq/lXQzRF2flPM2fObHD6mvoy2tidd96Zn29z8sknt6hllL3ushXzxsthxYoV+RVPG1oOn+T92BhFODs/KPsAtcsuu0R/7Ta27HDG7JyvhqavqS+jj+5dyqY1uypqS1tObB+1vnnWEbW+6S+jlljrM+p981hOn4paX2hh7r///vzqi2PHji28/vrrha9+9auFjh07FhYuXJg//vd///eFb33rW/Xj//GPfyyUlpYWfvSjHxXeeOON/Ap5ZWVlhVdffbXQFFx22WX5FTEnTJhQWLBgQf2wZs2a+nE+Ok/XX3994Xe/+11h5syZhSlTphTOOeecQmVlZeG1114rNAX//M//nM/PrFmz8r//cccdV+jSpUt+FdfmuIw2vjrkrrvuWrjqqqs2e6w5LKOVK1cWXn755XzIVg0333xz/nvdVT+///3v5++lRx99tPCXv/wlv+LkbrvtVli7dm19RnYFyn/913/d5vdjY81PdXV14dRTTy306dOn8Morr2zy3qqqqmpwfj7utduY85Q9dsUVVxReeOGFfPqefPLJwoEHHlgYMGBAYd26dU1yGX3cPNVZvnx5oXXr1oXbbrttixlNbTmRnlrfNOvIxtT6prmMWlqt/7h5Uu+bxnJS6/+mxTXemWyhZCvF8vLy/NL5kyZNqn/sqKOOyi/Bv7EHH3ywMHDgwHz8IUOGFB577LFCU5G9OLc0ZF9R0dA8ffOb36yf/+7duxc+97nPFaZOnVpoKs4+++xCz5498+nr3bt3fnvGjBnNdhnVyYprtmzeeuutzR5rDsvoD3/4wxZfa3XTnX3NyNVXX51Pb7biPvbYYzeb1379+uUflrb1/dhY85OtpBt6b2XPa2h+Pu6125jzlH1AP/744wtdu3bNP6xm037ppZduVlCb0jL6uHmqc8cddxRatWqVf63NljS15cTOodY3vTqyMbW+aS6jllbrP26e1PumsZzU+r8pyv5p7L3uAAAA0FK1qHO8AQAAoKnReAMAAEBCGm8AAABISOMNAAAACWm8AQAAICGNNwAAACSk8QYAAICENN4AAACQkMYbAAAAEtJ4AwAAQEIabwAAAAjp/D9kmpPQhgEUswAAAABJRU5ErkJggg==",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig, ax = plt.subplots(1, 2, figsize=(12, 6))\n",
"\n",
"ax[0].imshow(np.real(unitary))\n",
"ax[0].set_title(\"Re(U)\")\n",
"ax[1].imshow(np.imag(unitary))\n",
"ax[1].set_title(\"Im(U)\")\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This matrix can then be converted into a circuit using the ``Unitary`` object."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"circuit = lw.Unitary(unitary)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We'll then define an input state, in this case a 3-photon state is configured, with photons on modes 2, 6, & 10."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"|0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0>\n"
]
}
],
"source": [
"input_modes = [2, 6, 10]\n",
"\n",
"input_state = lw.State(int(i in input_modes) for i in range(circuit.n_modes))\n",
"print(input_state)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Finally, the circuit and input state are collected in a sampling task. The value of min_detection is set to 4 (also the number of input photons) to mitigate the effects of photon loss in the system."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"sampler = lw.Sampler(circuit, input_state, 1000, min_detection=3)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Results\n",
"\n",
"This job can then be executed and the results retrieved."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"qpu = remote.QPU(\"Artemis\")\n",
"\n",
"job = qpu.run(sampler)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"job.wait_until_complete()\n",
"\n",
"results = job.get_result()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Once complete, we'll attempt to visualize the results. Due to the size and complexity of these states, the built-in plotting method is not particularly helpful in this case. Instead, we'll sum the number of photons measured on each mode and plot this as a Histogram."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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0tLSTMhZu3atLF++XPLy8qRr165y7NgxT5nhw4fLwoULZe7cuab8vn37pE+fPp7tp06dMiHoxIkTsmbNGpkxY4ZMnz5dxo0bV9pDAwAAlin1YOlVq1bJv/71L/Pz/PnzxeVyyeHDh00Aefrpp02LTUktXbrU67kGGG3RycjIkGuvvVaysrLkrbfektmzZ0unTp1MmWnTpknLli1NeLryyivl008/lS1btshnn30mdevWlUsuuUSeeuopGTVqlIwfP14qVKhQ6Pfm5uaapWCrFgAAsE+pg5CGkxo1aniCjAYf7ZLSVhntkvordN/KvX8NRNpK1KVLF0+ZFi1aSMOGDSU9Pd0EIX1s06aNCUFuCQkJMmTIENm8ebNceumlRXbJTZgw4S/VFQCAcz3zVDH7NMBdY7GxsSZ8aPeVBiHtylJ//PGHVKxYscwVyc/Pl2HDhknHjh3l4osvNusOHDhgWnSqV6/uVVZDj25zlykYgtzb3duKMmbMGBO63MvevXvLXG8AAGBRi5CGlb59+5qBy40aNZLrr7/e02WmLTNlpWOFfvjhB1m9erX4W2RkpFkAAIDdSh2EHnjgAYmLizMztW688UYpV+7/NipdcMEF8swzz5SpEkOHDpVFixaZMNWgQQPP+piYGDMIWscgFWwV0lljus1dZv369V77c88qc5cBAADwSdfYk08+aQYr33zzzaZVyE0HM+uA5dLQgdYagnTQ9cqVK6VJkyZe29u3by8RERGyYsUKzzqdXq8hLD4+3jzXx02bNklmZqanjM5Ai4qKklatWpX28AAAgEVKHYR0kPHRo0cLrT9+/HipByBrd9g777xjZoXptYR0TI8uOi1fRUdHy8CBA2XEiBHy+eefm8HTd999twk/OlBa6RglDTz9+vWT7777TpYtWyaPP/642TfdXwAAwKddY9qKExYWVmi9hhD3bK+SmjJlinl0jzNy0ynyAwYMMD+//PLLpvtNZ6fplHedEfbGG294ypYvX950q+ksMQ1IVapUkf79+5uWKwAAAJ8EofPOO88EIF2aN2/uFYb0oobaSjR48GApbag6G52JNnnyZLMURwdtL1mypFS/GwAAoMRB6JVXXjHB5Z577jFdYNpt5aZT3Bs3buwZtwMAABBSQUi7m5QOaL7qqqvMIGYAAACrxghdd9115uKHP/74o5mppT8XpLfGAAAA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Ab6oLrBKlSqZ+3wBAACEXBDSqe06sFkvaqi319DrCblVqFDBXEOofPny/qonAABA4IKQ+67zerFCAAAAK6fPK7244SuvvGJut6H0JqwPP/ywuQ8YAABAsHD03ecBAACsvfs8AACAPwXV3ecBAACsvfs8AABAyNx9HgAAwNq7zwMAAFh793kAAICgu46QGwEIAABYNVj64MGD0q9fP9MdFh4ebm6rUXABAAAI2RahAQMGyJ49e8xYoXr16pmuMgAAACuC0OrVq+XLL780d6MHAACwqmssNjbW3IUeAADAuiCkN1vV22ns3r3bPzUCAABwUtfYeeed5zUW6NixY+ZO85UrV5aIiAivsocOHfJ9LQEAAAIVhLQVCAAAwMog1L9/f//XBAAAwKljhPLz8839xDp27CgdOnQw44T+/PNP/9YOAADACUHomWeekccee0yqVq0q559/vrz66quSnJzsz7oBAAA4IwjNnDlT3njjDVm2bJksWLBAFi5cKLNmzTItRQAAACF9QUW9mnSPHj08z7t06WJmku3bt08aNGjgr/oBgNUaj17ss33tTk302b4A64LQyZMnpWLFil7rdOp8Xl6eP+qFEOarP+z8UQcAnLMgpFeT1vuMRUZGetbl5OTI4MGDpUqVKp518+bN+8uVAmAvgjICifeffUochIqaQn/nnXf6uj4AAADOC0LTpk3zb00AAACcfq8xAACAUEEQAgAA1iIIAQAAaxGEAACAtQhCAADAWgQhAABgLYIQAACwFkEIAABYiyAEAACsRRACAADWIggBAABrEYQAAIC1CEIAAMBaBCEAAGAtghAAALBWQIPQqlWrpGfPnlK/fn0JCwuTBQsWeG13uVwybtw4qVevnlSqVEm6dOki27dv9ypz6NAh6du3r0RFRUn16tVl4MCBcvTo0XN8JAAAIBgFNAgdO3ZM2rVrJ5MnTy5y+8SJE+W1116TqVOnyrp166RKlSqSkJAgOTk5njIagjZv3izLly+XRYsWmXB13333ncOjAAAAwSo8kL+8e/fuZimKtga98sor8vjjj0uvXr3MupkzZ0rdunVNy9Ftt90mW7dulaVLl8qGDRvk8ssvN2UmTZokPXr0kBdeeMG0NAEAAATdGKFdu3bJgQMHTHeYW3R0tMTFxUl6erp5ro/aHeYOQUrLlytXzrQgFSc3N1eys7O9FgAA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8MILZtS8jvzX0fSbNm1yOdGQIUPM7KEvvvjCtX//fs9y/PhxT5nTj3HChAmuZcuWuXbu3OnKyMhw3Xbbba6KFSu6Nm/e7HKiRx55xBzfrl27zPnp0qWLq1atWmbmQyicw4IzZxo2bOgaNWpUoW3BeA6PHDni+vbbb82if+peeukl87N7xlRqaqr5LH700Ueu77//3szEadKkievPP//07ENn5kyaNKnEn2cnHeOJEydcN910k6tBgwaujRs3en0+c3Nziz3Gs73fnXSMuu2f//ynmVmk9f3ss89cl112mevCCy905eTkhMR5dMvKynJVrlzZNWXKlCL34eTzOKQE3xODBw82f39Wrlzp+vrrr13x8fFmKeiiiy5yzZs3z/O8JJ/hkiAInQP65tQTXKFCBTNtc+3atZ5t1113nZn+WdD777/vat68uSnfunVr1+LFi11OpR/aohadXl3cMQ4bNszz71G3bl1Xjx49XN98843LqW699VZXvXr1TH3PP/9883zHjh0hcw7dNNjoudu2bVuhbcF4Dj///PMi35vu49Dpt2PHjjX11y/Fzp07Fzr2Ro0amSBb0s+zk45RvwCL+3zq64o7xrO93510jPpF2rVrV1ft2rXNfzb0WAYNGlQo0ATzeXR78803XZUqVTJTxIvi5PMoJfie0PDywAMPuM477zwT+G6++WYTlk7fT8HXlOQzXBJh/2/nAAAA1mGMEAAAsBZBCAAAWIsgBAAArEUQAgAA1iIIAQAAaxGEAACAtQhCAADAWgQhAABgLYIQAGvpHcrDwsIK3ewRgD0IQgAca8CAASaoDB48uNC25ORks03LAEBZEYQAOFpsbKy899578ueff3rW5eTkyOzZs6Vhw4YBrRuA4EcQAuBol112mQlD8+bN86zTnzUEXXrppZ51ubm58tBDD0mdOnWkYsWKcvXVV8uGDRu89rVkyRJp3ry5VKpUSW644QbZvXt3od+3evVqueaaa0wZ/b26z2PHjvn5KAEECkEIgOPdc889Mm3aNM/zt99+W+6++26vMo8++qh8+OGHMmPGDPnmm2+kWbNmkpCQIIcOHTLb9+7dK3369JGePXvKxo0b5d5775XRo0d77WPnzp3SrVs3SUpKku+//17mzJljgtHQoUPP0ZECONe4+zwAx9LxPzqQ+d///rdpndm2bZtZ36JFCxNsNMxUr15dJk+eLOedd55Mnz5d7rjjDlMmLy9PGjduLMOGDZORI0fKY489Jh999JFs3rzZs38NQs8995z88ccfZj+6v/Lly8ubb77pKaNB6LrrrjOtQtrSBCC0hAe6AgBwNrVr15bExEQTdPT/bvpzrVq1vFpyNPh07NjRsy4iIkKuuOIK2bp1q3muj3FxcV77jY+P93r+3XffmZagWbNmedbp78vPz5ddu3ZJy5Yt/XiUAAKBIAQgaLrH3F1U2gLkD0ePHpX777/fjAs6HQOzgdBEEAIQFHTszokTJ8yUeR37U1DTpk2lQoUK8tVXX0mjRo3MOm0h0sHS2jWmtDXn448/9nrd2rVrCw3M3rJlixlfBMAODJYGEBR07I52b2lQ0Z8LqlKligwZMsSMBVq6dKkpM2jQIDl+/LgMHDjQlNFrEW3fvt2U0bFGOv1eu9oKGjVqlKxZs8a0POmAai2v44oYLA2ELoIQgKARFRVllqKkpqaa2V79+vUzLTs7duyQZcuWmUHU7q4tnVW2YMECadeunUydOlWeffZZr320bdtW0tLS5McffzRT6HV6/rhx46R+/frn5PgAnHvMGgMAANaiRQgAAFiLIAQAAKxFEAIAANYiCAEAAGsRhAAAgLUIQgAAwFoEIQAAYC2CEAAAsBZBCAAAWIsgBAAArEUQAgAAYqv/A1Sg5cquaG7+AAAAAElFTkSuQmCC",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"mode_counts = [0] * circuit.n_modes\n",
"\n",
"for state, count in results.items():\n",
" for mode, n_photon in enumerate(state):\n",
" mode_counts[mode] += n_photon * count\n",
"\n",
"plt.bar(range(circuit.n_modes), mode_counts)\n",
"plt.xlabel(\"Mode\")\n",
"plt.ylabel(\"Photon counts\")\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"
}
},
"nbformat": 4,
"nbformat_minor": 2
}