{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Parameters & Optimisation\n",
"In this tutorial, parameters are introduced within a circuit and used to quickly adjust values within it as part of an optimisation."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"from scipy.optimize import minimize\n",
"\n",
"import lightworks as lw"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First, the parameterized circuit is created. This is a Reck interferometer, which has a triangular shape, and should be capable of implementing any unitary matrix across its modes. \n",
"\n",
"Each unit cell of the interferometer contains an external phase shift and a Mach-Zehnder interferometer, comprised of two 50:50 beam splitters with a phase shift between them. For each of the unit cells, a theta and phi parameter are created and added to the dictionary, these are then assigned to the corresponding phase shift elements. All parameters are configured with bounds of $0-2\\pi$ and labels are assigned which are utilized when displaying the circuit."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
""
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Create new circuit\n",
"n_modes = 5\n",
"reck = lw.PhotonicCircuit(n_modes)\n",
"\n",
"# For storing parameters\n",
"pdict = lw.ParameterDict()\n",
"\n",
"for i in range(n_modes - 1):\n",
" for j in range(0, n_modes - 1 - i, 1):\n",
" reck.barrier([j, j + 1]) # Use barrier to separate unit cells\n",
"\n",
" # Create new parameters for theta and phi\n",
" theta, phi = f\"theta_{i}_{j}\", f\"phi_{i}_{j}\"\n",
" pdict[theta] = lw.Parameter(0, bounds=[0, 2 * np.pi], label=theta)\n",
" pdict[phi] = lw.Parameter(0, bounds=[0, 2 * np.pi], label=phi)\n",
" # Then add parameterized components to circuit\n",
" reck.ps(j, pdict[phi])\n",
" reck.bs(j)\n",
" reck.ps(j + 1, pdict[theta])\n",
" reck.bs(j)\n",
"\n",
"reck.display()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Optimisation\n",
"\n",
"To demonstrate circuit parameterization, we will configure an optimisation in which a random unitary matrix is generated and the parameters of the circuit then modified to implement this unitary as closely as possible. This would traditionally be achieved by a unitary decomposition procedure, but there may be some cases in which this is not possible and a process as below would be more suitable, such as in high error rate circuit.\n",
"\n",
"For the optimisation, we define a fom function, which updates the circuit parameters with the determined values and then finds the fidelity of the implemented unitary with the target unitary matrix. In this case we choose the fidelity to be defined as\n",
"\n",
"$$\\text{F} = \\frac{1}{N}\\text{Tr}(|U_t|\\cdot|U|),$$\n",
"\n",
"where N is the number of modes, $U_t$ is the target unitary and $U$ is the implemented unitary.\n",
"\n",
"A callback function is also defined for the purpose of tracking the evolution of the figure of merit."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"def get_fidelity(unitary, target_u):\n",
" \"\"\"Finds fidelity between implemented and target unitary.\"\"\"\n",
" n = unitary.shape[0]\n",
" return 1 / n * np.trace(abs(np.conj(target_u.T)) @ abs(unitary))\n",
"\n",
"\n",
"def fom(params, circuit, pdict, target_u):\n",
" \"\"\"Updates parameters and returns figure of merit for the optimisation.\"\"\"\n",
" # Update parameter dictionary with the optimisation values\n",
" for i, param in enumerate(pdict):\n",
" pdict[param] = params[i]\n",
" unitary = circuit.U # Get unitary matrix implemented by the circuit\n",
" return -get_fidelity(unitary, target_u) # Negative as minimising\n",
"\n",
"\n",
"def callback(params):\n",
" \"\"\"\n",
" Define callback function to be able to track the progress of the fom after\n",
" each iteration. This can only accept the params argument, meaning all other\n",
" components required to save the fom need to be included through using the\n",
" global operator.\n",
" \"\"\"\n",
" global opt_progress, reck, pdict, target_u # noqa: PLW0602\n",
" opt_progress.append(-fom(params, reck, pdict, target_u))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The optimisation can then be configured, in this case the SciPy minimize function is chosen. The initial values are set to all be $\\pi/2$, and for the bounds, we use the get_bounds method of the parameter dictionary to recover the bounds set on creation of each parameter.\n",
"\n",
"The optimisation is then run, using the provided callback function to store progress data."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"# Generate random unitary to implement\n",
"target_u = lw.random_unitary(n_modes, seed=99)\n",
"\n",
"# Set initial values as pi/2\n",
"init_values = [np.pi / 2] * len(pdict)\n",
"# Retrieve bounds from the parameter dictionary\n",
"bounds = list(pdict.get_bounds().values())\n",
"\n",
"opt_progress = [] # Store fom values\n",
"res = minimize(\n",
" fom,\n",
" init_values,\n",
" args=(reck, pdict, target_u),\n",
" bounds=bounds,\n",
" callback=callback,\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Results\n",
"Once the optimization is complete we can view the value of the figure of merit after each iteration. As can be seen, using the fidelity measurement defined above we are able to near perfectly implement the transformation on chip."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot(opt_progress)\n",
"plt.xlabel(\"Iteration\")\n",
"plt.ylabel(\"Unitary Fidelity\")\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The final configuration of the circuit can also be displayed, using the show_parameter_values option to see the actual phase settings."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
""
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Configure circuit to optimal configuration\n",
"for i, param in enumerate(pdict):\n",
" pdict[param] = res.x[i]\n",
"\n",
"reck.display(show_parameter_values=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And finally, we can plot the target and implemented unitary side by side to check they are visually equivalent."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABBYAAAIMCAYAAABBvy9tAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/GU6VOAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAsCElEQVR4nO3deXTV9Z3w8U8ASRCSiAoqmyDOUZGDCy5FR0BFkEGUeh7FpQVxtExFRZmpFmeOYJdBa91mpGi1ylhEHTuD4sqxbrQulaXMiFYtig6uiI8GCBA0+T1/9CFjSEDyJbk3y+t1Tk57f/nl3k9u0fvpm7sUZFmWBQAAAECCNvkeAAAAAGi+hAUAAAAgmbAAAAAAJBMWAAAAgGTCAgAAAJBMWAAAAACSCQsAAABAMmEBAAAASCYsAAAAAMmEBaDR9O7dO84777x8jwEArUq+Hn/ffffdKCgoiNmzZ+f8tndEQUFBTJ8+Pd9jQIskLMA2FBQU7NDXc889l+9Ra3jxxRdj+vTp8cUXX+zQ+UOHDo3+/fvX+b01a9Y06IPw66+/HtOnT4933323Qa4PAFqTt99+OyZOnBj77bdfFBUVRUlJSRx77LFxyy23xMaNG/M9Xp0ef/zxeu0RvXv3jlNOOaXO7y1evLhBw0V9dyZg29rlewBoqn7961/XuHzPPffEU089Vev4QQcdlMuxvtGLL74Y11xzTZx33nmx22675XWWN998M9q0+d9++frrr8c111wTQ4cOjd69e+dvMABoZh577LE444wzorCwMMaNGxf9+/ePzZs3x+9///v4wQ9+EK+99lr88pe/jIjaj7+5su+++8bGjRtjl112qT72+OOPx8yZM5vEMwU2btwY7dr97//9aUo7EzR3wgJsw3e+850al19++eV46qmnah1PkWVZbNq0KTp06LDT19WUFRYW5uR2NmzYELvuumtObgsAcm3lypVx1llnxb777hvPPPNM7LPPPtXfmzRpUqxYsSIee+yx6mM78vhbXl4eHTt2bNA5CwoKoqioqEGvsyHlYrbWsuPB1rwUAnbC3XffHSeccEJ07do1CgsLo1+/fjFr1qxa5215Wt+CBQviiCOOiA4dOsTtt98eERHvvfdenHrqqdGxY8fo2rVrXH755bFgwYI6X2bxhz/8IU4++eQoLS2NXXfdNYYMGRIvvPBC9fenT58eP/jBDyIiok+fPtUv12jIlx5Mnz49CgoKYsWKFdWFv7S0NCZMmBAbNmyo9XtveY3n7Nmz44wzzoiIiOOPP77WS0kefvjhGDVqVHTr1i0KCwujb9++8eMf/zgqKytrXOeWl24sWbIkBg8eHLvuumtcddVVMX78+Nhzzz3jyy+/rDXz8OHD44ADDmiw+wAAculnP/tZrF+/Pn71q1/ViApb7L///jF58uTqy1u/x8Ls2bOjoKAgnn/++bjooouia9eu0aNHj+rvP/HEEzFkyJAoLi6OkpKSOPLII2Pu3LnbvL4thg4dGkOHDq2+vPV7LJx33nkxc+bMiKj5EtOGdN5550WnTp3igw8+iDFjxkSnTp2iS5cu8Q//8A+1doivv7zzm3amnd3xhgwZEoccckidMx9wwAExYsSIhrsToAnwjAXYCbNmzYqDDz44Tj311GjXrl088sgjcdFFF0VVVVVMmjSpxrlvvvlmnH322TFx4sS48MIL44ADDojy8vI44YQT4qOPPorJkyfH3nvvHXPnzo1nn3221m0988wzMXLkyBg4cGBMmzYt2rRpU/2g97vf/S6OOuqoOP300+Ott96K++67L2666abYc889IyKiS5cuDf67n3nmmdGnT5+YMWNGLF26NO68887o2rVrXHfddXWeP3jw4Lj00kvjX/7lX+Kqq66qfgnJlv+cPXt2dOrUKaZMmRKdOnWKZ555Jq6++upYu3ZtXH/99TWu67PPPouRI0fGWWedFd/5zndir732io4dO8Y999wTCxYsqPHazI8//jieeeaZmDZtWoPfBwCQC4888kjst99+ccwxx+zU9Vx00UXRpUuXuPrqq6O8vDwi/vL4e/7558fBBx8cU6dOjd122y3++Mc/xpNPPhnnnHPOTt3exIkT48MPP6zzpaQNqbKyMkaMGBFHH310/PznP4/f/va3ccMNN0Tfvn3j+9//fp0/8007087ueJ06dYoLL7wwli9fXuO9rBYtWhRvvfVW/NM//VMj3RuQJxmwQyZNmpRt/Y/Mhg0bap03YsSIbL/99qtxbN99980iInvyySdrHL/hhhuyiMgeeuih6mMbN27MDjzwwCwismeffTbLsiyrqqrK/uqv/iobMWJEVlVVVeP2+/Tpk5100knVx66//vosIrKVK1fu0O81ZMiQ7OCDD67ze59++mkWEdm0adOqj02bNi2LiOz888+vce63v/3tbI899qj1e48fP7768oMPPljj9/q6uu7LiRMnZrvuumu2adOmGvNGRHbbbbfVOLeysjLr0aNHNnbs2BrHb7zxxqygoCB755136vwdAaApKysryyIiO+2003b4Z7Z+/L377ruziMj++q//Ovvqq6+qj3/xxRdZcXFxdvTRR2cbN26scR1f3ze2vr4thgwZkg0ZMqT68sqVK7OIyO6+++7qY3XtT980+6hRo+r83qJFi2pd//jx47OIyH70ox/VOPewww7LBg4cWOPY1jvN9namnd3xvvjii6yoqCi78soraxy/9NJLs44dO2br16+v83eE5spLIWAnfP31c2VlZbFmzZoYMmRIvPPOO1FWVlbj3D59+tR62tuTTz4Z3bt3j1NPPbX6WFFRUVx44YU1zlu2bFn8+c9/jnPOOSc+++yzWLNmTaxZsybKy8vjxBNPjIULF0ZVVVUj/Ibb9nd/93c1Lh933HHx2Wefxdq1a5Ou7+v35bp162LNmjVx3HHHxYYNG+KNN96ocW5hYWFMmDChxrE2bdrEueeeG/Pnz49169ZVH7/33nvjmGOOiT59+iTNBQD5tOVxtbi4eKev68ILL4y2bdtWX37qqadi3bp18cMf/rDW+w809EsWGltde8k777yTfH07u+OVlpbGaaedFvfdd19kWRYRf3lmxQMPPBBjxoxp8Pe3gHwTFmAnvPDCCzFs2LDo2LFj7LbbbtGlS5e46qqrIiLqfNDZ2nvvvRd9+/at9eC9//7717j85z//OSIixo8fH126dKnxdeedd0ZFRUWt22tIdS0XvXr1qnG5c+fOERHx+eefJ93Ga6+9Ft/+9rejtLQ0SkpKokuXLtVvlLn179a9e/do3759resYN25cbNy4MebNmxcRf3lq4pIlS+K73/1u0kwAkG8lJSURETWieaqtd5G33347ImKbHzvdVG29lxQVFdV62Wfnzp2Td5KInd/xIv6yl/zP//xP/O53v4uIiN/+9rfxySef2EtokbzHAiR6++2348QTT4wDDzwwbrzxxujZs2e0b98+Hn/88bjppptqPYNgZ94deMt1XX/99XHooYfWeU6nTp2SrruoqGibn3295c0Y63oX5a//jcfXbany9fHFF1/EkCFDoqSkJH70ox9F3759o6ioKJYuXRpXXnnlDt+X/fr1i4EDB8acOXNi3LhxMWfOnGjfvn2ceeaZ9Z4JAJqCkpKS6NatWyxfvnynryt1F9nWsxcqKyu3uQ+kStlLGnqGhtrxRowYEXvttVfMmTMnBg8eHHPmzIm99947hg0b1qDzQlMgLECiRx55JCoqKmL+/Pk1/va+rjde3JZ99903Xn/99ciyrMaD9ooVK2qc17dv34j4y3LxTQ9G9X3q4paPrtq4cWOtB8Y333yz+pyGsK3Znnvuufjss8/iP//zP2Pw4MHVx1euXFnv2xg3blxMmTIlPvroo5g7d26MGjWq+tkUANAcnXLKKfHLX/4yXnrppRg0aFCDXe+W/WL58uW1ni35dZ07d44vvvii1vH33nsv9ttvv+3eRspe8vrrr9f5vVztJQ2x40X8JXicc845MXv27LjuuuvioYceqvVyFGgpvBQCEm15UPj639CXlZXF3XffvcPXMWLEiPjggw9i/vz51cc2bdoUd9xxR43zBg4cGH379o2f//znsX79+lrX8+mnn1b/9y2v2atrAajL3/zN38SXX35Z/fGXW1RVVcWsWbOiffv2ceKJJ+7or7Rd25qtrvty8+bN8Ytf/KLet3H22WdHQUFBTJ48Od55553ql1MAQHN1xRVXRMeOHeOCCy6ITz75pNb333777bjlllvqfb3Dhw+P4uLimDFjRmzatKnG977+mNy3b994+eWXY/PmzdXHHn300Vi1atU33kbKXvL+++/HQw89VON4RUVF9SdQHX744Tt0XamzNcSOt8V3v/vd+Pzzz2PixImxfv16ewktlmcsQKLhw4dH+/btY/To0dUPFnfccUd07do1Pvroox26jokTJ8att94aZ599dkyePDn22WefuPfee6uf4relpLdp0ybuvPPOGDlyZBx88MExYcKE6N69e3zwwQfx7LPPRklJSTzyyCMR8ZcIERHxj//4j3HWWWfFLrvsEqNHj97mmwSNHj06hg8fHpdffnm88sorccwxx8SGDRti/vz58cILL8RPfvKTBvu4ykMPPTTatm0b1113XZSVlUVhYWGccMIJccwxx0Tnzp1j/Pjxcemll0ZBQUH8+te/TnpZRZcuXeLkk0+OBx98MHbbbbcYNWpUg8wOAPnSt2/fmDt3bowdOzYOOuigGDduXPTv3z82b94cL774Yjz44INx3nnn1ft6S0pK4qabbooLLrggjjzyyDjnnHOic+fO8V//9V+xYcOG+Ld/+7eIiLjgggviN7/5TZx88slx5plnxttvvx1z5sypfsbD9mzZSy699NIYMWJEtG3bNs4666xtnv+9730v7rrrrjjjjDPi/PPPj8MOOyw+++yzeOCBB2L58uVxzz331Pk+Sym2tTM1xI63xWGHHRb9+/ePBx98MA466KAGiyLQ5OTvAymgeanr45Lmz5+fDRgwICsqKsp69+6dXXfdddldd91V66OLtvfRSe+88042atSorEOHDlmXLl2yv//7v8/+4z/+I4uI7OWXX65x7h//+Mfs9NNPz/bYY4+ssLAw23fffbMzzzwze/rpp2uc9+Mf/zjr3r171qZNmx366MlNmzZl06dPzw488MCssLAw69ixY/atb30rmzNnTq1zt3zc5Kefflrj+JaPstr6997646nuuOOObL/99svatm1b46MnX3jhhexb3/pW1qFDh6xbt27ZFVdckS1YsKDWx1Nu7+Mxt/j3f//3LCKy733ve9s9DwCak7feeiu78MILs969e2ft27fPiouLs2OPPTb713/91xofzbytj5tctGhRndc7f/787Jhjjsk6dOiQlZSUZEcddVR233331TjnhhtuyLp3754VFhZmxx57bLZ48eId+rjJr776KrvkkkuyLl26ZAUFBTv00ZOff/55dvnll2d9+vTJdtlll6ykpCQ7/vjjsyeeeKLWuePHj886duxY6/iWfeXrYquPm8yybe9MDbHjbfGzn/0si4jsn//5n7/xd4fmqiDLEv5KEGhUN998c1x++eXx/vvvR/fu3fM9TrPz8MMPx5gxY2LhwoVx3HHH5XscAKAVu+WWW+Lyyy+Pd999t9anakFLISxAnm39pombNm2Kww47LCorK+Ott97K42TN1ymnnBJ/+tOfYsWKFc3uc7gBgJYjy7I45JBDYo899qj3mz9Cc+I9FiDPTj/99OjVq1cceuihUVZWFnPmzIk33ngj7r333nyP1uzcf//98d///d/x2GOPxS233CIqAAB5UV5eHvPnz49nn302Xn311Xj44YfzPRI0Ks9YgDy7+eab484774x33303Kisro1+/fnHFFVfE2LFj8z1as1NQUBCdOnWKsWPHxm233Rbt2mmnAEDuvfvuu9GnT5/Ybbfd4qKLLoqf/vSn+R4JGpWwAAAAACRrk+8B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8cUXx6OPPhoLFy6MHj165HucFq19+/ax//77R0TEwIEDY9GiRXHLLbfE7bffnufJWpYlS5bE6tWr4/DDD68+VllZGQsXLoxbb701Kioqom3btnmcENLYSWgN7CW5YSfJnda0l3iPhe1o3759DBw4MJ5++unqY1VVVfH00097HRLNWpZlcfHFF8e8efPimWeeiT59+uR7pFanqqoqKioq8j1Gi3PiiSfGq6++GsuWLav+OuKII+Lcc8+NZcuWtZgHb1ofOwktmb0kv+wkjac17SWesfANpkyZEuPHj48jjjgijjrqqLj55pujvLw8JkyYkO/RWpz169fHihUrqi+vXLkyli1bFrvvvnv06tUrj5O1PJMmTYq5c+fGww8/HMXFxfHxxx9HRERpaWl06NAhz9O1PFOnTo2RI0dGr169Yt26dTF37tx47rnnYsGCBfkercUpLi6u9Zrcjh07xh577OG1ujR7dpLcspfkjr0kd+wkudWa9hJh4RuMHTs2Pv3007j66qvj448/jkMPPTSefPLJWm+exM5bvHhxHH/88dWXp0yZEhER48ePj9mzZ+dpqpZp1qxZERExdOjQGsfvvvvuOO+883I/UAu3evXqGDduXHz00UdRWloaAwYMiAULFsRJJ52U79GAZsROklv2ktyxl+SOnYTGUpBlWZbvIQAAAIDmyXssAAAAAMmEBQAAACCZsAAAAAAkExYAAACAZMICAAAAkExYAAAAAJIJCwAAAEAyYQEAAABIJiwAAAAAyYQFAAAAIJmwAAAAACQTFgAAAIBk/w9qJwoyEnyQlwAAAABJRU5ErkJggg==",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig, ax = plt.subplots(1, 2, figsize=(13, 6))\n",
"\n",
"ax[0].imshow(abs(target_u))\n",
"ax[0].set_title(\"Target Unitary\")\n",
"\n",
"ax[1].imshow(abs(reck.U))\n",
"ax[1].set_title(\"Circuit Unitary\")\n",
"\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
}