{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "8c83af48",
   "metadata": {},
   "source": [
    "# Particle swarm optimization of a polarization beam splitter"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e62c19f3",
   "metadata": {},
   "source": [
    "**Note: the cost of running the entire notebook is larger than 10 FlexCredits.**\n",
    "\n",
    "[Particle Swarm Optimization](https://en.wikipedia.org/wiki/Particle_swarm_optimization) (PSO) is a powerful and versatile optimization technique. PSO has since emerged as a popular metaheuristic algorithm for solving complex optimization problems across a wide range of domains, including integrated photonic device design. At its core, PSO embodies the principles of collaboration and information sharing within a population of simple entities known as \"particles.\" These particles navigate through a multi-dimensional search space, seeking optimal solutions to a given problem. They learn from their own experiences, as well as the experiences of other particles, to adapt their positions and velocities over time. \n",
    "\n",
    "In this notebook, we demonstrate the PSO of a compact polarization beam splitter (PBS) using `Tidy3D` and the [PySwarms](https://pyswarms.readthedocs.io/en/latest/index.html) library implemented in the `Tidy3D` Design plugin. The coupling region is segmented into 10 sections with varying widths $W_1$, $W_2$, ..., $W_{10}$. Since performing the traditional parameter sweep is unrealistic in this case due to the large parameter space dimension, we use PSO to optimize all the widths to maximize the beam splitting of the TE0 mode and the TM0 mode. The device is inspired by the work `Weiwei Chen, et al., \"Ultra-compact and low-loss silicon polarization beam splitter using a particle-swarm-optimized counter-tapered coupler,\" Opt. Express 28, 30701-30709 (2020)`[DOI:10.1364/OE.408432](https://doi.org/10.1364/OE.408432). In the original work, the authors employed a more complex PSO scheme of changing objective functions. For the sake of simplicity, we will use a simpler PSO scheme in this notebook, only aiming to demonstrate the idea and workflow. Tidy3D users can draw inspiration from this notebook, as well as from the wealth of PSO research in the literature. By harnessing the versatility of PSO in combination with the exceptional speed of `Tidy3D`, we anticipate that users can design many novel and high-performance photonic devices.\n",
    "\n",
    "<img src=\"img/particle_swarm_optimization_pbs.png\" width=\"500\" alt=\"Schematic of the polarization beam splitter\">\n",
    "\n",
    "Besides the PSO introduced in this notebook, Tidy3D also provides built-in automatic differentiation support for adjoint optimization. Unlike PSO, adjoint optimization is gradient-based and thus more efficient. To learn more, please refer to the adjoint optimizations of a [wavelength division multiplexer](https://www.flexcompute.com/tidy3d/examples/notebooks/Autograd9WDM/), a [mode converter](https://www.flexcompute.com/tidy3d/examples/notebooks/Autograd3InverseDesign/), and a [waveguide taper](https://www.flexcompute.com/tidy3d/examples/notebooks/Autograd5BoundaryGradients/). If you are new to adjoint optimization, please start with the [tutorial](https://www.flexcompute.com/tidy3d/examples/notebooks/Autograd1Intro/) on adjoint basis and our [video lectures](https://www.flexcompute.com/tidy3d/learning-center/inverse-design/) on inverse design."
   ]
  },
  {
   "cell_type": "code",
   "id": "ab737676",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-01-29T08:47:32.495992Z",
     "start_time": "2026-01-29T08:47:30.178690Z"
    }
   },
   "source": [
    "# uncomment the following line to install pyswarms if it's not installed in your environment already\n",
    "# pip install pyswarms\n",
    "\n",
    "import gdstk\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import tidy3d as td\n",
    "import tidy3d.plugins.design as tdd\n",
    "import tidy3d.web as web"
   ],
   "outputs": [],
   "execution_count": 1
  },
  {
   "cell_type": "markdown",
   "id": "eee49c7a",
   "metadata": {},
   "source": [
    "## Preparation Work Before the PSO"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "76c53f8e",
   "metadata": {},
   "source": [
    "### Define Fixed Simulation Settings"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c90ba8e1",
   "metadata": {},
   "source": [
    "Before we can perform the PSO, we need to prepare a few things. First of all, we will define parts that are unchanged in the optimization procedure. The wavelength range of interest in this case is 1500 nm to 1600 nm."
   ]
  },
  {
   "cell_type": "code",
   "id": "38144a42",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-01-29T08:47:32.501475Z",
     "start_time": "2026-01-29T08:47:32.499600Z"
    }
   },
   "source": [
    "lda0 = 1.55  # central wavelength\n",
    "freq0 = td.C_0 / lda0  # central frequency\n",
    "ldas = np.linspace(1.5, 1.6, 31)  # wavelength range\n",
    "freqs = td.C_0 / ldas  # frequency range\n",
    "fwidth = 0.5 * (freqs[0] - freqs[-1])  # width of the source frequency range"
   ],
   "outputs": [],
   "execution_count": 2
  },
  {
   "cell_type": "markdown",
   "id": "b341c16e",
   "metadata": {},
   "source": [
    "For simplicity, we use a constant refractive index for silicon and silicon oxide. Dispersive models can certainly be used instead if needed."
   ]
  },
  {
   "cell_type": "code",
   "id": "268ae7e8",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-01-29T08:47:32.545136Z",
     "start_time": "2026-01-29T08:47:32.543544Z"
    }
   },
   "source": [
    "n_si = 3.48  # silicon refractive index\n",
    "si = td.Medium(permittivity=n_si**2)\n",
    "\n",
    "n_sio2 = 1.44  # silicon oxide refractive index\n",
    "sio2 = td.Medium(permittivity=n_sio2**2)"
   ],
   "outputs": [],
   "execution_count": 3
  },
  {
   "cell_type": "markdown",
   "id": "33ac7472",
   "metadata": {},
   "source": [
    "Define geometric parameters outside of the optimization region. "
   ]
  },
  {
   "cell_type": "code",
   "id": "839fb785",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-01-29T08:47:32.588811Z",
     "start_time": "2026-01-29T08:47:32.587409Z"
    }
   },
   "source": [
    "Ls = 0.5  # length of each segment\n",
    "W0 = 0.45  # width of the input waveguide\n",
    "Wa = 0.2  # width of the taper tip\n",
    "Wt = 0.45  # width of the taper end\n",
    "Hc = 0.22  # thickness of the Si layer\n",
    "G0 = 0.27  # size of the gap\n",
    "buffer = 8  # buffer spacing\n",
    "M = 10  # number of segments to be optimized"
   ],
   "outputs": [],
   "execution_count": 4
  },
  {
   "cell_type": "markdown",
   "id": "ef657f08",
   "metadata": {},
   "source": [
    "Next, we define the device geometry outside the optimization region. These geometries will stay unchanged in the optimization process. After each part is defined, we can perform a union operation (+) to combine them together. "
   ]
  },
  {
   "cell_type": "code",
   "id": "cbe812a6",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-01-29T08:47:32.642574Z",
     "start_time": "2026-01-29T08:47:32.631534Z"
    }
   },
   "source": [
    "# Define the input straight waveguide geometry\n",
    "input_waveguide_geo = td.Box.from_bounds(rmin=(-buffer, 0, -Hc / 2), rmax=(0, W0, Hc / 2))\n",
    "\n",
    "# Define the bar port straight waveguide geometry\n",
    "bar_waveguide_geo = td.Box.from_bounds(\n",
    "    rmin=((M + 1) * Ls, 0, -Hc / 2), rmax=((M + 1) * Ls + buffer, W0, Hc / 2)\n",
    ")\n",
    "\n",
    "# Define the lower waveguide geometry with the help of gdstk\n",
    "cell = gdstk.Cell(\"lower_waveguide\")\n",
    "path = gdstk.RobustPath(\n",
    "    initial_point=(0, -G0 - Wa / 2), width=Wa, tolerance=1e-4, layer=1, datatype=0\n",
    ")\n",
    "path.segment(xy=((M + 1) * Ls, -G0 - Wt / 2), width=Wt, offset=-(Wt - Wa))\n",
    "bend_length = 6\n",
    "bend_height = 1\n",
    "path.segment(\n",
    "    xy=((M + 1) * Ls + bend_length, -G0 - Wt / 2),\n",
    "    offset=lambda u: bend_height * np.cos(np.pi * (u)) / 2 - bend_height / 2,\n",
    ")\n",
    "path.horizontal(x=(M + 1) * Ls + bend_length + buffer)\n",
    "cell.add(path)\n",
    "lower_waveguide_geo = td.Geometry.from_gds(cell, gds_layer=1, axis=2, slab_bounds=(-Hc / 2, Hc / 2))\n",
    "\n",
    "# Perform a union operation to combine all the geometries\n",
    "unchanged_geo = input_waveguide_geo + bar_waveguide_geo + lower_waveguide_geo"
   ],
   "outputs": [],
   "execution_count": 5
  },
  {
   "cell_type": "markdown",
   "id": "72e306e6",
   "metadata": {},
   "source": [
    "To visually inspect if the above-defined geometries are correct, we can simply use the `plot()` method. The geometries do look correct. The missing design region will be optimized by PSO later."
   ]
  },
  {
   "cell_type": "code",
   "id": "89d4cc13",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-01-29T08:47:32.739543Z",
     "start_time": "2026-01-29T08:47:32.680481Z"
    }
   },
   "source": [
    "ax = unchanged_geo.plot(z=0)\n",
    "ax.set_xlim(-2, 12)\n",
    "plt.show()"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ],
      "image/png": "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o6W+Ry0qKgqSJOHYsWPNvl5LL8te6/zUt/36/LTV9u3bcenSJaxduxbPPvss7rzzTqSkpMDX17fRtq29pLxz50786U9/wuzZs/Hoo482uU1oaGiLlg0bNjj2iY2NRXV1NbKzsxsca+/evY71zYmNjUVWVlaj0Lp37154eHigb9++DY6zf//+BtsVFBTgwoUL130doq6KwY7ICSmVSkycOBH//ve/G33wAXXzijUnJSUFWq0Wf/vb3xps+89//hMVFRWYMGECAMBoNDaa5T8mJgZKpdJxiezy5cuNjl//odvUZbR6LdnvwQcfRH5+Pv7+97832rampsZxh+/EiROhVCqxaNGiRoHh6ven1+sbTefSlGHDhiEoKAirV69u8B6+++47ZGdnO85Pe9X39F1do8ViwcqVKxttq9frW3xptrCwEA8++CASExMdd9Y2pS1j7O655x5oNJoGNQohsHr1anTr1g0jR45sUEdOTg6sVquj7f7770dRURH+9a9/OdpKS0uxceNG3HXXXY4xdQMGDEB0dDQ+/PDDBlO/rFq1CgqFwjEHHhE1xEuxRE5q8eLF2LJlC5KSkhxTgRQWFmLjxo3YtWtXg+k4fi0wMBAvvvgiFi5ciN/85je4++67cfz4caxcuRLx8fF47LHHAABpaWl46qmn8MADD6Bv376w2WxYv349VCoV7rvvPgDAokWLsGPHDkyYMAE9evRAcXExVq5cifDw8GanvWjJfv/zP/+DL774An/84x+Rnp6OUaNGwW63IycnB1988QV++OEHDBs2DL1798bLL7+M119/HaNHj8a9994LnU6HzMxMhIWFYcmSJQCAuLg4rFq1Cn/+85/Ru3dvBAUFOW7EuJpGo8Gbb76JKVOmICkpCY888ohjupOePXviueeea+sfWwMjR46Er68vJk2ahGeeeQYKhQLr169vMpjHxcVhw4YNmDNnDuLj42EwGHDXXXc1edxnnnkGJSUleOGFF/D55583WDdo0CAMGjQIQNvG2IWHh2P27NlYunQprFYr4uPj8fXXX2Pnzp345JNPGlyWfvHFF7Fu3Trk5uY65t27//77MWLECEyZMgXHjh1zPHnCbrdj4cKFDV5r6dKluPvuu3HHHXfg4YcfxpEjR/Dee+/hySefbDTdChFdIeMduUTUTnl5eeLxxx8XgYGBQqfTiV69eolZs2YJ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sE7GK8lEREREnYpTPHli8uTJEEI0ubSGTqfDggULoNPpblClrovnrm143tqO567teO7ajueubXje2q6jz53TTlBMRERERA05RY8dEREREV0fgx0RERGRi2CwIyIiInIRDHZERERELqJLBruzZ89i6tSpiIyMhLu7O6KiorBgwQJYLBa5S+uU3n//ffTs2RNubm4YPnw49u3bJ3dJnd6SJUsQHx8PT09PBAUFYeLEiTh+/LjcZTmdv/zlL1AoFJg9e7bcpTiF/Px8PPbYY/D394e7uztiYmKwf/9+ucvq9Ox2O1599dUGnwmvv/46p9Nqwo4dO3DXXXchLCwMCoUCX3/9dYP1QgjMnz8foaGhcHd3R0pKCk6ePClPsZ1Mc+fOarVi7ty5iImJgV6vR1hYGB5//HEUFBS0+nW6ZLDLycmBJEn44IMPcPToUbzzzjtYvXo1XnrpJblL63Q2bNiAOXPmYMGCBcjKysLgwYMxfvx4FBcXy11ap5aRkYFZs2Zhz5492Lp1K6xWK+644w6YTCa5S3MamZmZ+OCDDzBo0CC5S3EKZWVlGDVqFDQaDb777jscO3YMb7/9Nnx9feUurdN78803sWrVKrz33nvIzs7Gm2++ibfeegvvvvuu3KV1OiaTCYMHD8b777/f5Pq33noLf/vb37B69Wrs3bsXer0e48ePR21t7U2utPNp7txVV1cjKysLr776KrKysvCvf/0Lx48fx9133936F+qQJ866gLfeektERkbKXUank5CQIGbNmuX42W63i7CwMLFkyRIZq3I+xcXFAoDIyMiQuxSnUFlZKfr06SO2bt0qkpKSxLPPPit3SZ3e3LlzRWJiotxlOKUJEyaIJ554okHbvffeKx599FGZKnIOAMRXX33l+FmSJBESEiKWLl3qaCsvLxc6nU589tlnMlTYef363DVl3759AoDIy8tr1bG7ZI9dUyoqKuDn5yd3GZ2KxWLBgQMHkJKS4mhTKpVISUnBTz/9JGNlzqeiogIA+DvWQrNmzcKECRMa/O5R87755hsMGzYMDzzwAIKCgjBkyBD8/e9/l7sspzBy5EikpqbixIkTAICff/4Zu3btwm9/+1uZK3Muubm5uHjxYoP/b729vTF8+HB+ZrRBRUUFFAoFfHx8WrWfUzxS7EY7deoU3n33XSxbtkzuUjqV0tJS2O12BAcHN2gPDg5GTk6OTFU5H0mSMHv2bIwaNQoDBw6Uu5xO7/PPP0dWVhYyMzPlLsWpnDlzBqtWrcKcOXPw0ksvITMzE8888wy0Wi0mTZokd3md2rx582A0GhEdHQ2VSgW73Y433ngDjz76qNylOZWLFy8CQJOfGfXrqGVqa2sxd+5cPPLII/Dy8mrVvi7VYzdv3jwoFIpml18Hkvz8fPzmN7/BAw88gGnTpslUObmyWbNm4ciRI/j888/lLqXTO3/+PJ599ll88skncHNzk7scpyJJEoYOHYrFixdjyJAhmD59OqZNm4bVq1fLXVqn98UXX+CTTz7Bp59+iqysLKxbtw7Lli3DunXr5C6NuiCr1YoHH3wQQgisWrWq1fu7VI/d//t//w+TJ09udptevXo5vi8oKMCYMWMwcuRIfPjhhze4OucTEBAAlUqFoqKiBu1FRUUICQmRqSrn8tRTT+Hbb7/Fjh07EB4eLnc5nd6BAwdQXFyMoUOHOtrsdjt27NiB9957D2azGSqVSsYKO6/Q0FDccsstDdr69++P//u//5OpIufx/PPPY968eXj44YcBADExMcjLy8OSJUvY29kK9Z8LRUVFCA0NdbQXFRUhNjZWpqqcS32oy8vLQ1paWqt76wAXC3aBgYEIDAxs0bb5+fkYM2YM4uLisGbNGiiVLtV52SG0Wi3i4uKQmpqKiRMnAqjrFUhNTcVTTz0lb3GdnBACTz/9NL766its374dkZGRcpfkFMaNG4fDhw83aJsyZQqio6Mxd+5chrpmjBo1qtGUOidOnECPHj1kqsh5VFdXN/oMUKlUkCRJpoqcU2RkJEJCQpCamuoIckajEXv37sWMGTPkLc4J1Ie6kydPIj09Hf7+/m06jksFu5bKz89HcnIyevTogWXLlqGkpMSxjj1RDc2ZMweTJk3CsGHDkJCQgBUrVsBkMmHKlClyl9apzZo1C59++ik2bdoET09Px/gSb29vuLu7y1xd5+Xp6dloHKJer4e/vz/HJ17Hc889h5EjR2Lx4sV48MEHsW/fPnz44Ye8GtECd911F9544w1ERERgwIABOHjwIJYvX44nnnhC7tI6naqqKpw6dcrxc25uLg4dOgQ/Pz9ERERg9uzZ+POf/4w+ffogMjISr776KsLCwhydA11Zc+cuNDQU999/P7KysvDtt9/Cbrc7Pjf8/Pyg1Wpb/kJtvlfXia1Zs0YAaHKhxt59910REREhtFqtSEhIEHv27JG7pE7vWr9fa9askbs0p8PpTlru3//+txg4cKDQ6XQiOjpafPjhh3KX5BSMRqN49tlnRUREhHBzcxO9evUSL7/8sjCbzXKX1umkp6c3+XfbpEmThBB1U568+uqrIjg4WOh0OjFu3Dhx/PhxeYvuJJo7d7m5udf83EhPT2/V6yiE4NTaRERERK6AA8uIiIiIXASDHREREZGLYLAjIiIichEMdkREREQugsGOiIiIyEUw2BERERG5CAY7IiIiIhfBYEdERETkIhjsiIiIiFwEgx0RERGRi2CwIyIiInIRDHZERC1UUlKCkJAQLF682NH2448/QqvVIjU1VcbKiIjqKIQQQu4iiIicxX/+8x9MnDgRP/74I/r164fY2Fjcc889WL58udylEREx2BERtdasWbOwbds2DBs2DIcPH0ZmZiZ0Op3cZRERMdgREbVWTU0NBg4ciPPnz+PAgQOIiYmRuyQiIgAcY0dE1GqnT59GQUEBJEnC2bNn5S6HiMiBPXZERK1gsViQkJCA2NhY9OvXDytWrMDhw4cRFBQkd2lERAx2RESt8fzzz+PLL7/Ezz//DIPBgKSkJHh7e+Pbb7+VuzQiIl6KJSJqqe3bt2PFihVYv349vLy8oFQqsX79euzcuROrVq2SuzwiIvbYEREREbkK9tgRERERuQgGOyIiIiIXwWBHRERE5CIY7IiIiIhcBIMdERERkYtgsCMiIiJyEQx2RERERC6CwY6IiIjIRTDYEREREbkIBjsiIiIiF8FgR0REROQi/j9yWqcfNprEMgAAAABJRU5ErkJggg=="
     },
     "metadata": {},
     "output_type": "display_data",
     "jetTransient": {
      "display_id": null
     }
    }
   ],
   "execution_count": 6
  },
  {
   "cell_type": "markdown",
   "id": "890b9e1b",
   "metadata": {},
   "source": [
    "### Define Design Region"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7b3a665b",
   "metadata": {},
   "source": [
    "Next we define a function that creates the geometry of the design region. This region is parameterized by 10 parameters $W_1$, $W_2$, ..., $W_{10}$. We will define an array `Ws` to store these 10 values. The geometry of the design region is defined as a [PolySlab](https://docs.flexcompute.com/projects/tidy3d/en/latest/api/_autosummary/tidy3d.PolySlab.html), whose vertices can be easily calculated from `Ws`."
   ]
  },
  {
   "cell_type": "code",
   "id": "a59833f2",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-01-29T08:47:32.744638Z",
     "start_time": "2026-01-29T08:47:32.742687Z"
    }
   },
   "source": [
    "def define_optimize_region(Ws: np.array) -> td.PolySlab:\n",
    "    \"\"\"Calculate the vertices of the design region and return a PolySlab.\"\"\"\n",
    "    vertices = [(0, 0), (0, W0)]\n",
    "    for i, Wi in enumerate(Ws):\n",
    "        vertices.append(((i + 1) * Ls, Wi))\n",
    "\n",
    "    vertices.append(((M + 1) * Ls, W0))\n",
    "    vertices.append(((M + 1) * Ls, 0))\n",
    "\n",
    "    optimize_region_geo = td.PolySlab(vertices=vertices, axis=2, slab_bounds=(-Hc / 2, Hc / 2))\n",
    "\n",
    "    return optimize_region_geo"
   ],
   "outputs": [],
   "execution_count": 7
  },
  {
   "cell_type": "markdown",
   "id": "466dfeb3",
   "metadata": {},
   "source": [
    "Again, we want to visually inspect if the `define_optimize_region` function works correctly. To do so, we define `Ws` with some random values and plot the design region geometry together with the unchanged region geometries. From the plot, we can confirm that the geometries are generated correctly. "
   ]
  },
  {
   "cell_type": "code",
   "id": "e23831a6",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-01-29T08:47:32.835990Z",
     "start_time": "2026-01-29T08:47:32.787821Z"
    }
   },
   "source": [
    "np.random.seed(1)  #  use a fixed random seed for reproducibility of the notebook\n",
    "Ws = np.random.uniform(0.3, 0.45, M)\n",
    "optimize_region_geo = define_optimize_region(Ws)\n",
    "\n",
    "device = td.Structure(geometry=unchanged_geo + optimize_region_geo, medium=si)\n",
    "ax = device.plot(z=0)\n",
    "ax.set_xlim(-1, 12)\n",
    "plt.show()"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ],
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data",
     "jetTransient": {
      "display_id": null
     }
    }
   ],
   "execution_count": 8
  },
  {
   "cell_type": "markdown",
   "id": "49f1a557",
   "metadata": {},
   "source": [
    "### Define Source and Monitors"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e84d1209",
   "metadata": {},
   "source": [
    "To characterize the performance of the PBS, we need to perform two simulations: 1. excite the input waveguide with a TE0 [ModeSource](https://docs.flexcompute.com/projects/tidy3d/en/latest/api/_autosummary/tidy3d.ModeSource.html) and calculate the TE0 mode transmission at the bar port using a [ModeMonitor](https://docs.flexcompute.com/projects/tidy3d/en/latest/api/_autosummary/tidy3d.ModeMonitor.html); 2. Excite the input waveguide with a TM0 [ModeSource](https://docs.flexcompute.com/projects/tidy3d/en/latest/api/_autosummary/tidy3d.ModeSource.html) and calculate the TM0 mode transmission at the cross port using a [ModeMonitor](https://docs.flexcompute.com/projects/tidy3d/en/latest/api/_autosummary/tidy3d.ModeMonitor.html). Since the PBS is surrounded by SiO$_2$, there is a symmetry that can be exploited in the $z$ direction. We can use this symmetry to strategically select TE0 mode or the TM0 mode at the [ModeSource](https://docs.flexcompute.com/projects/tidy3d/en/latest/api/_autosummary/tidy3d.ModeSource.html) (more on it later). Therefore, here we set `num_modes=1` in the [ModeSpec](https://docs.flexcompute.com/projects/tidy3d/en/latest/api/_autosummary/tidy3d.ModeSpec.html). If no symmetry is used, `num_modes=2` should be used."
   ]
  },
  {
   "cell_type": "code",
   "id": "2596c764",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-01-29T08:47:32.842801Z",
     "start_time": "2026-01-29T08:47:32.838732Z"
    }
   },
   "source": [
    "# Add a mode source as excitation\n",
    "mode_spec = td.ModeSpec(num_modes=1, target_neff=n_si)\n",
    "mode_source = td.ModeSource(\n",
    "    center=(-lda0 / 2, W0 / 2, 0),\n",
    "    size=(0, 4 * W0, 6 * Hc),\n",
    "    source_time=td.GaussianPulse(freq0=freq0, fwidth=fwidth),\n",
    "    direction=\"+\",\n",
    "    mode_spec=mode_spec,\n",
    "    mode_index=0,\n",
    ")\n",
    "\n",
    "# Add a mode monitor at the bar port\n",
    "mode_monitor_bar = td.ModeMonitor(\n",
    "    center=((M + 1) * Ls + bend_length + lda0 / 2, W0 / 2, 0),\n",
    "    size=mode_source.size,\n",
    "    freqs=freqs,\n",
    "    mode_spec=mode_spec,\n",
    "    name=\"bar\",\n",
    ")\n",
    "\n",
    "# Add a mode monitor at the cross port\n",
    "mode_monitor_cross = td.ModeMonitor(\n",
    "    center=((M + 1) * Ls + bend_length + lda0 / 2, -G0 - Wt / 2 - bend_height, 0),\n",
    "    size=mode_source.size,\n",
    "    freqs=freqs,\n",
    "    mode_spec=mode_spec,\n",
    "    name=\"cross\",\n",
    ")\n",
    "\n",
    "# Simulation domain box\n",
    "sim_box = td.Box.from_bounds(rmin=(-1, -3.5, -1), rmax=(12.5, 1.5, 1))\n",
    "\n",
    "# Simulation run time\n",
    "run_time = 5e-13"
   ],
   "outputs": [],
   "execution_count": 9
  },
  {
   "cell_type": "markdown",
   "id": "15f91e13",
   "metadata": {},
   "source": [
    "### Define Tidy3D Simulation"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "298fc467",
   "metadata": {},
   "source": [
    "Next, we define a function `make_sim` that takes the design parameters and polarization and returns a Tidy3D [Simulation](https://docs.flexcompute.com/projects/tidy3d/en/latest/api/_autosummary/tidy3d.Simulation.html). If we want to define a TE0 mode excitation, we set `symmetry` to `(0,0,1)` while for TM0 excitation, we have `symmetry=(0,0,-1)`. Note again that we can use symmetry because the PBS is surrounded by silicon oxide. If no cladding is used, this symmetry will be broken and we need to define the excitation mode at the source differently. "
   ]
  },
  {
   "cell_type": "code",
   "id": "3e9df335",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-01-29T08:47:32.887544Z",
     "start_time": "2026-01-29T08:47:32.885149Z"
    }
   },
   "source": [
    "def make_sim(Ws: np.array, pol: str) -> td.Simulation:\n",
    "    \"\"\"Build a Simulation object from design region widths and desired polarization.\"\"\"\n",
    "    optimize_region_geo = define_optimize_region(Ws)\n",
    "\n",
    "    # Define the structure for the entire PBS\n",
    "    device = td.Structure(geometry=unchanged_geo + optimize_region_geo, medium=si)\n",
    "\n",
    "    # Define symmetry according to excitation polarization\n",
    "    pol_to_symmetry = {\"TE\": (0, 0, 1), \"TM\": (0, 0, -1)}\n",
    "\n",
    "    try:\n",
    "        symmetry = pol_to_symmetry[pol]\n",
    "    except KeyError:\n",
    "        raise ValueError(\"Polarization can either be TE or TM\")\n",
    "\n",
    "    # Add mode monitor according to excitation polarization\n",
    "    if pol == \"TE\":\n",
    "        monitor = [mode_monitor_bar]\n",
    "    elif pol == \"TM\":\n",
    "        monitor = [mode_monitor_cross]\n",
    "\n",
    "    # Define simulation\n",
    "    sim = td.Simulation(\n",
    "        center=sim_box.center,\n",
    "        size=sim_box.size,\n",
    "        grid_spec=td.GridSpec.auto(min_steps_per_wvl=10, wavelength=lda0),\n",
    "        structures=[device],\n",
    "        sources=[mode_source],\n",
    "        monitors=monitor,\n",
    "        run_time=run_time,\n",
    "        boundary_spec=td.BoundarySpec.all_sides(boundary=td.PML()),\n",
    "        medium=sio2,\n",
    "        symmetry=symmetry,\n",
    "    )\n",
    "\n",
    "    return sim"
   ],
   "outputs": [],
   "execution_count": 10
  },
  {
   "cell_type": "markdown",
   "id": "3dbd01f4",
   "metadata": {},
   "source": [
    "We again inspect the simulation setup by plotting it. For the TM simulation, we see the [ModeMonitor](https://docs.flexcompute.com/projects/tidy3d/en/latest/api/_autosummary/tidy3d.ModeMonitor.html) at the cross port. For TE simulation, we should see the monitor at the bar port."
   ]
  },
  {
   "cell_type": "code",
   "id": "b81bba56",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-01-29T08:47:33.009904Z",
     "start_time": "2026-01-29T08:47:32.931020Z"
    }
   },
   "source": [
    "sim = make_sim(Ws, \"TM\")\n",
    "sim.plot(z=0)\n",
    "plt.show()"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ],
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnYAAAFxCAYAAAD+ueXcAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAeRtJREFUeJzt3Xl4VOXdPvD7nFmTmcxkJQtrZBEFFAVEXIrVvKaVSqkW0dcFcauKVqQtilZQq8WlLrWK/GxVvCwqxVexdaEi4o4om9WCiOwCWSbLTDLJrOf5/TGcOZlkksxMZibb/bmuXJAzzzlz5nzzwJ2zPI8khBAgIiIiol5P7u4dICIiIqLkYLAjIiIi6iMY7IiIiIj6CAY7IiIioj6CwY6IiIioj2CwIyIiIuojGOyIiIiI+ggGOyIiIqI+gsGOiIiIqI9gsCOiPuuDDz6AJEn44IMPuntXKMn+8Y9/IDc3F42NjWl/7+3bt0Ov1+Obb75J+3sTdYbBjoh6vaVLl2L58uXdvRsJeemll/D44493924AABRFwUMPPYTS0lKYzWaccMIJePnll2Nev76+Htdddx0KCgpgsVjw4x//GFu2bIna9p///CdOPvlkmM1mDBkyBIsXL0YgEIjpfYLBIBYvXoybb74ZVqs15v1LluOPPx7Tpk3DokWL0v7eRJ2ROFcsEfV2Y8eORX5+fpszc4qiwOfzwWg0QpZ75u+xP/vZz/DNN99g37593b0rWLhwIR544AFce+21mDRpEt544w289dZbePnll3HxxRd3uK6iKDjzzDPx1Vdf4Xe/+x3y8/OxdOlSHDx4EJs3b8bIkSPDbd955x1MmzYNZ511Fi655BJ8/fXXeOqpp3Ddddfh6aef7nQ/V69ejQsuuAAHDx7EwIEDu/y5E/HOO+/gvPPOw/fff4/hw4d3yz4QRSWIqE9obGzs7l3oNmPGjBFTp07t7t1IyLRp08TQoUO7ezfEDz/8IAwGg5g7d254maIo4swzzxSDBg0SgUCgw/VXrlwpAIhVq1aFl1VVVYns7GxxySWXRLQ9/vjjxYknnij8fn942Z133ikkSRI7duzodF+nT58uzjjjjFg/Wkr4fD6Rk5Mj7rrrrm7dD6LWeuavsET93KFDh3D11VejpKQEJpMJpaWluOGGG+Dz+QAAy5cvhyRJ+PDDD3HjjTdiwIABGDRoUHj9pUuXYsyYMTCZTCgpKcHcuXNRX18f8R67du3ChRdeiKKiIpjNZgwaNAgXX3wxnE5nuM3atWtxxhlnIDs7G1arFcceeyzuuOOOTvc/lvW8Xi8WL16MESNGwGQyYfDgwViwYAG8Xm+b7f3973/HKaecgszMTOTk5OBHP/oR3n33XQDAsGHD8N///hcffvghJEmCJEk466yzALR/j92qVaswYcIEZGRkID8/H5dddhkOHToU0ebKK6+E1WrFoUOHMGPGDFitVhQUFOC3v/0tgsFgp8fgjTfewLRp08I1HD58OP7whz9ErHvWWWfhrbfewv79+8P7PmzYsHa3eeWVV4bbtf66++67O92nzvbX7/fjxhtvDC+TJAk33HADfvjhB2zYsKHD9V999VUUFhbiggsuCC8rKCjARRddhDfeeCNc1+3bt2P79u247rrroNfrw21vvPFGCCHw6quvdvg+Ho8Ha9asQVlZWcTyffv2QZKkqJfkWx+fu+++G5Ik4bvvvsNll10Gu92OgoIC3HXXXRBC4ODBg/j5z38Om82GoqIiPPLII222aTAYcNZZZ+GNN97ocH+J0k3feRMiSqfDhw/jlFNOCd+vNHr0aBw6dAivvvoqmpqaYDQaw21vvPFGFBQUYNGiRXC73QBC/2ndc889KCsrww033ICdO3fi6aefxpdffolPP/0UBoMBPp8P5eXl8Hq9uPnmm1FUVIRDhw7hzTffRH19Pex2O/773//iZz/7GU444QTce++9MJlM+P777/Hpp592uP+xrKcoCqZPn45PPvkE1113HY477jh8/fXXeOyxx/Ddd99h9erV4bb33HMP7r77bpx22mm49957YTQasXHjRrz//vs499xz8fjjj4fvtbrzzjsBAIWFhe3u3/LlyzFnzhxMmjQJS5YsQWVlJf785z/j008/xdatW5GdnR1uGwwGUV5ejsmTJ+NPf/oT3nvvPTzyyCMYPnw4brjhhg6Pw/Lly2G1WjF//nxYrVa8//77WLRoEVwuFx5++GEAwJ133gmn04kffvgBjz32GAB0eM/Yr371qzaBZs2aNVixYgUGDBgQXuZwODrcN1VWVhZMJhMAYOvWrbBYLDjuuOMi2pxyyinh188444x2t7V161acfPLJbS55n3LKKXjmmWfw3XffYdy4cdi6dSsAYOLEiRHtSkpKMGjQoPDr7dm8eTN8Ph9OPvnkmD5jR2bNmoXjjjsODzzwAN566y3cd999yM3Nxf/7f/8PZ599Nh588EGsWLECv/3tbzFp0iT86Ec/ilh/woQJeOONN+ByuWCz2bq8P0RJ0d2nDIko0hVXXCFkWRZffvllm9cURRFCCPH8888LAOKMM86IuERWVVUljEajOPfcc0UwGAwvf/LJJwUA8dxzzwkhhNi6dWuby2atPfbYYwKAqK6ujmv/Y1nvxRdfFLIsi48//jhi+bJlywQA8emnnwohhNi1a5eQZVn84he/iPg8QmjHQoj2L8WuX79eABDr168XQoQunw0YMECMHTtWNDc3h9u9+eabAoBYtGhReNns2bMFAHHvvfdGbPOkk04SEyZM6PggCCGampraLPvVr34lMjMzhcfjCS/ryqXYXbt2CbvdLv7nf/4n4ucAQExfzz//fMR+HHPMMW3ew+12CwDi9ttv73BfLBaLuOqqq9osf+uttwQAsWbNGiGEEA8//LAAIA4cONCm7aRJk8Spp57a4fv87W9/EwDE119/HbF87969bT6TCoBYvHhx+PvFixcLAOK6664LLwsEAmLQoEFCkiTxwAMPhJfX1dWJjIwMMXv27DbbfemllwQAsXHjxg73mSideCmWqAdRFAWrV6/G+eef3+aMBhC6pNTStddeC51OF/7+vffeg8/nw7x58yLOnFx77bWw2Wx46623AAB2ux0A8O9//xtNTU1R90U9c/XGG29AUZSYP0Ms661atQrHHXccRo8eDYfDEf46++yzAQDr168HELpJXlEULFq0qM2ZoNbHIhabNm1CVVUVbrzxRpjN5vDyadOmYfTo0eHj09L1118f8f2ZZ56JPXv2dPpeGRkZ4b83NDTA4XDgzDPPRFNTE7799tu49701t9uNX/ziF8jJycHLL78c8XOwdu3amL7Ky8vD6zQ3N4fP3rWkHqfm5uYO9yfW9dU/22vb2fvU1NQAAHJycjpsF4trrrkm/HedToeJEydCCIGrr746vDw7OxvHHnts1Jqr+xDrGVKidOClWKIepLq6Gi6XC2PHjo2pfWlpacT3+/fvBwAce+yxEcuNRiOOOeaY8OulpaWYP38+Hn30UaxYsQJnnnkmpk+fHr7fCAhdpvrb3/6Ga665BrfffjvOOeccXHDBBfjlL3/Z4ROmsay3a9cu7NixAwUFBVG3UVVVBQDYvXs3ZFnG8ccfH9Px6Ex7xwcARo8ejU8++SRimdlsbrOPOTk5qKur6/S9/vvf/+L3v/893n//fbhcrojXWt7HmKhrr70Wu3fvxmeffYa8vLyI11pfro1FRkZG1PsbPR5P+PVkrK/+2V7bzt5HJZIwoMOQIUMivrfb7TCbzcjPz2+zXA2U0fYhkV8yiFKFwY6oF4v1P8FoHnnkEVx55ZV444038O677+LXv/41lixZgs8//xyDBg1CRkYGPvroI6xfvx5vvfUW1qxZg5UrV+Lss8/Gu+++G3GGqPU+dbaeoigYN24cHn300ajbGDx4cMKfK5na+4ydqa+vx9SpU2Gz2XDvvfdi+PDhMJvN2LJlC2677ba4zoBG8+c//xkvv/wy/v73v2P8+PFtXq+oqIhpO3a7PfwzVFxcjPXr10MIERFUjhw5AiB0D1xHiouLw21bar1+cXFxeHnrOh85ciR8T1971BBbV1cX8cBQezoKgNHq217No21HDfitgyBRd+KlWKIepKCgADabLeER7YcOHQoA2LlzZ8Ryn8+HvXv3hl9XjRs3Dr///e/x0Ucf4eOPP8ahQ4ewbNmy8OuyLOOcc87Bo48+iu3bt+P+++/H+++/H75U2p7O1hs+fDhqa2txzjnnoKysrM2XekZt+PDhUBQF27dv7/D9Yj1j0t7xUZe1Pj6J+uCDD1BTU4Ply5fjlltuwc9+9jOUlZVFvXwY79mejz/+GL/97W8xb948XHrppVHbFBcXx/S1cuXK8Drjx49HU1MTduzYEbGtjRs3hl/vyPjx47Fly5Y2oXXjxo3IzMzEqFGjIrazadOmiHaHDx/GDz/80On7jB49GgCwd+/eqK83NDREfF9ZWdnh9rpi7969kGU5/NmIegIGO6IeRJZlzJgxA//617/a/McHdH75qaysDEajEU888URE22effRZOpxPTpk0DALhcrjaj/I8bNw6yLIcvkdXW1rbZvvqfbrTLaKpY1rvoootw6NAh/PWvf23Ttrm5OfyE74wZMyDLMu699942gaHl57NYLG2Gc4lm4sSJGDBgAJYtWxbxGd555x3s2LEjfHy6Sj3r03IffT4fli5d2qatxWKJ+dLskSNHcNFFF+GMM84IP1kbTSL32P385z+HwWCI2EchBJYtW4aBAwfitNNOi9iPb7/9Fn6/P7zsl7/8JSorK/Haa6+FlzkcDqxatQrnn39++J66MWPGYPTo0XjmmWcihn55+umnIUkSfvnLX3Z4DCZMmACj0Ri1fwBo80vH66+/Hv4sybZ582aMGTMmfPsCUU/AS7FEPcwf//hHvPvuu5g6dWp4KJAjR45g1apV+OSTTyKG42itoKAACxcuxD333IOf/OQnmD59Onbu3ImlS5di0qRJuOyyywAA77//Pm666SbMnDkTo0aNQiAQwIsvvgidTocLL7wQAHDvvffio48+wrRp0zB06FBUVVVh6dKlGDRoUIfDXsSy3uWXX45//OMfuP7667F+/XqcfvrpCAaD+Pbbb/GPf/wD//73vzFx4kSMGDECd955J/7whz/gzDPPxAUXXACTyYQvv/wSJSUlWLJkCYDQf/ZPP/007rvvPowYMQIDBgwIP4jRksFgwIMPPog5c+Zg6tSpuOSSS8LDnQwbNgy33npromWLcNpppyEnJwezZ8/Gr3/9a0iShBdffDFquJgwYQJWrlyJ+fPnY9KkSbBarTj//POjbvfXv/41qqursWDBArzyyisRr51wwgk44YQTACR2j92gQYMwb948PPzww/D7/Zg0aRJWr16Njz/+GCtWrIi4RLlw4UK88MIL2Lt3b3jcvV/+8pc49dRTMWfOHGzfvj0880QwGMQ999wT8V4PP/wwpk+fjnPPPRcXX3wxvvnmGzz55JO45ppr2gy30prZbMa5556L9957D/fee2+b19esWYNLL70UP/rRj/Ddd9/hmWeeQWZmJt59911MmjQJP/vZz+I+NtH4/f7wOJJEPUq3PItLRB3av3+/uOKKK0RBQYEwmUzimGOOEXPnzhVer1cIoQ13Em1IFCFCw5uMHj1aGAwGUVhYKG644QZRV1cXfn3Pnj3iqquuEsOHDxdms1nk5uaKH//4x+K9994Lt1m3bp34+c9/LkpKSoTRaBQlJSXikksuEd99912H+x7rej6fTzz44INizJgxwmQyiZycHDFhwgRxzz33CKfTGdH2ueeeEyeddFK43dSpU8XatWvDr1dUVIhp06aJrKwsASA89Enr4U5UK1euDG8vNzdXXHrppeKHH36IaDN79mxhsVjafD51qIzOfPrpp+LUU08VGRkZoqSkRCxYsED8+9//brM/jY2N4n//939Fdna2ANDh0CdTp05td+iSlsN5JCoYDIo//vGP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gw9w8sknw2QyYcSIEVi+fHmbNvH26Z4uGAzirrvuQmlpKTIyMjB8+HD84Q9/QGfP9fWHY/XRRx/h/PPPR0lJCSRJwurVqyNeT7TvdHZcPB4P5s6di7y8PFitVlx44YWorKxM5kdLuo6Old/vx2233YZx48bBYrGgpKQEV1xxBQ4fPtzpdnvlsRLUZ73yyivCaDSK5557Tvz3v/8V1157rcjOzhaVlZVR23/66adCp9OJhx56SGzfvl38/ve/FwaDQXz99dfhNg888ICw2+1i9erV4quvvhLTp08XpaWlorm5OV0fK+nKy8vF888/L7755huxbds2cd5554khQ4aIxsbGdtfpr8dK9cUXX4hhw4aJE044Qdxyyy3ttuuvx6m2tlYMHTpUXHnllWLjxo1iz5494t///rf4/vvv211nz549IjMzU8yfP19s375d/OUvfxE6nU6sWbMm3CbePt0b3H///SIvL0+8+eabYu/evWLVqlXCarWKP//5z+2u01+O1dtvvy3uvPNO8dprrwkA4vXXX494PZG+E8txuf7668XgwYPFunXrxKZNm8Spp54qTjvttFR9zKTo6FjV19eLsrIysXLlSvHtt9+KDRs2iFNOOUVMmDChw2321mPFYNeHnXLKKWLu3Lnh74PBoCgpKRFLliyJ2v6iiy4S06ZNi1g2efJk8atf/UoIIYSiKKKoqEg8/PDD4dfr6+uFyWQSL7/8cgo+QfeoqqoSAMSHH37Ybpv+fKwaGhrEyJEjxdq1a8XUqVM7DHb99Tjddttt4owzzohrnQULFogxY8ZELJs1a5YoLy8Pfx9vn+4Npk2bJq666qqIZRdccIG49NJL212nPx6r1mEl0b7T2XGpr68XBoNBrFq1Ktxmx44dAoDYsGFDEj9R6kQLwa198cUXAoDYv39/u21667Hipdg+yufzYfPmzSgrKwsvk2UZZWVl2LBhQ9R1NmzYENEeAMrLy8Pt9+7di4qKiog2drsdkydPbnebvZHT6QQA5ObmttumPx+ruXPnYtq0aW0+fzT99Tj985//xMSJEzFz5kwMGDAAJ510Ev761792uE5nxyqRPt0bnHbaaVi3bh2+++47AMBXX32FTz75BD/96U/bXae/HquWEuk7sRyXzZs3w+/3R7QZPXo0hgwZ0meOHRD6d16SJGRnZ0d9vTcfK323vTOllMPh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AMxmc0LvdcIJJ4T/XlhYCAAYN25cm2VVVVUR62VkZKCpqSmh9ySivonBjogoit27d+Pw4cNQFAX79u3rsG1eXh4kSUJdXV2n2w0Gg22WGQyG8N8lSWp3WevhTWpra1FQUNDpexJR/8FgR0TUis/nw2WXXYZZs2bhD3/4A6655po2Z8taMhqNOP7447F9+/Y2r7W+fLpnz56k7KPH48Hu3btx0kknJWV7RNQ3MNgREbVy5513wul04oknnsBtt92GUaNG4aqrrupwnfLycnzyySdtlr/xxht47bXXsHv3btx///3Yvn079u/fj0OHDnVpHz///HOYTCZMmTKlS9shor6FwY6IqIUPPvgAjz/+OF588UXYbDbIsowXX3wRH3/8MZ5++ul217v66qvx9ttvw+l0RiyfNm0aHnroIRx//PH46KOPsHTpUnzxxRd48cUXu7SfL7/8Mi699FJkZmZ2aTtE1LdIouXz80RElLCZM2fi5JNPxsKFCwGExrEbP348Hn/88aS+j8PhwLHHHotNmzahtLQ0qdsmot6NZ+yIiJLk4YcfhtVqTfn77Nu3D0uXLmWoI6I2eMaOiChFUnXGjoioPQx2RERERH0EL8USERER9REMdkRERER9BIMdERERUR/BYEdERETURzDYEREREfURDHZEREREfQSDHREREVEfwWBHRERE1Ecw2BERERH1Ef8fp3nnLmYU6AcAAAAASUVORK5CYII="
     },
     "metadata": {},
     "output_type": "display_data",
     "jetTransient": {
      "display_id": null
     }
    }
   ],
   "execution_count": 11
  },
  {
   "cell_type": "markdown",
   "id": "3fb38033",
   "metadata": {},
   "source": [
    "## Preparing the DesignSpace"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "75c01b9e",
   "metadata": {},
   "source": [
    "The `Design` plugin requires a pre and post function that define the simulation(s) to be run and how to postprocess the result.\n",
    "\n",
    "We can define a short pre function which will create the both TE and TM simulations based on the parameter widths that the PSO will suggest. Outputting this as a dictionary of `Simulations` will allow the Design plugin to efficiently parallelize this problem and correctly format the task names."
   ]
  },
  {
   "cell_type": "code",
   "id": "2d81f4f0",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-01-29T08:47:33.015179Z",
     "start_time": "2026-01-29T08:47:33.013223Z"
    }
   },
   "source": [
    "def fn_pre(**params: dict) -> dict[td.Simulation, td.Simulation]:\n",
    "    \"\"\"Take parameter widths suggested by the PSO and output a dictionary of Simulations.\"\"\"\n",
    "    widths = np.array(list(params.values()))\n",
    "    sim_te = make_sim(widths, \"TE\")\n",
    "    sim_tm = make_sim(widths, \"TM\")\n",
    "\n",
    "    return {\"TE\": sim_te, \"TM\": sim_tm}"
   ],
   "outputs": [],
   "execution_count": 12
  },
  {
   "cell_type": "markdown",
   "id": "6a7c6d99",
   "metadata": {},
   "source": [
    "### Define the Figure of Merit (FOM)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5ee47a3c",
   "metadata": {},
   "source": [
    "We need to define a function that acts as post function for our `DesignSpace` and calculates the FOM from our simulation output. In the case of the PBS, we define the FOM as the sum of $P_{TE,bar}$ and $P_{TM,cross}$, where $P_{TE,bar}$ is the transmission of TE0 mode at the bar port and $P_{TM,cross}$ is the transmission of TM0 mode at the cross port. In this particular case, we only optimize the transmission at the central frequency. If broadband operation is desired, the FOM can be defined with respect to the entire frequency range. \n",
    "\n",
    "The input for this function is a dictionary with the same keys as the output of `fn_pre`. The optimizer replaces the `Simulation` objects it receives with `SimulationData` objects, meaning we can easily access the appropriate TE or TM simulation.\n",
    "\n",
    "Note that this FOM is a maximizing function; all the optimizers in the `Design` plugin are maximizing by default so the sign does not need to be changed."
   ]
  },
  {
   "cell_type": "code",
   "id": "669b5398",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-01-29T08:47:33.060784Z",
     "start_time": "2026-01-29T08:47:33.058890Z"
    }
   },
   "source": [
    "def fn_post(sim_data_dict: dict[td.SimulationData, td.SimulationData]) -> float:\n",
    "    \"\"\"Calculate the power for TE and TM polarizations in different regions of the PBS.\"\"\"\n",
    "    # Extract te power at the bar at the central frequency\n",
    "    P_TE_bar = (\n",
    "        np.abs(sim_data_dict[\"TE\"][\"bar\"].amps.sel(mode_index=0, direction=\"+\", f=freq0)) ** 2\n",
    "    )\n",
    "\n",
    "    # Extract tm transmission at cross port at the central frequency\n",
    "    P_TM_cross = (\n",
    "        np.abs(sim_data_dict[\"TM\"][\"cross\"].amps.sel(mode_index=0, direction=\"+\", f=freq0)) ** 2\n",
    "    )\n",
    "\n",
    "    return float(P_TE_bar + P_TM_cross)"
   ],
   "outputs": [],
   "execution_count": 13
  },
  {
   "cell_type": "markdown",
   "id": "911d1c21",
   "metadata": {},
   "source": [
    "## Performing PSO "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f305c0fd",
   "metadata": {},
   "source": [
    "With all the preparation work done, we are finally ready to perform the PSO. Defining the hyper-parameters within the `Method` lets the `DesignSpace` manage the PSO run using the [PySwarms](https://pyswarms.readthedocs.io/en/latest/index.html) library.\n",
    "\n",
    "In this optimization, we put an upper and lower bound for the $W_i$ to be 450 nm and 300 nm. 5 particles are used for a total of 40 iterations. As discussed above, this means the entire optimization will run 400 simulations and cost 10 FlexCredits. Since this notebook is mainly for demonstration purposes, the numbers of particles and iterations are kept small. To really achieve a design with high performance, larger numbers should be used. To ensure the final result is reproducible every time we run the notebook, the initial positions of the particles are fixed with a random seed.\n",
    "\n",
    "There are three hyperparameters in PSO, namely the inertia weight, the cognitive coefficient, and the social coefficient. Their values can significantly impact the performance of the algorithm. The best values of them depend on the specific problem so it can take some experimentation to determine.\n",
    "\n",
    "We also include a very low `ftol` value that must be maintained for 8 consecutive iterations as an early-stop criterion. This means that if the fitness stops improving, the optimization will finish early."
   ]
  },
  {
   "cell_type": "code",
   "id": "9f874266",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-01-29T08:47:33.106468Z",
     "start_time": "2026-01-29T08:47:33.103050Z"
    }
   },
   "source": [
    "W_max = 0.45  # upper bound\n",
    "W_min = 0.3  # lower bound\n",
    "\n",
    "n_particles = 5  # number of particles\n",
    "\n",
    "# Set initial positions\n",
    "init_pos = np.random.uniform(W_min, W_max, (n_particles, M))\n",
    "\n",
    "particle_swarm = tdd.MethodParticleSwarm(\n",
    "    n_particles=n_particles,\n",
    "    n_iter=40,\n",
    "    cognitive_coeff=1,\n",
    "    social_coeff=1,\n",
    "    weight=0.7,\n",
    "    init_pos=init_pos,\n",
    "    seed=1,\n",
    "    ftol=0.001,\n",
    "    ftol_iter=8,\n",
    ")\n",
    "\n",
    "parameters = [tdd.ParameterFloat(name=i, span=(W_min, W_max)) for i in range(M)]\n",
    "\n",
    "design_space = tdd.DesignSpace(\n",
    "    method=particle_swarm, parameters=parameters, task_name=\"PSO_Notebook\", path_dir=\"./data\"\n",
    ")"
   ],
   "outputs": [],
   "execution_count": 14
  },
  {
   "cell_type": "markdown",
   "id": "36560bbc",
   "metadata": {},
   "source": [
    "Running the PSO optimization is easily managed by supplying the `fn_pre` and `fn_post` functions to the `DesignSpace.run` method."
   ]
  },
  {
   "cell_type": "code",
   "id": "63c01956",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-01-29T09:39:14.861049Z",
     "start_time": "2026-01-29T08:47:33.149864Z"
    }
   },
   "source": [
    "results = design_space.run(fn_pre, fn_post, verbose=True)\n",
    "df = results.to_dataframe()"
   ],
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2026-01-29 09:47:33,177 - pyswarms.single.global_best - INFO - Optimize for 40 iters with {'c1': 1.0, 'c2': 1.0, 'w': 0.7}\n",
      "pyswarms.single.global_best:   0%|          |0/40"
     ]
    },
    {
     "data": {
      "text/plain": [
       "\u001B[2;36m09:47:33 CET\u001B[0m\u001B[2;36m \u001B[0mRunning \u001B[1;36m10\u001B[0m Simulations                                             \n"
      ],
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">09:47:33 CET </span>Running <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span> Simulations                                             \n",
       "</pre>\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data",
     "jetTransient": {
      "display_id": null
     }
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "pyswarms.single.global_best:   2%|▎         |1/40, best_cost=-1.55"
     ]
    },
    {
     "data": {
      "text/plain": [
       "\u001B[2;36m09:53:13 CET\u001B[0m\u001B[2;36m \u001B[0mRunning \u001B[1;36m10\u001B[0m Simulations                                             \n"
      ],
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">09:53:13 CET </span>Running <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span> Simulations                                             \n",
       "</pre>\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data",
     "jetTransient": {
      "display_id": null
     }
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "pyswarms.single.global_best:   5%|▌         |2/40, best_cost=-1.6 "
     ]
    },
    {
     "data": {
      "text/plain": [
       "\u001B[2;36m09:56:33 CET\u001B[0m\u001B[2;36m \u001B[0mRunning \u001B[1;36m10\u001B[0m Simulations                                             \n"
      ],
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">09:56:33 CET </span>Running <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span> Simulations                                             \n",
       "</pre>\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data",
     "jetTransient": {
      "display_id": null
     }
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "pyswarms.single.global_best:   8%|▊         |3/40, best_cost=-1.6"
     ]
    },
    {
     "data": {
      "text/plain": [
       "\u001B[2;36m10:05:14 CET\u001B[0m\u001B[2;36m \u001B[0mRunning \u001B[1;36m10\u001B[0m Simulations                                             \n"
      ],
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">10:05:14 CET </span>Running <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span> Simulations                                             \n",
       "</pre>\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data",
     "jetTransient": {
      "display_id": null
     }
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "pyswarms.single.global_best:  10%|█         |4/40, best_cost=-1.64"
     ]
    },
    {
     "data": {
      "text/plain": [
       "\u001B[2;36m10:09:39 CET\u001B[0m\u001B[2;36m \u001B[0mRunning \u001B[1;36m10\u001B[0m Simulations                                             \n"
      ],
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">10:09:39 CET </span>Running <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span> Simulations                                             \n",
       "</pre>\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data",
     "jetTransient": {
      "display_id": null
     }
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "pyswarms.single.global_best:  12%|█▎        |5/40, best_cost=-1.64"
     ]
    },
    {
     "data": {
      "text/plain": [
       "\u001B[2;36m10:11:30 CET\u001B[0m\u001B[2;36m \u001B[0mRunning \u001B[1;36m10\u001B[0m Simulations                                             \n"
      ],
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">10:11:30 CET </span>Running <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span> Simulations                                             \n",
       "</pre>\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data",
     "jetTransient": {
      "display_id": null
     }
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "pyswarms.single.global_best:  15%|█▌        |6/40, best_cost=-1.64"
     ]
    },
    {
     "data": {
      "text/plain": [
       "\u001B[2;36m10:30:55 CET\u001B[0m\u001B[2;36m \u001B[0mRunning \u001B[1;36m10\u001B[0m Simulations                                             \n"
      ],
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">10:30:55 CET </span>Running <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span> Simulations                                             \n",
       "</pre>\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data",
     "jetTransient": {
      "display_id": null
     }
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "pyswarms.single.global_best:  18%|█▊        |7/40, best_cost=-1.64"
     ]
    },
    {
     "data": {
      "text/plain": [
       "\u001B[2;36m10:32:32 CET\u001B[0m\u001B[2;36m \u001B[0mRunning \u001B[1;36m10\u001B[0m Simulations                                             \n"
      ],
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">10:32:32 CET </span>Running <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span> Simulations                                             \n",
       "</pre>\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data",
     "jetTransient": {
      "display_id": null
     }
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "pyswarms.single.global_best:  20%|██        |8/40, best_cost=-1.64"
     ]
    },
    {
     "data": {
      "text/plain": [
       "\u001B[2;36m10:33:45 CET\u001B[0m\u001B[2;36m \u001B[0mRunning \u001B[1;36m10\u001B[0m Simulations                                             \n"
      ],
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">10:33:45 CET </span>Running <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span> Simulations                                             \n",
       "</pre>\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data",
     "jetTransient": {
      "display_id": null
     }
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "pyswarms.single.global_best:  22%|██▎       |9/40, best_cost=-1.64"
     ]
    },
    {
     "data": {
      "text/plain": [
       "\u001B[2;36m10:35:09 CET\u001B[0m\u001B[2;36m \u001B[0mRunning \u001B[1;36m10\u001B[0m Simulations                                             \n"
      ],
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">10:35:09 CET </span>Running <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span> Simulations                                             \n",
       "</pre>\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data",
     "jetTransient": {
      "display_id": null
     }
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "pyswarms.single.global_best:  25%|██▌       |10/40, best_cost=-1.64"
     ]
    },
    {
     "data": {
      "text/plain": [
       "\u001B[2;36m10:36:13 CET\u001B[0m\u001B[2;36m \u001B[0mRunning \u001B[1;36m10\u001B[0m Simulations                                             \n"
      ],
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">10:36:13 CET </span>Running <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span> Simulations                                             \n",
       "</pre>\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data",
     "jetTransient": {
      "display_id": null
     }
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "pyswarms.single.global_best:  28%|██▊       |11/40, best_cost=-1.64"
     ]
    },
    {
     "data": {
      "text/plain": [
       "\u001B[2;36m10:38:01 CET\u001B[0m\u001B[2;36m \u001B[0mRunning \u001B[1;36m10\u001B[0m Simulations                                             \n"
      ],
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">10:38:01 CET </span>Running <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">10</span> Simulations                                             \n",
       "</pre>\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data",
     "jetTransient": {
      "display_id": null
     }
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "pyswarms.single.global_best:  28%|██▊       |11/40, best_cost=-1.64\n",
      "2026-01-29 10:39:14,852 - pyswarms.single.global_best - INFO - Optimization finished | best cost: -1.644605279823528, best pos: [0.36569515 0.31222891 0.40911895 0.42828307 0.38803629 0.32239727\n",
      " 0.33733652 0.32336519 0.3400364  0.44988812]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "\u001B[2;36m10:39:14 CET\u001B[0m\u001B[2;36m \u001B[0mBest Result: \u001B[1;36m-1.644605279823528\u001B[0m                                    \n",
       "\u001B[2;36m             \u001B[0mBest Parameters: \u001B[1;36m0\u001B[0m: \u001B[1;36m0.36569514953861787\u001B[0m \u001B[1;36m1\u001B[0m: \u001B[1;36m0.3122289105981696\u001B[0m \u001B[1;36m2\u001B[0m:   \n",
       "\u001B[2;36m             \u001B[0m\u001B[1;36m0.4091189543637529\u001B[0m \u001B[1;36m3\u001B[0m: \u001B[1;36m0.4282830732962929\u001B[0m \u001B[1;36m4\u001B[0m: \u001B[1;36m0.3880362943864307\u001B[0m \u001B[1;36m5\u001B[0m:  \n",
       "\u001B[2;36m             \u001B[0m\u001B[1;36m0.32239727328670414\u001B[0m \u001B[1;36m6\u001B[0m: \u001B[1;36m0.3373365173571663\u001B[0m \u001B[1;36m7\u001B[0m: \u001B[1;36m0.32336518513529305\u001B[0m \u001B[1;36m8\u001B[0m:\n",
       "\u001B[2;36m             \u001B[0m\u001B[1;36m0.34003640122419787\u001B[0m \u001B[1;36m9\u001B[0m: \u001B[1;36m0.44988811607034884\u001B[0m                         \n",
       "\u001B[2;36m             \u001B[0m                                                                   \n"
      ],
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">10:39:14 CET </span>Best Result: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">-1.644605279823528</span>                                    \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span>Best Parameters: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0</span>: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0.36569514953861787</span> <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">1</span>: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0.3122289105981696</span> <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span>:   \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0.4091189543637529</span> <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">3</span>: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0.4282830732962929</span> <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">4</span>: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0.3880362943864307</span> <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">5</span>:  \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0.32239727328670414</span> <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">6</span>: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0.3373365173571663</span> <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">7</span>: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0.32336518513529305</span> <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">8</span>:\n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0.34003640122419787</span> <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">9</span>: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0.44988811607034884</span>                         \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span>                                                                   \n",
       "</pre>\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data",
     "jetTransient": {
      "display_id": null
     }
    }
   ],
   "execution_count": 15
  },
  {
   "cell_type": "markdown",
   "id": "1f6a3634",
   "metadata": {},
   "source": [
    "After the optimization is complete, plot the FOM as a function of iteration. We can use the optimizer object from the `results` to access the cost history."
   ]
  },
  {
   "cell_type": "code",
   "id": "87ff2ad7",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-01-29T09:39:14.962076Z",
     "start_time": "2026-01-29T09:39:14.898220Z"
    }
   },
   "source": [
    "cost_history = results.optimizer.cost_history\n",
    "plt.plot(cost_history)\n",
    "plt.xlabel(\"Iteration\")\n",
    "plt.ylabel(\"Cost\")\n",
    "plt.title(\"Cost history of optimization\")\n",
    "plt.show()"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ],
      "image/png": "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5eXl6auvvrrkunFxcXI4HPrhhx/KLd+7d68OHz6suLi4cst/8YtfaOrUqVq7dq3+9re/6bvvvtPf//53SZ75sq2KkJAQ3XrrrXrjjTdUUFCgQYMGaerUqTpx4oTbPFU95or4+vrqN7/5jf7xj3/o0KFD+uCDD3Tbbbdd8if1zu3n5OSUW15aWqr8/PxK778y25TOTGwZGRl5waXB849/69atcjgcat26tWuZ1TNbr1q1So8++qjGjx+v22+//YLn//GPfyghIUH//Oc/NXLkSA0YMED9+vVzfQacqnIcnvp8AJeLsgTUoMcff1whISH67W9/q717917wfF5enl544QVJ0vXXXy9JmjVrVrl1nnvuOUnSoEGDJJ25XHL+/1J2/q9856W44OBgSaqVGbMPHDhQ7u+AgAAlJyfLGOMaU+UsB+fnqewxV8bIkSN16NAh/f73v1dJSYnuuOOOS76mX79+CggI0IsvvljuPX399ddVVFRUpf07NW/eXN26ddOCBQvKHW92drY++eQT1zGfa+7cueX+nj17tiTpuuuucy0LCQmxbAb03bt365ZbblFGRoZmzpx50XWcxfTc9/Gbb7654H8oVOWz6cnPB3A5mP0LqEFt2rTR22+/rVtvvVUdOnTQnXfeqU6dOqm0tFRffvml3nvvPY0ePVqS1LVrV40aNUqvvvqqDh8+rL59+2rNmjVasGCBhg0bpl/+8peSzowLeemllzR8+HC1adNGR44c0WuvvabQ0FDXl0tQUJCSk5P17rvvqn379mrSpIk6deqkTp06efwY+/fvr5iYGPXu3VvR0dHavHmz5syZo0GDBrkGt6empkqSnnzySY0YMUL+/v664YYbKn3MlZGSkqJOnTrpvffeU4cOHdS9e/dLviYqKkpPPPGEpkyZooEDB2rIkCHKycnRSy+9pPT09EoVrouZOXOmrrvuOvXs2VP33HOPjh8/rtmzZyssLEyTJ0++YP38/HwNGTJEAwcO1FdffaW33npLv/nNb9S1a1fXOqmpqfrss8/03HPPqUWLFoqPj3cNzq5p48aN0759+/T444+7zl46denSRV26dNHgwYP1z3/+U8OHD9egQYOUn5+vefPmKTk5udzl4ap8Nj35+QAui3U/xAMajtzcXHPvvfea1q1bm4CAANO4cWPTu3dvM3v27HKT6506dcpMmTLFxMfHG39/fxMbG3vBBHzr1683t912m2nVqpWx2+2mWbNmZvDgwWbt2rXl9vnll1+a1NRUExAQUOlJKc+fjmD58uUX/Kz8/KkDXnnlFdOnTx/TtGlTY7fbTZs2bcxjjz1mioqKym3rz3/+s2nZsqXx8fG5YFLKSx2zMT9POujOjBkzjCTzzDPPuF3vfHPmzDFJSUnG39/fREdHmzFjxpSblNKYqk0dYIwxn332mendu7cJCgoyoaGh5oYbbqhwUsrvv//e/PrXvzaNGzc2ERER5oEHHrjgth9btmwxffr0MUFBQZWelPJ8kszYsWPLLXNOFDlz5swLcjn17dv3kpNSOhwO88wzz5i4uDhjt9tNSkqKWbx4sRk1apSJi4srt8+KPpsVTUp5OZ+Pi02iClSVzRhGvgGoH1544QVNmDBB27dvv+gvo+qayZMna8qUKdq3b58iIyOtjgOgAoxZAlAvGGP0+uuvq2/fvl5RlAB4D8YsAfBqR48e1b/+9S8tX75cmzZt0ocffmh1JAD1DGUJgFfbt2+ffvOb3yg8PFx//OMfNWTIEKsjAahnGLMEAADgBmOWAAAA3KAsAQAAuMGYJQ9wOBzatWuXGjdubPktCQAAQOUYY3TkyBG1aNFCPj4Vnz+iLHnArl27LriTNwAA8A47duzQFVdcUeHzlCUPcN7SYceOHQoNDbU4DQAAqIzi4mLFxsa6vscrQlnyAOelt9DQUMoSAABe5lJDaBjgDQAA4AZlCQAAwA3KEgAAgBuUJQAAADcoSwAAAG5QlgAAANygLAEAALhBWQIAAHCDsgQAAOAGZQkAAMANyhIAAIAblCUAAAA3KEt1WJmjTN9u/17HSk9YHQUAgAaLslSHXTf9bl03/W59mbPe6igAADRYlKU6rHNsoiRpVU6mxUkAAGi4KEt12FVJ6ZKkVZspSwAAWIWyVIf1TkyVJH2/c6v2FR+0OA0AAA0TZakOiwptouSWbSVJX+SuszgNAAANE2WpjrsqKU2StHrLWouTAADQMFGW6rgM57glyhIAAJagLNVxPdt1k5+Pr37cv1M/7t9ldRwAABocylId1ygwRN3jO0qSVm/hV3EAANQ2ypIX4FIcAADWoSx5Aecg71U5a+VwOCxOAwBAw0JZ8gKp8Z0UFBCoA0cOacuuPKvjAADQoFCWvECAn79+0babJC7FAQBQ2yhLXsJ165McyhIAALWJsuQlnOOWvsr9VqfKTlucBgCAhoOy5CU6XtFOTULCdPTkMX2b/53VcQAAaDAoS17Cx8dHvc7eWJdLcQAA1B6vKUtTp05Vr169FBwcrPDw8Eq9ZvTo0bLZbOUeAwcOvGC9jz/+WD169FBQUJAiIiI0bNgwz4b3kD7MtwQAQK3zszpAZZWWlurmm29Wz5499frrr1f6dQMHDtQbb7zh+ttut5d7/v3339e9996rZ555Rtdcc41Onz6t7Oxsj+X2JOe4pXXbNunoyeMKsQdZnAgAgPrPa8rSlClTJEnz58+v0uvsdrtiYmIu+tzp06f10EMPaebMmbrnnntcy5OTk6udsya1jrpCLZvEaOfBPVqzdYN+2fEXVkcCAKDe85rLcNW1YsUKNWvWTImJiRozZowOHDjgem79+vXauXOnfHx8lJKSoubNm+u666675JmlkydPqri4uNyjNthsNtfZpc+5TxwAALWiXpelgQMH6s0339TSpUv17LPPauXKlbruuutUVlYmSdq2bZskafLkyfrTn/6kxYsXKyIiQldffbUOHjxY4XanTZumsLAw1yM2NrZWjkf6edwSN9UFAKB2WFqWJk6ceMEA7PMfW7Zsqfb2R4wYoSFDhqhz584aNmyYFi9erMzMTK1YsUKSXPdZe/LJJ3XTTTcpNTVVb7zxhmw2m957770Kt/vEE0+oqKjI9dixY0e1M1ZVRuKZM0vZP/2ggyVFtbZfAAAaKkvHLD3yyCMaPXq023USEhI8tr+EhARFRkZq69atuvbaa9W8eXNJ5cco2e12JSQkqKCgoMLt2O32CwaK15ZmYU2V2CJBObu26Yucdboh9RpLcgAA0FBYWpaioqIUFRVVa/v76aefdODAAVdJSk1Nld1uV05OjjIyMiRJp06d0vbt2xUXF1druarqqsQ05ezaplVbMilLAADUMK8Zs1RQUKCsrCwVFBSorKxMWVlZysrKUklJiWudpKQkLVq0SJJUUlKixx57TF9//bW2b9+upUuXaujQoWrbtq0GDBggSQoNDdV9992nSZMm6ZNPPlFOTo7GjBkjSbr55ptr/yAryTnIexXjlgAAqHFeM3XA008/rQULFrj+TklJkSQtX75cV199tSQpJydHRUVnxvH4+vpq48aNWrBggQ4fPqwWLVqof//++vOf/1zuEtrMmTPl5+enkSNH6vjx4+rRo4eWLVumiIiI2ju4KurZvrt8fXyVv+8n/XRwj65ocvGpEQAAwOWzGWOM1SG8XXFxscLCwlRUVKTQ0NBa2eegZ3+rdfnZev7OP+m2XoNrZZ8AANQnlf3+9prLcCjPeSmOKQQAAKhZlCUvlXHOfeI4OQgAQM2hLHmptIROCvK3q7D4gHJ251sdBwCAeouy5KUC/e26sm1XSVyKAwCgJlGWvFiGawqBtRYnAQCg/qIsebGrzo5b+jJ3vU6XnbY4DQAA9RNlyYt1jm2v8OBQHTlxVBt+rP499AAAQMUoS17M18dXvRO7S2I2bwAAagplyctlJJ4dt5TDuCUAAGoCZcnLOcctZeZt1LHSExanAQCg/qEsebk20a3UPDxKpadPKXPrBqvjAABQ71CWvJzNZnOdXeJSHAAAnkdZqgeuOufWJwAAwLMoS/WA86a6Gwu26PDRYovTAABQv1CW6oGY8Ci1i4mTMUZf5K6zOg4AAPUKZame4FIcAAA1g7JUTzjL0mrKEgAAHkVZqid6te8uH5uPtu79UbsOFVodBwCAeoOyVE+EBTdWl1ZJkrj1CQAAnkRZqkf6dGDcEgAAnkZZqkecUwis3rJWxhiL0wAAUD9QluqRtITOsvsFaE/RPm3d+6PVcQAAqBcoS/VIUECg0tt0kcSlOAAAPIWyVM84L8Wt2swgbwAAPIGyVM8451v68of1KnOUWZwGAADvR1mqZ7rGJSk0qJGKjh3RxoIcq+MAAOD1KEv1jK+Pr3q17y6J2bwBAPAEylI9lHF23NLnW9ZYnAQAAO9HWaqH+pwdt5SZt0knTp20OA0AAN6NslQPtYtpreiwSJ04dVJr8zZZHQcAAK9GWaqHbDbbz1MIcJ84AAAuC2WpnspIPFuWchjkDQDA5aAs1VPO+Zaytm9W0bEjFqcBAMB7UZbqqZZNotUmupUcxqGvcr+1Og4AAF6LslSP/XwpjnFLAABUF2WpHvt5kDfjlgAAqC7KUj3WOzFVNptNubvztefwPqvjAADglShL9VhESJg6xyZKklbzqzgAAKqFslTPcSkOAIDLQ1mq55xTCKzeslbGGIvTAADgfShL9dyVbbsqwM9fOw/tVX7hDqvjAADgdShL9VxwQKDSEjpLkj7n1icAAFQZZakBYNwSAADVR1lqAJzjlr7MXSeHw2FxGgAAvAtlqQHoFtdBjQKDdehosbJ/yrU6DgAAXoWy1AD4+fqpV/vukqTPNzNuCQCAqqAsNRBXJZ6dQoDJKQEAqBLKUgORcXaQ9zc/ZOnkqVKL0wAA4D0oSw1EUosERYU20fFTJ7UuP9vqOAAAeA3KUgNhs9l0VaJzCgHGLQEAUFmUpQYk4+wUAsy3BABA5VGWGhDn5JTfbv9eR44ftTgNAADegbLUgMQ2ba7WUVeozFGmr3741uo4AAB4BcpSA+M8u7SaS3EAAFQKZamBcd76hJvqAgBQOZSlBqZ3YqokacuuPO0rPmBxGgAA6j7KUgPTtFG4OsW2lyStzllncRoAAOo+ylIDlMF8SwAAVBplqQHq0+HsuKXNmTLGWJwGAIC6jbLUAPVo203+vn766eAe/bh/p9VxAACo0yhLDVCIPUip8Z0kMZs3AACXQllqoDKSGLcEAEBlUJYaqD5n51tanbNODofD4jQAANRdlKUGKiW+o0LswTpYcljf79xqdRwAAOosrylLU6dOVa9evRQcHKzw8PBKvWb06NGy2WzlHgMHDiy3Tm5uroYOHarIyEiFhoYqIyNDy5cvr4EjqFv8ff30i3bdJHEpDgAAd7ymLJWWlurmm2/WmDFjqvS6gQMHavfu3a7HO++8U+75wYMH6/Tp01q2bJnWrVunrl27avDgwdqzZ48n49dJV7nGLTHIGwCAivhZHaCypkyZIkmaP39+lV5nt9sVExNz0ef279+vH374Qa+//rq6dOkiSZo+fbpeeuklZWdnV/i6+sJ5n7ivt2ap9PQpBfj5W5wIAIC6x2vOLFXXihUr1KxZMyUmJmrMmDE6cODn+6E1bdpUiYmJevPNN3X06FGdPn1ar7zyipo1a6bU1NQKt3ny5EkVFxeXe3ijDi3aqGnjCB07eVzr87+zOg4AAHVSvS5LAwcO1JtvvqmlS5fq2Wef1cqVK3XdddeprKxMkmSz2fTZZ5/p22+/VePGjRUYGKjnnntOS5YsUURERIXbnTZtmsLCwlyP2NjY2jokj/Lx8VHG2RvrMm4JAICLs7QsTZw48YIB2Oc/tmzZUu3tjxgxQkOGDFHnzp01bNgwLV68WJmZmVqxYoUkyRijsWPHqlmzZlq1apXWrFmjYcOG6YYbbtDu3bsr3O4TTzyhoqIi12PHjh3Vzmi1q87eJ251DuOWAAC4GEvHLD3yyCMaPXq023USEhI8tr+EhARFRkZq69atuvbaa7Vs2TItXrxYhw4dUmhoqCTppZde0qeffqoFCxZo4sSJF92O3W6X3W73WC4rOcctrduWraMnjikkMNjiRAAA1C2WlqWoqChFRUXV2v5++uknHThwQM2bN5ckHTt2TNKZy1Hn8vHxaTATNcZFtVSryBYq2L9LX2/N0rWdelkdCQCAOsVrxiwVFBQoKytLBQUFKisrU1ZWlrKyslRSUuJaJykpSYsWLZIklZSU6LHHHtPXX3+t7du3a+nSpRo6dKjatm2rAQMGSJJ69uypiIgIjRo1Shs2bFBubq4ee+wx5efna9CgQZYcpxWcl+I+Z9wSAAAX8Jqy9PTTTyslJUWTJk1SSUmJUlJSlJKSorVrfx5rk5OTo6KiIkmSr6+vNm7cqCFDhqh9+/a65557lJqaqlWrVrkuoUVGRmrJkiUqKSnRNddco7S0NK1evVoffvihunbtaslxWsF5KW418y0BAHABmzHGWB3C2xUXFyssLExFRUWusU/eZF/xQXV+/HpJUvbM/6fIxhX/EhAAgPqist/fXnNmCTUnKrSJklu2lSR9kbPO4jQAANQtlCVIOvfWJ4xbAgDgXJQlSJIyzo5b4j5xAACUR1mCJKlnu27y8/HVj/t3qmD/LqvjAABQZ1CWIElqFBiilNbJkpjNGwCAc1GW4HJVhyslSZ9vZtwSAABOlCW4OAd5r85ZK2aUAADgDMoSXFLjOykoIFD7jxzSll15VscBAKBOoCzBJcDPX79o200Sv4oDAMCJsoRyrnJNIcC4JQAAJMoSzuMct/Rl7rc6VXba4jQAAFiPsoRyOl7RTk1CwnT05DFlbf/e6jgAAFiOsoRyfHx81CsxVRLjlgAAkChLuIg+jFsCAMCFsoQLOMctrd22SUdPHrc4DQAA1qIs4QKto65QyyYxOlV2Wmu2brA6DgAAlqIs4QI2m811dolLcQCAho6yhIu6KvHnW58AANCQUZZwUc7JKTftyNXBkiKL0wAAYB3KEi6qWVhTJbZIkDFGX+SsszoOAACWoSyhQs5LcatyGLcEAGi4KEuokHOQ92ompwQANGCUJVSoZ/vu8vXx1bbCHfrp4B6r4wAAYAnKEioUGtRI3eI6SOLWJwCAhouyBLd+vhTHuCUAQMNEWYJbGa77xK2VMcbiNAAA1D7KEtxKS+ikIH+7CosPKHf3dqvjAABQ6yhLcCvQ364r23aVxBQCAICGibKES8pw3iduM2UJANDwUJZwSc5bn3yZu16ny05bnAYAgNpFWcIldY5tr/DgUB05cVQbC7ZYHQcAgFpFWcIl+fr4qndid0nMtwQAaHgoS6iUjLP3ifuc+ZYAAA0MZQmV4hy3tDZvk46XnrA4DQAAtYeyhEppE91KzcOjdPJ0qTLzNlodBwCAWkNZQqXYbDbX2SXGLQEAGhLKEirNWZYYtwQAaEgoS6g05011NxZs0eGjxRanAQCgdlCWUGkx4VFqFxMnY4y+zF1vdRwAAGoFZQlVwrglAEBDQ1lClTjL0mpuqgsAaCAoS6iSXu27y8fmox/2/KjdhwqtjgMAQI2jLKFKwoIbq0urJEnSqhwuxQEA6j/KEqqsTwfGLQEAGg7KEqrMOYXA6i2ZMsZYnAYAgJpFWUKVpSV0lt0vQLsP79PWvT9aHQcAgBpFWUKVBQUEKr1NF0lcigMA1H+UJVTLuZfiAACozyhLqBbnfEtf5K5XmaPM4jQAANQcyhKqpWtckkKDGqno2BFt2pFrdRwAAGoMZQnV4uvjq17tu0uSVm3mUhwAoP6iLKHaMs6OW1rFuCUAQD3mZ3UAeK8+Z8ctrcnbqCPHjyrAz9/iRBXz8/WVr4+v1TEAAF6oWmXpv/7rv/Too48qODi43PLjx49r5syZevrppz0SDnVbu5jWig6L1N6i/Wo34Vqr47gVFtxYHz32qto3j7c6CgDAy1TrMtyUKVNUUlJywfJjx45pypQplx0K3sFms+n2jKFWx6iUomNHtHj9cqtjAAC8ULXOLBljZLPZLli+YcMGNWnS5LJDwXs8fsO9Gtv/DjkcDqujVOit1R9oyvuzlblto9VRAABeqEplKSIiQjabTTabTe3bty9XmMrKylRSUqL77rvP4yFRt4XYg6yO4FbvxFRJ0rpt2XI4HPLx4XcNAIDKq1JZmjVrlowxuvvuuzVlyhSFhYW5ngsICFDr1q3Vs2dPj4cELkdyy7YKCghU8fES5ezOV4eWbayOBADwIlUqS6NGjZIkxcfHq3fv3vLz48d0qPv8fP3UPb6jvshZp7XbNlGWAABVUq3rEY0bN9bmzZtdf3/44YcaNmyY/vjHP6q0tNRj4QBPufLsjX8z8xi3BACommqVpd///vfKzT1zi4tt27bp1ltvVXBwsN577z09/vjjHg0IeEJaQmdJlCUAQNVVqyzl5uaqW7dukqT33ntPffv21dtvv6358+fr/fff92Q+wCNS4ztJkvL3/aR9xQctTgMA8CbVKkvGGNdPxT/77DNdf/31kqTY2Fjt37/fc+kADwkPCVViiwRJZ34VBwBAZVWrLKWlpekvf/mLFi5cqJUrV2rQoEGSpPz8fEVHR3s0oNPUqVPVq1cvBQcHKzw8vNKv27x5s4YMGaKwsDCFhIQoPT1dBQUFrudPnDihsWPHqmnTpmrUqJFuuukm7d27twaOAFZLP3spbk3eBouTAAC8SbXK0qxZs7R+/Xo98MADevLJJ9W2bVtJ0j/+8Q/16tXLowGdSktLdfPNN2vMmDGVfk1eXp4yMjKUlJSkFStWaOPGjXrqqacUGBjoWmfChAn66KOP9N5772nlypXatWuXbrzxxpo4BFjMOW5p7bZNFicBAHgTmzHGeGpjJ06ckK+vr/z9a+6GqvPnz9f48eN1+PDhS647YsQI+fv7a+HChRd9vqioSFFRUXr77bf161//WpK0ZcsWdejQQV999ZV+8YtfVCpTcXGxwsLCVFRUpNDQ0EofC2rXtr0F6jXpFtn9ApT7/Gey+wdYHQkAYKHKfn9f1lTG69at01tvvaW33npL69evV2BgYI0WpapwOBz6+OOP1b59ew0YMEDNmjVTjx499MEHH7jWWbdunU6dOqV+/fq5liUlJalVq1b66quvLEiNmhTfLFZNGoXr5OlSZe/ItToOAMBLVKssFRYW6pe//KXS09M1btw4jRs3Tmlpabr22mu1b98+T2eslsLCQpWUlGj69OkaOHCgPvnkEw0fPlw33nijVq5cKUnas2ePAgICLhgDFR0drT179lS47ZMnT6q4uLjcA3WfzWZj3BIAoMqqVZYefPBBlZSU6LvvvtPBgwd18OBBZWdnq7i4WOPGjav0diZOnOi611xFjy1btlQnouvXekOHDtWECRPUrVs3TZw4UYMHD9a8efOqtU2nadOmKSwszPWIjY29rO2h9qSfnZyScUsAgMqq1v1KlixZos8++0wdOnRwLUtOTtbcuXPVv3//Sm/nkUce0ejRo92uk5CQUJ2IioyMlJ+fn5KTk8st79Chg1avXi1JiomJUWlpqQ4fPlzu7NLevXsVExNT4bafeOIJPfzww66/i4uLKUxeIr2Nc3LKTTLGlLsZNAAAF1OtsuRwOC46Nsnf3991RqcyoqKiFBUVVZ0IlxQQEKD09HTl5OSUW56bm6u4uDhJUmpqqvz9/bV06VLddNNNkqScnBwVFBS4vSGw3W6X3W6vkdyoWV1aJcnf10+FxQdUsH+X4qJaWh0JAFDHVesy3DXXXKOHHnpIu3btci3buXOnJkyYoGuvvdZj4c5VUFCgrKwsFRQUqKysTFlZWcrKylJJSYlrnaSkJC1atMj192OPPaZ3331Xr732mrZu3ao5c+boo48+0v333y9JCgsL0z333KOHH35Yy5cv17p163TXXXepZ8+elf4lHLxLUECgurRKkiRlbuPWJwCAS6tWWZozZ46Ki4vVunVrtWnTRm3atFF8fLyKi4s1e/ZsT2eUJD399NNKSUnRpEmTVFJSopSUFKWkpGjt2rWudXJyclRUVOT6e/jw4Zo3b55mzJihzp0763/+53/0/vvvKyMjw7XO888/r8GDB+umm25Snz59FBMTo3/+8581cgyoG9LOuRQHAMClVHueJWOMPvvsM9cA7A4dOpT7CX5DwjxL3mXx+mX67at/VHLLtlr21FtWxwEAWKRG5llatmyZkpOTVVxcLJvNpl/96ld68MEH9eCDDyo9PV0dO3bUqlWrLjs8UJOcv4jbvCtPR44ftTgNAKCuq1JZmjVrlu69996Ltq+wsDD9/ve/13PPPeexcEBNiA6LVKvIFjLGaH0+N9UFALhXpbK0YcMGDRw4sMLn+/fvr3Xr1l12KKCm/Tw5JYO8AQDuVaks7d271+3tTPz8/OrMDN6AO9xUFwBQWVUqSy1btlR2dsWXLTZu3KjmzZtfdiigpl3ZtqskaV1+tsocZRanAQDUZVUqS9dff72eeuopnThx4oLnjh8/rkmTJmnw4MEeCwfUlKQWCQqxB6vkxDFt2bXN6jgAgDqsSjN4/+lPf9I///lPtW/fXg888IASExMlSVu2bNHcuXNVVlamJ598skaCAp7k6+Or1PiO+nxLpjLzNqrjFe2sjgQAqKOqVJaio6P15ZdfasyYMXriiSfknKLJZrNpwIABmjt3rqKjo2skKOBp6W266PMtmVq7bZNG973J6jgAgDqqyveGi4uL07///W8dOnRIW7dulTFG7dq1U0RERE3kA2qMc74lfhEHAHCnWjfSlaSIiAilp6d7MgtQq7rHd5TNZlPB/l3aW7Rf0WGRVkcCANRB1bo3HFAfhAY1UocWbSQxhQAAoGKUJTRozpvqcikOAFARyhIatPSEM+OW1uZxZgkAcHGUJTRoV54d5L2xYItOnDppcRoAQF1EWUKD1iqyhaJCm+hU2Wlt+HGz1XEAAHUQZQkNms1mc91UN5NLcQCAi6AsocFzzrfEL+IAABdDWUKD5yxLmds2uWalBwDAibKEBq9zbKLsfgE6cOSQ8gt3WB0HAFDHUJbQ4Nn9A9Q1LknSmbNLAACci7IESEpzDfJmckoAQHmUJUDlxy0BAHAuyhKgn88s5ezapqJjRyxOAwCoSyhLgKSo0CaKj7pCElMIAADKoywBZ6Ux3xIA4CIoS8BZzvvEMZM3AOBclCXgLOe4pfXbv9PpstMWpwEA1BWUJeCsxObxCg1qpGMnj+v7nVutjgMAqCMoS8BZPj4+Sk3oJIlLcQCAn1GWgHOkJzjHLTE5JQDgDMoScI70Nmdn8uYXcQCAsyhLwDm6t+4oH5uPdh7co12HCq2OAwCoAyhLwDlCAoPV8Yq2krgUBwA4g7IEnCctgckpAQA/oywB57myLZNTAgB+RlkCzuOcnDJ7R46OlZ6wOA0AwGqUJeA8VzSJUUxYlE47ypS1/Xur4wAALEZZAs5js9mUzk11AQBnUZaAi3DNt8Qv4gCgwaMsARfhHLe0dtsmORwOi9MAAKxEWQIuonOrRAX523XoaLHyCgusjgMAsBBlCbgIf18/dW2dLIkpBACgoaMsARVIT2DcEgCAsgRU6OdfxFGWAKAhoywBFUhN6CRJ+mHPjzpYUmRxGgCAVShLQAWaNgpX2+g4Scy3BAANGWUJcCOtzc9TCAAAGibKEuDGlW2cN9Vl3BIANFSUJcAN5+SUWdu/16my0xanAQBYgbIEuNE2Ok7hwaE6fuqksnfkWh0HAGAByhLgho+Pz8/jlpicEgAaJMoScAnOySnXMG4JABokyhJwCWnnzORtjLE4DQCgtlGWgEtIie8oXx9f7Snap52H9lodBwBQyyhLwCUEBwSqU2x7SUwhAAANEWUJqARuqgsADRdlCaiEn2+qyy/iAKChoSwBleAsS9/9tFVHTxyzOA0AoDZRloBKaBHRTC0jolXmKNO327+3Og4AoBZRloBKcp5dytzGuCUAaEgoS0AlOWfyZnJKAGhYKEtAJaUnnDmztG5bthwOh8VpAAC1hbIEVFLHK9oqKCBQxcdLlLtnu9VxAAC1hLIEVJKfr5+6x3eUxHxLANCQeE1Zmjp1qnr16qXg4GCFh4dX+nWbN2/WkCFDFBYWppCQEKWnp6ugoECSdPDgQT344INKTExUUFCQWrVqpXHjxqmoqKiGjgLejskpAaDh8ZqyVFpaqptvvlljxoyp9Gvy8vKUkZGhpKQkrVixQhs3btRTTz2lwMBASdKuXbu0a9cu/fd//7eys7M1f/58LVmyRPfcc09NHQa8HJNTAkDDYzNedhv1+fPna/z48Tp8+PAl1x0xYoT8/f21cOHCSm//vffe0x133KGjR4/Kz8+vUq8pLi5WWFiYioqKFBoaWul9wfscPlqspEf6S5I2zfi3okKbWJwIAFBdlf3+9pozS1XlcDj08ccfq3379howYICaNWumHj166IMPPnD7Oucb5q4onTx5UsXFxeUeaBjCQ0LVvnm8pDO/igMA1H/1tiwVFhaqpKRE06dP18CBA/XJJ59o+PDhuvHGG7Vy5cqLvmb//v3685//rN/97ndutz1t2jSFhYW5HrGxsTVxCKijrmRySgBoUCwtSxMnTpTNZnP72LJlS7W27ZwHZ+jQoZowYYK6deumiRMnavDgwZo3b94F6xcXF2vQoEFKTk7W5MmT3W77iSeeUFFRkeuxY8eOamWEd0pjkDcANCiVG5RTQx555BGNHj3a7ToJCQnV2nZkZKT8/PyUnJxcbnmHDh20evXqcsuOHDmigQMHqnHjxlq0aJH8/f3dbttut8tut1crF7yfc5D3hh+36OSpUtn9AyxOBACoSZaWpaioKEVFRdXItgMCApSenq6cnJxyy3NzcxUXF+f6u7i4WAMGDJDdbte//vUv1y/lgIokNItVk0bhOlhyWNk7cpWa0MnqSACAGuQ1Y5YKCgqUlZWlgoIClZWVKSsrS1lZWSopKXGtk5SUpEWLFrn+fuyxx/Tuu+/qtdde09atWzVnzhx99NFHuv/++yWdKUr9+/fX0aNH9frrr6u4uFh79uzRnj17VFZWVuvHCO9gs9lc8y2tydtgcRoAQE2z9MxSVTz99NNasGCB6++UlBRJ0vLly3X11VdLknJycspNKDl8+HDNmzdP06ZN07hx45SYmKj3339fGRkZkqT169frm2++kSS1bdu23P7y8/PVunXrGjwieLO0Np31n42rmG8JABoAr5tnqS5inqWG55utWRr63/epWWhTbXh2sWw2m9WRAABV1ODnWQJqUpdWSfL39VNh8QEV7N9ldRwAQA2iLAHVEBQQqM6tEiUx3xIA1HeUJaCanFMIZOYxbgkA6jPKElBN6UxOCQANAmUJqCbnmaXNu/J05PhRi9MAAGoKZQmopuiwSLWKbCFjjNbnc1NdAKivKEvAZXBdimO+JQCotyhLwGXgproAUP9RloDLcGXbrpKkdfnZKnNwixwAqI8oS8BlSGqRoBB7sEpOHFPOrm1WxwEA1ADKEnAZfH18lRrfUZK0hktxAFAvUZaAy+ScQoCb6gJA/URZAi4TM3kDQP1GWQIuU/f4jrLZbPpx/04VFh2wOg4AwMMoS8BlCg1qpKQWCZK4qS4A1EeUJcADuBQHAPUXZQnwgPQEZ1nizBIA1DeUJcAD0tucmcl7Y8EWnTh10uI0AABPoiwBHhAX2VJRoU10quy0Nv64xeo4AAAPoiwBHmCz2Vw31WVySgCoXyhLgIekJTA5JQDUR5QlwEOubHt2kPe2TTLGWJwGAOAplCXAQzrHJirAz18HjhxSfuEOq+MAADyEsgR4iN0/QF1bJUk6c3YJAFA/UJYAD+KmugBQ/1CWAA9yliV+EQcA9QdlCfCgtIROkqScXdtUdOyIxWkAAJ5AWQI8KCq0qeKjrpAkrcvPtjgNAMATKEuAh6W14T5xAFCfUJYAD3PO5J2ZxyBvAKgPKEuAhzkHea/f/p1Ol522OA0A4HJRlgAPS2wer8aBITp28ri+37nV6jgAgMtEWQI8zMfHR2lcigOAeoOyBNQAJqcEgPqDsgTUgPQ2Z84sMTklAHg/yhJQA1JaJ8vH5qOdB/do16FCq+MAAC4DZQmoAY0CQ9TxiraSuBQHAN6OsgTUkLQEJqcEgPqAsgTUEOe4JX4RBwDejbIE1BDnL+Kyd+ToWOkJi9MAAKqLsgTUkCuaxCgmLEqnHWXK2v691XEAANVEWQJqiM1mU9rZS3EM8gYA70VZAmrQlW0Y5A0A3o6yBNQg521P1m7bJIfDYXEaAEB1UJaAGtQptr0C/e06dLRYeYUFVscBAFQDZQmoQQF+/urWOlkSUwgAgLeiLAE1LD3BOd8S45YAwBtRloAalu76RRxlCQC8EWUJqGGpZ88s/bDnRx0sKbI4DQCgqihLQA1r2ihcbaPjJEnr8rMtTgMAqCrKElAL0towbgkAvBVlCagFTE4JAN6LsgTUAufklFnbv9epstMWpwEAVAVlCagFbaPjFB4cquOnTip7R67VcQAAVUBZAmqBj4/PzzfVZXJKAPAqlCWglrgmp2S+JQDwKpQloJaknTOTtzHG4jQAgMqiLAG1pFvrZPn6+Gr34X3aeWiv1XEAAJVEWQJqSYg9SJ1i20ti3BIAeBPKElCLnOOW1uRtsDgJAKCyKEtALXL9Im4bZ5YAwFtQloBadGWbrpKk737aqqMnjlmcBgBQGZQloBa1iGimlhHRKnOU6dvt31sdBwBQCV5TlqZOnapevXopODhY4eHhlX7d5s2bNWTIEIWFhSkkJETp6ekqKCi4YD1jjK677jrZbDZ98MEHngsOnMd1U13mWwIAr+A1Zam0tFQ333yzxowZU+nX5OXlKSMjQ0lJSVqxYoU2btyop556SoGBgResO2vWLNlsNk9GBi4q3XVTXcYtAYA38LM6QGVNmTJFkjR//vxKv+bJJ5/U9ddfrxkzZriWtWnT5oL1srKy9Ne//lVr165V8+bNLzsr4E56wpmytC4/Ww6HQz4+XvO/WQCgQaq3/5V2OBz6+OOP1b59ew0YMEDNmjVTjx49LrjEduzYMf3mN7/R3LlzFRMTY01YNCjJV7RVUECgio4dUe6e7VbHAQBcQr0tS4WFhSopKdH06dM1cOBAffLJJxo+fLhuvPFGrVy50rXehAkT1KtXLw0dOrTS2z558qSKi4vLPYDK8vf1U/f4jpKktXmMWwKAus7SsjRx4kTZbDa3jy1btlRr2w6HQ5I0dOhQTZgwQd26ddPEiRM1ePBgzZs3T5L0r3/9S8uWLdOsWbOqtO1p06YpLCzM9YiNja1WRjRcP09OSVkCgLrO0jFLjzzyiEaPHu12nYSEhGptOzIyUn5+fkpOTi63vEOHDlq9erUkadmyZcrLy7vg13U33XSTrrrqKq1YseKi237iiSf08MMPu/4uLi6mMKFK0s6OW2JySgCo+ywtS1FRUYqKiqqRbQcEBCg9PV05OTnllufm5iouLk7SmTNbv/3tb8s937lzZz3//PO64YYbKty23W6X3W73fGg0GGkJnSRJ2wp3aP+RQ4psHGFxIgBARbzm13AFBQU6ePCgCgoKVFZWpqysLElS27Zt1ahRI0lSUlKSpk2bpuHDh0uSHnvsMd16663q06ePfvnLX2rJkiX66KOPXGeMYmJiLjqou1WrVoqPj6+V40LDFB4SqvbN45W7O19r8zZpYLc+VkcCAFTAawZ4P/3000pJSdGkSZNUUlKilJQUpaSkaO3ata51cnJyVFRU5Pp7+PDhmjdvnmbMmKHOnTvrf/7nf/T+++8rIyPDikMAynGOW2JySgCo22zGGGN1CG9XXFyssLAwFRUVKTQ01Oo48BJ//3Kxxr/5F/Vo21UfPvqK1XEAoMGp7Pe315xZAuob50zeWds36+SpUovTAAAqQlkCLJLQLFZNGoXr5OlSZe/ItToOAKAClCXAIjabjXFLAOAFKEuAhdLanC1LTE4JAHUWZQmwkPOmupl5m8RvLQCgbqIsARbqGpckf18/FRYfUMGB3VbHAQBcBGUJsFBQQKA6t0qUJGXmbbA4DQDgYihLgMVcg7zzuE8cANRFlCXAYs75lripLgDUTV5zbzigvko7e2Zp88485e7OV1BAoMWJAKDuiWwcYdl/HylLgMViwqMU27S5dhzYrT5TbrM6DgDUSX8f94KuTu5hyb4pS0AdcPfVv9Z/L35dZY4yq6MAQJ3kY7NZtm9upOsB3EgXAADvw410AQAAPICyBAAA4AZlCQAAwA3KEgAAgBuUJQAAADcoSwAAAG5QlgAAANygLAEAALhBWQIAAHCDsgQAAOAGZQkAAMANyhIAAIAblCUAAAA3KEsAAABu+FkdoD4wxkiSiouLLU4CAAAqy/m97fwerwhlyQOOHDkiSYqNjbU4CQAAqKojR44oLCyswudt5lJ1CpfkcDi0a9cuNW7cWDabzWPbLS4uVmxsrHbs2KHQ0FCPbbeh4X30DN5Hz+B99AzeR89o6O+jMUZHjhxRixYt5ONT8cgkzix5gI+Pj6644ooa235oaGiD/BB7Gu+jZ/A+egbvo2fwPnpGQ34f3Z1RcmKANwAAgBuUJQAAADcoS3WY3W7XpEmTZLfbrY7i1XgfPYP30TN4Hz2D99EzeB8rhwHeAAAAbnBmCQAAwA3KEgAAgBuUJQAAADcoSwAAAG5QluqwuXPnqnXr1goMDFSPHj20Zs0aqyN5lWnTpik9PV2NGzdWs2bNNGzYMOXk5Fgdy+tNnz5dNptN48ePtzqK19m5c6fuuOMONW3aVEFBQercubPWrl1rdSyvUlZWpqeeekrx8fEKCgpSmzZt9Oc///mS9/Zq6D7//HPdcMMNatGihWw2mz744INyzxtj9PTTT6t58+YKCgpSv3799MMPP1gTtg6iLNVR7777rh5++GFNmjRJ69evV9euXTVgwAAVFhZaHc1rrFy5UmPHjtXXX3+tTz/9VKdOnVL//v119OhRq6N5rczMTL3yyivq0qWL1VG8zqFDh9S7d2/5+/vr//2//6fvv/9ef/3rXxUREWF1NK/y7LPP6uWXX9acOXO0efNmPfvss5oxY4Zmz55tdbQ67ejRo+ratavmzp170ednzJihF198UfPmzdM333yjkJAQDRgwQCdOnKjlpHWUQZ105ZVXmrFjx7r+LisrMy1atDDTpk2zMJV3KywsNJLMypUrrY7ilY4cOWLatWtnPv30U9O3b1/z0EMPWR3Jq/zhD38wGRkZVsfweoMGDTJ33313uWU33nijuf322y1K5H0kmUWLFrn+djgcJiYmxsycOdO17PDhw8Zut5t33nnHgoR1D2eW6qDS0lKtW7dO/fr1cy3z8fFRv3799NVXX1mYzLsVFRVJkpo0aWJxEu80duxYDRo0qNznEpX3r3/9S2lpabr55pvVrFkzpaSk6LXXXrM6ltfp1auXli5dqtzcXEnShg0btHr1al133XUWJ/Ne+fn52rNnT7n/3w4LC1OPHj34zjmLG+nWQfv371dZWZmio6PLLY+OjtaWLVssSuXdHA6Hxo8fr969e6tTp05Wx/E6f//737V+/XplZmZaHcVrbdu2TS+//LIefvhh/fGPf1RmZqbGjRungIAAjRo1yup4XmPixIkqLi5WUlKSfH19VVZWpqlTp+r222+3OprX2rNnjyRd9DvH+VxDR1lCgzB27FhlZ2dr9erVVkfxOjt27NBDDz2kTz/9VIGBgVbH8VoOh0NpaWl65plnJEkpKSnKzs7WvHnzKEtV8H//93/629/+prffflsdO3ZUVlaWxo8frxYtWvA+osZwGa4OioyMlK+vr/bu3Vtu+d69exUTE2NRKu/1wAMPaPHixVq+fLmuuOIKq+N4nXXr1qmwsFDdu3eXn5+f/Pz8tHLlSr344ovy8/NTWVmZ1RG9QvPmzZWcnFxuWYcOHVRQUGBRIu/02GOPaeLEiRoxYoQ6d+6skSNHasKECZo2bZrV0byW83uF75yKUZbqoICAAKWmpmrp0qWuZQ6HQ0uXLlXPnj0tTOZdjDF64IEHtGjRIi1btkzx8fFWR/JK1157rTZt2qSsrCzXIy0tTbfffruysrLk6+trdUSv0Lt37wumrsjNzVVcXJxFibzTsWPH5ONT/qvL19dXDofDokTeLz4+XjExMeW+c4qLi/XNN9/wnXMWl+HqqIcfflijRo1SWlqarrzySs2aNUtHjx7VXXfdZXU0rzF27Fi9/fbb+vDDD9W4cWPXtfewsDAFBQVZnM57NG7c+IJxXiEhIWratCnjv6pgwoQJ6tWrl5555hndcsstWrNmjV599VW9+uqrVkfzKjfccIOmTp2qVq1aqWPHjvr222/13HPP6e6777Y6Wp1WUlKirVu3uv7Oz89XVlaWmjRpolatWmn8+PH6y1/+onbt2ik+Pl5PPfWUWrRooWHDhlkXui6x+ud4qNjs2bNNq1atTEBAgLnyyivN119/bXUkryLpoo833njD6mhej6kDquejjz4ynTp1Mna73SQlJZlXX33V6khep7i42Dz00EOmVatWJjAw0CQkJJgnn3zSnDx50upoddry5csv+t/DUaNGGWPOTB/w1FNPmejoaGO32821115rcnJyrA1dh9iMYdpTAACAijBmCQAAwA3KEgAAgBuUJQAAADcoSwAAAG5QlgAAANygLAEAALhBWQIAAHCDsgQAHtC6dWvNmjXL6hgAagBlCYDXGT16tOs2DFdffbXGjx9fa/ueP3++wsPDL1iemZmp3/3ud7WWA0Dt4d5wACCptLRUAQEB1X59VFSUB9MAqEs4swTAa40ePVorV67UCy+8IJvNJpvNpu3bt0uSsrOzdd1116lRo0aKjo7WyJEjtX//ftdrr776aj3wwAMaP368IiMjNWDAAEnSc889p86dOyskJESxsbG6//77VVJSIklasWKF7rrrLhUVFbn2N3nyZEkXXoYrKCjQ0KFD1ahRI4WGhuqWW27R3r17Xc9PnjxZ3bp108KFC9W6dWuFhYVpxIgROnLkSM2+aQCqjLIEwGu98MIL6tmzp+69917t3r1bu3fvVmxsrA4fPqxrrrlGKSkpWrt2rZYsWaK9e/fqlltuKff6BQsWKCAgQF988YXmzZsnSfLx8dGLL76o7777TgsWLNCyZcv0+OOPS5J69eqlWbNmKTQ01LW/Rx999IJcDodDQ4cO1cGDB7Vy5Up9+umn2rZtm2699dZy6+Xl5emDDz7Q4sWLtXjxYq1cuVLTp0+voXcLQHVxGQ6A1woLC1NAQICCg4MVExPjWj5nzhylpKTomWeecS373//9X8XGxio3N1ft27eXJLVr104zZswot81zxz+1bt1af/nLX3TffffppZdeUkBAgMLCwmSz2crt73xLly7Vpk2blJ+fr9jYWEnSm2++qY4dOyozM1Pp6emSzpSq+fPnq3HjxpKkkSNHaunSpZo6derlvTEAPIozSwDqnQ0bNmj58uVq1KiR65GUlCTpzNkcp9TU1Ate+9lnn+naa69Vy5Yt1bhxY40cOVIHDhzQsWPHKr3/zZs3KzY21lWUJCk5OVnh4eHavHmza1nr1q1dRUmSmjdvrsLCwiodK4Cax5klAPVOSUmJbrjhBj377LMXPNe8eXPX/x0SElLuue3bt2vw4MEaM2aMpk6dqiZNmmj16tW65557VFpaquDgYI/m9Pf3L/e3zWaTw+Hw6D4AXD7KEgCvFhAQoLKysnLLunfvrvfff1+tW7eWn1/l/zO3bt06ORwO/fWvf5WPz5kT7//3f/93yf2dr0OHDtqxY4d27NjhOrv0/fff6/Dhw0pOTq50HgB1A5fhAHi11q1b65tvvtH27du1f/9+ORwOjR07VgcPHtRtt92mzMxM5eXl6T//+Y/uuusut0Wnbdu2OnXqlGbPnq1t27Zp4cKFroHf5+6vpKRES5cu1f79+y96ea5fv37q3Lmzbr/9dq1fv15r1qzRnXfeqb59+yotLc3j7wGAmkVZAuDVHn30Ufn6+io5OVlRUVEqKChQixYt9MUXX6isrEz9+/dX586dNX78eIWHh7vOGF1M165d9dxzz+nZZ59Vp06d9Le//U3Tpk0rt06vXr1033336dZbb1VUVNQFA8SlM5fTPvzwQ0VERKhPnz7q16+fEhIS9O6773r8+AHUPJsxxlgdAgAAoK7izBIAAIAblCUAAAA3KEsAAABuUJYAAADcoCwBAAC4QVkCAABwg7IEAADgBmUJAADADcoSAACAG5QlAAAANyhLAAAAblCWAAAA3Pj/eLCzk/p4W5YAAAAASUVORK5CYII="
     },
     "metadata": {},
     "output_type": "display_data",
     "jetTransient": {
      "display_id": null
     }
    }
   ],
   "execution_count": 16
  },
  {
   "cell_type": "markdown",
   "id": "177a4c35",
   "metadata": {},
   "source": [
    "## Final Optimized Design "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "23eb67dc",
   "metadata": {},
   "source": [
    "Finally, we will run two simulations again with the optimized parameters. We will add a [FieldMonitor](https://docs.flexcompute.com/projects/tidy3d/en/latest/api/_autosummary/tidy3d.FieldMonitor.html) to help visualize the mode splitting. "
   ]
  },
  {
   "cell_type": "code",
   "id": "1a6147fc",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-01-29T10:25:14.446585Z",
     "start_time": "2026-01-29T09:39:14.967244Z"
    }
   },
   "source": [
    "# Get the best parameters from the optimizer\n",
    "W_opt = results.optimizer.swarm.best_pos\n",
    "\n",
    "# Define a field monitor to help visualize the field distribution\n",
    "field_monitor = td.FieldMonitor(\n",
    "    center=(0, 0, 0), size=(td.inf, td.inf, 0), freqs=[freq0], name=\"field\"\n",
    ")\n",
    "\n",
    "# Define simulations with the optimal design\n",
    "sims = {\n",
    "    \"TE\": make_sim(W_opt, \"TE\").copy(\n",
    "        update={\"monitors\": [mode_monitor_bar, mode_monitor_cross, field_monitor]}\n",
    "    ),\n",
    "    \"TM\": make_sim(W_opt, \"TM\").copy(\n",
    "        update={\"monitors\": [mode_monitor_bar, mode_monitor_cross, field_monitor]}\n",
    "    ),\n",
    "}\n",
    "\n",
    "# Define and submit the batch\n",
    "batch = web.Batch(simulations=sims, verbose=True)\n",
    "batch_results = batch.run(path_dir=\"data\")"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Output()"
      ],
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "39b32d3566cc4d678ade69c271c4ebe8"
      }
     },
     "metadata": {},
     "output_type": "display_data",
     "jetTransient": {
      "display_id": null
     }
    },
    {
     "data": {
      "text/plain": [],
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data",
     "jetTransient": {
      "display_id": null
     }
    },
    {
     "data": {
      "text/plain": [
       "\u001B[2;36m10:39:25 CET\u001B[0m\u001B[2;36m \u001B[0mStarted working on Batch containing \u001B[1;36m2\u001B[0m tasks.                       \n"
      ],
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">10:39:25 CET </span>Started working on Batch containing <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">2</span> tasks.                       \n",
       "</pre>\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data",
     "jetTransient": {
      "display_id": null
     }
    },
    {
     "data": {
      "text/plain": [
       "\u001B[2;36m10:39:38 CET\u001B[0m\u001B[2;36m \u001B[0mMaximum FlexCredit cost: \u001B[1;36m0.050\u001B[0m for the whole batch.                \n"
      ],
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">10:39:38 CET </span>Maximum FlexCredit cost: <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">0.050</span> for the whole batch.                \n",
       "</pre>\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data",
     "jetTransient": {
      "display_id": null
     }
    },
    {
     "data": {
      "text/plain": [
       "\u001B[2;36m            \u001B[0m\u001B[2;36m \u001B[0mUse \u001B[32m'Batch.real_cost\u001B[0m\u001B[32m(\u001B[0m\u001B[32m)\u001B[0m\u001B[32m'\u001B[0m to get the billed FlexCredit cost after    \n",
       "\u001B[2;36m             \u001B[0mcompletion.                                                        \n"
      ],
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span>Use <span style=\"color: #008000; text-decoration-color: #008000\">'Batch.real_cost()'</span> to get the billed FlexCredit cost after    \n",
       "<span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">             </span>completion.                                                        \n",
       "</pre>\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data",
     "jetTransient": {
      "display_id": null
     }
    },
    {
     "data": {
      "text/plain": [
       "Output()"
      ],
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "52b8f755167149d496df2b7fd59052af"
      }
     },
     "metadata": {},
     "output_type": "display_data",
     "jetTransient": {
      "display_id": null
     }
    },
    {
     "data": {
      "text/plain": [
       "\u001B[2;36m11:25:11 CET\u001B[0m\u001B[2;36m \u001B[0mBatch complete.                                                    \n"
      ],
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #7fbfbf; text-decoration-color: #7fbfbf\">11:25:11 CET </span>Batch complete.                                                    \n",
       "</pre>\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data",
     "jetTransient": {
      "display_id": null
     }
    },
    {
     "data": {
      "text/plain": [],
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"></pre>\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data",
     "jetTransient": {
      "display_id": null
     }
    }
   ],
   "execution_count": 17
  },
  {
   "cell_type": "markdown",
   "id": "c37e8914",
   "metadata": {},
   "source": [
    "Plot the field intensity distribution for the TE and TM simulations. As expected, the TE mode mainly transmits to the bar port while the TM mode mainly transmits to the cross port."
   ]
  },
  {
   "cell_type": "code",
   "id": "c282c1fd",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-01-29T10:25:17.332931Z",
     "start_time": "2026-01-29T10:25:14.510603Z"
    }
   },
   "source": [
    "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(8, 2), tight_layout=True)\n",
    "batch_results[\"TE\"].plot_field(\"field\", \"E\", \"abs^2\", ax=ax1)\n",
    "batch_results[\"TM\"].plot_field(\"field\", \"E\", \"abs^2\", ax=ax2)\n",
    "plt.show()"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 800x200 with 4 Axes>"
      ],
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxQAAADNCAYAAAAhWjbrAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAiz9JREFUeJztnXecFOX9+N/PzNar9DtOiogFUZAEEbEnEokSjdEYNRYs0UjQfJVEDREBjQmJJpZElK8pkp/BRr6WRA0W7IoF1FhAVERQ4OjX73Z3Zp7fH7M7W+9ur8HBfd73mtftPvPMzDOzu/OZz/NpSmutEQRBEARBEARBaAfGrh6AIAiCIAiCIAi7L6JQCIIgCIIgCILQbkShEARBEARBEASh3YhCIQiCIAiCIAhCuxGFQhAEQRAEQRCEdiMKhSAIgiAIgiAI7UYUCkEQBEEQBEEQ2o0oFIIgCIIgCIIgtBtRKARBEARBEARBaDeiUAg7hRdffBGlFC+++OKuHorQyTz88MP06dOHurq6nX7sFStW4PP5+PDDD3f6sQVB6BpEXuy5iLzYcxGFQuhU7rrrLhYsWLCrh9Eu7r//fm6//fZdPQwAHMfh5ptvZtiwYYRCIUaPHs0DDzyQ9/ZVVVVceuml9O/fn8LCQr7xjW/wzjvv5Oz7r3/9i69//euEQiGGDBnC7NmzsSwrr+PYts3s2bO54oorKCoqynt8ncXIkSOZPHkys2bN2unHFgShY4i86BxEXuSHyIsuRgtCJ3LQQQfpY489Nqvdtm3d2Niobdve+YPKk8mTJ+uhQ4fu6mForbX+xS9+oQF9ySWX6HvuuUdPnjxZA/qBBx5odVvbtvURRxyhCwsL9Zw5c/Sdd96pR44cqYuLi/Unn3yS1vepp57SSin9jW98Q99zzz36iiuu0IZh6MsuuyyvcT766KNaKaW/+uqrdp1nZ/DUU09pQH/22We7bAyCILQdkRedg8iL/BF50XWIQtEF1NXV7eoh7DKaExC7A91FQHz11Vfa7/fradOmeW2O4+ijjz5aDxo0SFuW1eL2Dz30kAb0okWLvLbNmzfrXr166bPPPjut78iRI/UhhxyiY7GY13bddddppZReuXJlq2M95ZRT9FFHHZXvqXUJ0WhU9+7dW19//fW7dByC0B5EXhy7q4fRLkReuIi8EBKIQtEKX331lb7ooov0wIEDdSAQ0Hvvvbe+7LLLdCQS0Vprfe+992pAv/jii3rq1Km6f//+ulevXt728+bN0yNHjtSBQEAPHDhQ/+QnP9E7duxIO8Ynn3yiTzvtNF1WVqaDwaDea6+99Jlnnqmrqqq8Ps8884w+8sgjdWlpqS4sLNT777+/njFjRqvjz2e7pqYmPWvWLD18+HAdCAT0oEGD9NVXX62bmpqy9nfffffpcePG6XA4rHv16qWPPvpo/fTTT2uttR46dKgG0paEsHjhhRc0oF944YW0/T388MP661//ug6FQrpv3776nHPOyZq9mDJlii4sLNRfffWV/u53v6sLCwt1v3799M9+9rNWb5Zaa/3YY4/pk046yfsM99lnH33jjTembXvsscdmjb0lYTFlypSs/oll9uzZrY6pJebNm6cB/dFHH6W133///RrQr7zySovbn3HGGbqsrCxrdu/SSy/VBQUF3uf60UcfaUDPmzcvrd/69es1oH/1q1+1eJzGxkYdCAT0nDlz0trXrFmjAX3vvfdmbZN5fWbPnq0BvWrVKn3OOefokpIS3a9fPz1z5kztOI5et26dPuWUU3RxcbEuKyvTv//973OO5Xvf+54ePXp0i+MVhK5G5EU6Ii+SYxJ5IfJiT8fXme5TexobNmzgsMMO8/wLR4wYwfr16/nnP/9JQ0MDgUDA6/uTn/yE/v37M2vWLOrr6wGYM2cON9xwAxMnTmTq1KmsWrWKu+++m7fffpvXXnsNv99PNBpl0qRJRCIRrrjiCsrLy1m/fj1PPPEEVVVVlJaW8tFHH/Gd73yH0aNHc+ONNxIMBvnss8947bXXWhx/Pts5jsMpp5zCq6++yqWXXsqBBx7IBx98wG233cYnn3zCY4895vW94YYbmDNnDkcccQQ33ngjgUCAN998k+eff54TTjiB22+/3fONvO666wAoKytrdnwLFizgwgsvZNy4ccydO5dNmzZxxx138Nprr/Huu+/Sq1cvr69t20yaNInx48fz+9//nueee44//OEPDB8+nKlTp7Z4HRYsWEBRURHTp0+nqKiI559/nlmzZlFTU8Mtt9wCwHXXXUd1dTVfffUVt912G0CLPp4//vGPmThxYlrb4sWLWbhwIQMGDPDatm7d2uLYEhQXFxMMBgF49913KSws5MADD0zrc9hhh3nrjzrqqGb39e677/L1r38dw0gPkTrssMO45557+OSTTxg1ahTvvvsuAIceemhav4qKCgYNGuStb47ly5cTjUb5+te/ntc5tsSZZ57JgQceyG9/+1uefPJJbrrpJvr06cP//u//8s1vfpPf/e53LFy4kJ///OeMGzeOY445Jm37sWPH8vjjj1NTU0NJSUmHxyMIbUXkhciL5hB5IfKiR7CrNZruzPnnn68Nw9Bvv/121jrHcbTWyRmno446Km0GY/PmzToQCOgTTjghTfO/8847NaD/9re/aa21fvfdd7PMjZncdtttGtBbtmxp0/jz2e6+++7ThmFkzWLMnz9fA/q1117TWmv96aefasMw9Pe+972smYzEtdC6eRN25oxTNBrVAwYM0AcffLBubGz0+j3xxBMa0LNmzfLaErM7N954Y9o+v/a1r+mxY8e2fBG01g0NDVltP/7xj9NmX7TumAn7008/1aWlpfpb3/pW2veAZmalMpfU2ZnJkyfrffbZJ+sY9fX1GtC/+MUvWhxLYWGhvuiii7Lan3zySQ3oxYsXa621vuWWWzSg161bl9V33Lhx+vDDD2/xOH/5y180oD/44IO09vbMOF166aVem2VZetCgQVoppX/729967Tt27NDhcFhPmTIla7+J2bg333yzxTELQlch8kLkRb6IvEgi8mLPQbI8NYPjODz22GOcfPLJWRo5gFIq7f0ll1yCaZre++eee45oNMqVV16ZpvlfcskllJSU8OSTTwJQWloKwNNPP01DQ0POsSRmXh5//HEcx8n7HPLZbtGiRRx44IGMGDGCrVu3ess3v/lNAF544QUAHnvsMRzHYdasWVkzGZnXIh+WLVvG5s2b+clPfkIoFPLaJ0+ezIgRI7zrk8pll12W9v7oo4/m888/b/VY4XDYe11bW8vWrVs5+uijaWho4OOPP27z2DOpr6/ne9/7Hr179+aBBx5I+x48++yzeS2TJk3ytmlsbPRmn1JJXKfGxsYWx5Pv9on/zfVt7Tjbtm0DoHfv3i32y4cf/ehH3mvTNDn00EPRWnPxxRd77b169eKAAw7I+ZknxpDvDJ8gdCYiL0Re5IvIC5EXeyri8tQMW7ZsoaamhoMPPjiv/sOGDUt7v3btWgAOOOCAtPZAIMA+++zjrR82bBjTp0/n1ltvZeHChRx99NGccsopnHvuuZ7wOPPMM/nLX/7Cj370I37xi19w/PHH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urraW7788sv2nIogCN0V22lGoRABsbshMkMQhC5HEnm0SLdSKLTWXH755Tz66KM8//zzDBs2rNVtJkyYwJIlS9Lann32WSZMmADAsGHDKC8vT+tTU1PDm2++6fXJRTAYpKSkJG0RBGEPQoTDbo/IDEEQdhpi1W6RbqVQTJs2jX/84x/cf//9FBcXU1lZSWVlJY2NjV6f888/nxkzZnjv/+d//ofFixfzhz/8gY8//pg5c+awbNkyLr/8cgCUUlx55ZXcdNNN/Otf/+KDDz7g/PPPp6KiglNPPXVnn6IgCN0Fy8m9tIG7776b0aNHew+QEyZM4D//+Y+3vqmpiWnTptG3b1+Kioo4/fTTs2a+161bx+TJkykoKGDAgAFcffXVWBm+ui+++CJf//rXCQaD7LvvvixYsKDdp70nITJDEISdg86tTNiSNjZBt1Io7r77bqqrqznuuOMYOHCgtzz00ENen3Xr1rFx40bv/RFHHMH999/PPffcwyGHHMI///lPHnvssbSgvGuuuYYrrriCSy+9lHHjxlFXV8fixYsJhUI79fwEQehGdMJs06BBg/jtb3/L8uXLWbZsGd/85jf57ne/y0cffQTAVVddxb///W8WLVrESy+9xIYNGzjttNO87W3bZvLkyUSjUV5//XX+/ve/s2DBAmbNmuX1WbNmDZMnT+Yb3/gG7733HldeeSU/+tGPePrppzvnOuzGiMwQBGGnIVbtFunWdSi6E5JTXBC6Gx2sQ/HnqQwoLcxaHzz7Vlau+qTddSj69OnDLbfcwve//3369+/P/fffz/e//30APv74Yw488ECWLl3K4Ycfzn/+8x++853vsGHDBi+r0Pz587n22mvZsmULgUCAa6+9lieffDKt8NpZZ51FVVUVixcvbtcYha5HZIYgdDc6UIdi9MHUP/zzrHUbttcy6KJ5edeh2HvvvVm7dm1W+09+8hPmzZvHcccdx0svvZS27sc//jHz58/33q9bt46pU6fywgsvUFRUxJQpU5g7dy4+365N3NqtLBSCIAg7DVu75urMpb27s20efPBB6uvrmTBhAsuXLycWi6XVMxgxYgRDhgzx6hksXbqUUaNGpaUonTRpEjU1NZ6Vo7W6CYIgCMJOoBPcZN9++202btzoLc8++ywAZ5xxhtfnkksuSetz883Jgnr5WLV3Fd22DoUgCEKX0oKL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1ytXrtSzZ8/OmcquV69e+vHHH9fvv/++/u53v7tHpLJL5Wc/+5l+8cUX9Zo1a/Rrr72mJ06cqPv166c3b96stZbrlkptba1+99139bvvvqsBfeutt+p3331Xr127Vmud33l/85vf1H/605+89619b7V2UwAOGTJEP//883rZsmV6woQJesKECTvvxAVhD0RkRvsQmZE/IjOErkYUii7iT3/6kx4yZIgOBAL6sMMO02+88Ya37thjj9VTpkxJ6//www/r/fffXwcCAX3QQQfpJ598Mm294zj6+uuv12VlZToYDOrjjz9er1q1amecyk7jzDPP1AMHDtSBQEDvtdde+swzz9SfffaZt16uW5IXXnghK+814F2ffM576NChWbmyW/reaq11Y2Oj/slPfqJ79+6tCwoK9Pe+9z29cePGrjxVQegRiMxoOyIz8kdkhtDVKK213jW2EUEQBEEQBEEQdnckhkIQBEEQBEEQhHYjCoUgCIIgCIIgCO1GFApBEARBEARBENqNKBSCIAiCIAiCILQbUSgEQRAEQRAEQWg3olAIgiAIgiAIgtBuRKEQBEEQBEEQBKHdiEIhCIIgCIIgCEK7EYVC2CP561//ygknnNDlx1m8eDFjxozBcZwuP5YgCILQ+Yi8EISOIwqFsMfR1NTE9ddfz+zZs7v8WN/+9rfx+/0sXLiwy48lCIIgdC4iLwShcxCFQtjj+Oc//0lJSQlHHnnkTjneBRdcwB//+MedcixBEASh8xB5IQidgygUQrdly5YtlJeX85vf/MZre/311wkEAixZsqTZ7R588EFOPvnktLbjjjuOK6+8Mq3t1FNP5YILLvDe77333tx0002cf/75FBUVMXToUP71r3+xZcsWvvvd71JUVMTo0aNZtmxZ2n5OPvlkli1bxurVq9t/soIgCEK7EXkhCLsWUSiEbkv//v3529/+xpw5c1i2bBm1tbWcd955XH755Rx//PHNbvfqq69y6KGHtuuYt912G0ceeSTvvvsukydP5rzzzuP888/n3HPP5Z133mH48OGcf/75aK29bYYMGUJZWRmvvPJKu44pCIIgdAyRF4KwaxGFQujWnHTSSVxyySWcc845XHbZZRQWFjJ37txm+1dVVVFdXU1FRUW7j/fjH/+Y/fbbj1mzZlFTU8O4ceM444wz2H///bn22mtZuXIlmzZtStuuoqKCtWvXtuuYgiAIQscReSEIuw5RKIRuz+9//3ssy2LRokUsXLiQYDDYbN/GxkYAQqFQu441evRo73VZWRkAo0aNymrbvHlz2nbhcJiGhoZ2HVMQBEHoHEReCMKuQRQKoduzevVqNmzYgOM4fPHFFy327du3L0opduzY0ep+bdvOavP7/d5rpVSzbZlp/7Zv307//v1bPaYgCILQdYi8EIRdgygUQrcmGo1y7rnncuaZZ/KrX/2KH/3oR1mzPakEAgFGjhzJihUrstZlmp0///zzThljU1MTq1ev5mtf+1qn7E8QBEFoOyIvBGHXIQqF0K257rrrqK6u5o9//CPXXnst+++/PxdddFGL20yaNIlXX301q/3xxx/nkUceYfXq1fz6179mxYoVrF27lvXr13dojG+88QbBYJAJEyZ0aD+CIAhC+xF5IQi7DlEohG7Liy++yO233859991HSUkJhmFw33338corr3D33Xc3u93FF1/MU089RXV1dVr75MmTufnmmxk5ciQvv/wyd911F2+99Rb33Xdfh8b5wAMPcM4551BQUNCh/QiCIAjtQ+SFIOxalE7NZyYIewhnnHEGX//615kxYwbg5hUfM2YMt99+e6ceZ+vWrRxwwAEsW7aMYcOGdeq+BUEQhK5H5IUgdByxUAh7JLfccgtFRUVdfpwvvviCu+66S4SDIAjCborIC0HoOGKhEHoEXTXjJAiCIOxZiLwQhLYjCoUgCIIgCIIgCO1GXJ4EQRAEQRAEQWg3olAIgiAIgiAIgtBuRKEQBEEQBEEQBKHdiEIhCIIgCIIgCEK7EYVCEARBEARBEIR2IwqFIAiCIAiCIAjtRhQKQRAEQRAEQRDajSgUgiAIgiAIgiC0G1EoBEEQBEEQBEFoN/8fuox6IgeZYZQAAAAASUVORK5CYII="
     },
     "metadata": {},
     "output_type": "display_data",
     "jetTransient": {
      "display_id": null
     }
    }
   ],
   "execution_count": 18
  },
  {
   "cell_type": "markdown",
   "id": "9976d10f",
   "metadata": {},
   "source": [
    "Plot the transmission spectra. "
   ]
  },
  {
   "cell_type": "code",
   "id": "306d49bf",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-01-29T10:25:18.927107Z",
     "start_time": "2026-01-29T10:25:17.342509Z"
    }
   },
   "source": [
    "# Extract transmission spectra to the bar and cross ports\n",
    "P_TE_bar = np.abs(batch_results[\"TE\"][\"bar\"].amps.sel(mode_index=0, direction=\"+\")) ** 2\n",
    "P_TM_cross = np.abs(batch_results[\"TM\"][\"cross\"].amps.sel(mode_index=0, direction=\"+\")) ** 2\n",
    "\n",
    "# Plot the spectra\n",
    "plt.plot(ldas * 1e3, 10 * np.log10(P_TE_bar), label=\"TE bar port\")\n",
    "plt.plot(ldas * 1e3, 10 * np.log10(P_TM_cross), label=\"TM cross port\")\n",
    "plt.legend()\n",
    "plt.ylabel(\"Transmission (dB)\")\n",
    "plt.xlabel(\"Wavelength (nm)\")\n",
    "plt.ylim(-10, 0)\n",
    "plt.show()"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ],
      "image/png": "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5NPWy8vLkyTZbP6DWDabTW63u1raBgAA6pc6f6ursvr06aOEhASNHz9e27Zt03fffadp06Zp9+7dGjZsWG03DwAA1AENJvgkJSVp1apVysnJ0WWXXaZevXrpk08+0Xvvvadu3brVdvMAAEAdUOfn+NQ05vgAAFD/VPbzu8GM+AAAAJwOwQcAAIQMgg8AAAgZBB8AABAyCD4AACBkEHwAAEDIIPgAAICQQfABAAAhg+ADAABCBsEHAACEDIIPAAAIGQQfAAAQMgg+AAAgZITVdgPqI5fLpeLi4tpuBuoJh8Mhu91e280AAIjgUyWmaergwYM6fvx4bTcF9UyjRo2UmpoqwzBquykAENIIPlXgCz0pKSlyOp18iOG0TNNUXl6eDh06JElq2rRpLbcIAEIbwaeSXC6XFXoSExNruzmoR6KioiRJhw4dUkpKCre9AKAWMbm5knxzepxOZy23BPWR7++GuWEAULsIPlXE7S0Egr8bAKgbCD4AACBkEHwQkPT0dBmGobS0tNpuCgAAlUbwaeAMwzjlMmvWLCvElLf85z//qe23UO0WL16sRo0a1XYzAAA1gG91NXAHDhyw1pcsWaIHH3xQO3futMpiYmJ05MgRSdKaNWt07rnn+h1f099gKyoqUnh4eI1dj8nGABBaGPE5A6ZpKrcwv1YW0zQr1cbU1FRriY+Pl2EYfmUxMTFW3cTERL99qampcjgcpzz/jh071LdvX0VGRqpLly7asGGDtc/lcmnixIlq27atoqKi1LFjR/3lL3/xO37ChAkaOXKk5s6dq2bNmqljx47lXmfWrFnq3r27Fi5cqJYtW8rpdGr06NHKzMy06rjdbs2ZM0ctWrRQRESEunfvrlWrVln7fSNbS5YsUb9+/RQZGak33nhDN910kzIzM/1GwQAADRMjPmcgr6hAZ/1xQK1c+4e/rFN0RFStXLusadOm6emnn1bnzp01f/58DR8+XLt371ZiYqLcbrdatGihpUuXKjExUZ999pl+97vfqWnTpho9erR1jrVr1youLk6rV68+5bV27dqlt99+W//617+UlZWliRMn6rbbbtMbb7whSfrLX/6ip556SgsXLlSPHj30yiuvaMSIEfrmm2/UoUMH6zzTp0/XU089pR49eshms+npp5/2GwkrGwYBAA0LwQeWvn37ymbzHwTMyck55TG33367rr32WknS888/r1WrVunll1/W3XffLYfDodmzZ1t127Ztq02bNuntt9/2Cz7R0dF66aWXTnuLq6CgQK+99pqaN28uSXr22Wc1bNgwPfXUU0pNTdWTTz6pe+65R7/5zW8kSY899pjWrVunp59+Ws8995x1nj/96U+65pprrO2yI2EAgIaN4HMGnOGR+uEv62rt2sG2ZMkSderUqUrH9OnTx1oPCwtTr169tH37dqvsueee0yuvvKI9e/YoPz9fRUVF6t69u985unbtWql5Pa1atbJCj+/abrdbO3fulNPp1P79+3XxxRf7HXPxxRdr27ZtfmW9evWqylsEADQgBJ8zYBhGnbjdFCwtW7ZU+/btg3a+v//977rrrrv01FNPqU+fPoqNjdUTTzyhzz//3K9edHR00K5ZGTV9PQBA3cHkZpyRsl93Lykp0ZYtW6xRo08//VR9+/bVbbfdph49eqh9+/b64YcfAr7Wnj17tH//fr9r22w2dezYUXFxcWrWrJk+/fRTv2M+/fRTde7c+ZTnDQ8Pl8vlCrhdAID6gxEfWI4ePaqDBw/6lTVq1EiRkRXfVnvuuefUoUMHderUSX/+85917Ngx3XzzzZKkDh066LXXXtOHH36otm3b6vXXX9fmzZvVtm3bgNoXGRmp8ePH68knn1RWVpamTJmi0aNHW3Nzpk2bppkzZ+qss85S9+7dtWjRIqWlpVmTnyvSpk0b5eTkaO3aterWrZucTifPZAOABorgA8vAgQNPKnvrrbesycLlefTRR/Xoo48qLS1N7du31/Lly5WUlCRJuuWWW7R161aNGTNGhmFo7Nixuu2227Ry5cqA2te+fXtdc801+vWvf62MjAxdeeWV+utf/2rtnzJlijIzMzV16lQdOnRInTt31vLly/2+0VWevn37avLkyRozZoyOHj2qmTNn8pV2AGigDLOyPwgTIrKyshQfH6/MzEzFxcVZ5QUFBdq9e7fatm17yhEQVI9Zs2Zp2bJl9fYRGfz9AED1qujz+0TM8QEAACGD4AMAAEIGwQf1wqxZs+rtbS4AQN1B8AEAACGD4AMAAEIGwQcAAIQMgg8AAAgZBB8AABAyCD4AACBkEHwAAEDIIPg0cIZhnHKZNWuW0tPTZRiG7Ha79u3b53f8gQMHFBYWJsMwlJ6eXjtvoo6bNWuWunfvXtvNAABUAsGngTtw4IC1PP3004qLi/Mru+uuu6y6zZs312uvveZ3/KuvvqrmzZsHtU2maaqkpCSo56wNDeV9AEAoIficCdOUinJrZ6nks2VTU1OtJT4+XoZh+JXFxMRYdcePH69Fixb5Hb9o0SKNHz/+tNcpLCzUPffco5YtWyoiIkLt27fXyy+/LElav369DMPQypUr1bNnT0VEROiTTz5RYWGhpkyZopSUFEVGRuqSSy7R5s2brXMeO3ZM48aNU3JysqKiotShQwerfUVFRbr99tvVtGlTRUZGqnXr1po3b16F7ZswYYJGjhyp2bNnKzk5WXFxcZo8ebKKior83sOp2lPe+/jb3/6m2bNna9u2bdYo2uLFi0/bXwCA2hFW2w2o14rzpDlNa+faDx6QwqODesoRI0ZowYIF+uSTT3TJJZfok08+0bFjxzR8+HA99NBDpzz2xhtv1KZNm/TMM8+oW7du2r17t44cOeJXZ/r06XryySfVrl07JSQk6O6779Y777yjV199Va1bt9bjjz+uwYMHa9euXWrcuLEeeOABffvtt1q5cqWSkpK0a9cu5efnS5KeeeYZLV++XG+//bZatWqlvXv3au/evads49q1axUZGan169crPT1dN910kxITEzV37lxJOm17ynsfkZGRmjp1qlatWqU1a9ZIkuLj46vc9wCAmkHwgcXhcOj666/XK6+8oksuuUSvvPKKrr/+ejkcjlMe99133+ntt9/W6tWrNXDgQElSu3btTqo3Z84cXXHFFZKk3NxcPf/881q8eLGGDh0qSXrxxRe1evVqvfzyy5o2bZr27NmjHj16qFevXpKkNm3aWOfas2ePOnTooEsuuUSGYah169anfX/h4eF65ZVX5HQ6de6552rOnDmaNm2aHnroIeXn55+2PeW9D0mKiYlRWFiYUlNTT9sGAEDtIvicCYfTM/JSW9euBjfffLP69u2rRx55REuXLtWmTZtOO48lLS1Ndrtd/fr1O2U9X4CRpB9++EHFxcW6+OKLrTKHw6ELL7xQ27dvlyTdeuutuvbaa/Xll19q0KBBGjlypPr27SvJc+vqiiuuUMeOHTVkyBBdeeWVGjRo0Cmv361bNzmdpf3Wp08f5eTkaO/evcrMzDxte8p7HwCA+oU5PmfCMDy3m2pjMYxqeUtdu3bVOeeco7Fjx6pTp07q0qXLaY+Jioqq1Lmjo6t2a27o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a860n3fs2CG3262FCxfqm2++0Z///GctWLBA9957r1WHfg7O37PP3XffXe7PxNPPHsHo63feeUc33HCDbrrpJm3btk2ffvqprrvuOmu/y+XSsGHDVFRUpM8++0yvvvqqFi9erAcffLDa3lddE4x+vvLKK1VSUqKPPvpIW7ZsUbdu3XTllVdaz3ykn0/fzz/88IMuueQSnXPOOVq/fr3+97//6YEHHlBkZKRV54477tC//vUvLV26VBs2bND+/ft1zTXXWPurtZ9NBESS+c9//tOvbPz48eZVV11V4THffvutKcncvHmzVbZy5UrTMAxz3759pmma5l//+lczISHBLCwstOrcc889ZseOHYPa/voikH4uz+OPP262bdvW2qaf/Z1JP3/wwQfmOeecY37zzTemJHPr1q3WPvr5ZIH0dXFxsdm8eXPzpZdeqrDOBx98YNpsNvPgwYNW2fPPP2/GxcX59X+oCKSfDx8+bEoyP/74Y6ssKyvLlGSuXr3aNE36+UTl9fOYMWPM66+/vsJjjh8/bjocDnPp0qVW2fbt201J5qZNm0zTrN5+ZsQnyNavX6+UlBR17NhRt956q44ePWrt27Rpkxo1aqRevXpZZQMHDpTNZtPnn39u1bn00ksVHh5u1Rk8eLB27typY8eO1dwbqeNO1c/lyczMVOPGja1t+rlyTtfPv/zyiyZNmqTXX39dTqfzpOPp58o7VV9/+eWX2rdvn2w2m3r06KGmTZtq6NCh+vrrr606mzZtUteuXdWkSROrbPDgwcrKytI333xTo++lLjtVPycmJqpjx4567bXXlJubq5KSEi1cuFApKSnq2bOnJPr5dNxut95//32dffbZGjx4sFJSUtS7d2+/22FbtmxRcXGxBg4caJWdc845atWqlTZt2iSpevuZ4BNEQ4YM0Wuvvaa1a9fqscce04YNGzR06FC5XC5J0sGDB63niPmEhYWpcePG1jDqwYMH/f6HlmRt++qEutP184l27dqlZ599VrfccotVRj+f3un62TRNTZgwQZMnT/YL82XRz5Vzur7+8ccfJUmzZs3S/fffrxUrVighIUH9+/dXRkaGJPq6Mk7Xz4ZhaM2aNdq6datiY2MVGRmp+fPna9WqVUpISJBEP5/OoUOHlJOTo0cffVRDhgzRv//9b1199dW65pprtGHDBkmefgoPDz/pgeBNmjSpkc/CevPIivrgN7/5jbXetWtXnXfeeTrrrLO0fv16XX755bXYsoalKv28b98+DRkyRKNGjdKkSZNquqn12un6+dlnn1V2drZmzJhRi61sGE7X1263W5J033336dprr5UkLVq0SC1atNDSpUv9Qj0qdrp+Nk1Tv//975WSkqKNGzcqKipKL730koYPH67NmzeradOmtdj6+sH3t3rVVVfpjjvukCR1795dn332mRYsWKB+/frVZvMkMeJTrdq1a6ekpCTt2rVLkpSamqpDhw751SkpKVFGRoZSU1OtOifObPdt++rA34n97LN//34NGDBAffv2PWkyLf1cdSf280cffaRNmzYpIiJCYWFhat++vSSpV69eGj9+vCT6OVAn9rXvA7dz585WnYiICLVr1876pgx9XXXl/U2vWLFCf//733XxxRfr/PPP11//+ldFRUVZz4qkn08tKSlJYWFhfn+rktSpUye/v9WioiIdP37cr84vv/xSI5+FBJ9q9PPPP+vo0aPWf7T69Omj48ePa8uWLVadjz76SG63W71797bqfPzxxyouLrbqrF69Wh07drSGWuHvxH6WPCM9/fv3V8+ePbVo0SLZbP5/6vRz1Z3Yz88884y2bdumtLQ0paWl6YMPPpAkLVmyRHPnzpVEPwfqxL7u2bOnIiIitHPnTqtOcXGx0tPT1bp1a0mevv7qq6/8/nG1evVqxcXFnfQhBI8T+zkvL0+STvrvhc1ms0Yy6OdTCw8P1wUXXOD3typ5fibA97fas2dPORwOrV271tq/c+dO7dmzR3369JFUzf18RlOjQ0x2dra5detWc+vWraYkc/78+ebWrVvNn376yczOzjbvuusuc9OmTebu3bvNNWvWmOeff77ZoUMHs6CgwDrHkCFDzB49epiff/65+cknn5gdOnQwx44da+0/fvy42aRJE/OGG24wv/76a/Pvf/+76XQ6zYULF9bGW64VZ9rPP//8s9m+fXvz8ssvN3/++WfzwIED1uJDPwfn77ms3bt3n/StLvrZIxh9/cc//tFs3ry5+eGHH5o7duwwJ06caKakpJgZGRmmaZpmSUmJ2aVLF3PQoEFmWlqauWrVKjM5OdmcMWNGbb3tGnem/Xz48GEzMTHRvOaaa8y0tDRz586d5l133WU6HA4zLS3NNE362TRP3c+maZrvvvuu6XA4zBdeeMH8/vvvzWeffda02+3mxo0brXNMnjzZbNWqlfnRRx+Z//3vf80+ffqYffr0sfZXZz8TfKpg3bp1pqSTlvHjx5t5eXnmoEGDzOTkZNPhcJitW7c2J02a5PdVPNM0zaNHj5pjx441Y2JizLi4OPOmm24ys7Oz/eps27bNvOSSS8yIiAizefPm5qOPPlqTb7PWnWk/L1q0qNzjT8z59POZ/z2XVV7wMU362TSD09dFRUXm1KlTzZSUFDM2NtYcOHCg+fXXX/vVSU9PN4cOHWpGRUWZSUlJ5tSpU83i4uKafKu1Khj9vHnzZnPQoEFm48aNzdjYWPOiiy4yP/jgA7869HPF/ezz8ssvm+3btzcjIyPNbt26mcuWLfM7R35+vnnbbbeZCQkJptPpNK+++mq/f5yaZvX1s2GapnlmY0YAAAD1A3N8AABAyCD4AACAkEHwAQAAIYPgAwAAQgbBBwAAhAyCDwAACBkEHwAAEDIIPgDqrFmzZql79+613QyLYRhatmxZlY/buXOnUlNTlZ2dHfxGlXHkyBGlpKTo559/rtbrAPUZwQcIcQsWLFBsbKxKSkqsspycHDkcDvXv39+v7vr162UYhn744YcabmXNCnbgmjFjhv7whz8oNjY2aOcsT1JSkm688UbNnDmzWq8D1GcEHyDEDRgwQDk5Ofrvf/9rlW3cuFGpqan6/PPPVVBQYJWvW7dOrVq10llnnVUbTa2X9uzZoxUrVmjChAk1cr2bbrpJb7zxhjIyMmrkekB9Q/ABQlzHjh3VtGlTrV+/3ipbv369rrrqKrVt21b/+c9//MoHDBggSXr99dfVq1cvxcbGKjU1Vdddd531JGW3260WLVro+eef97vW1q1bZbPZ9NNPP0mSjh8/rt/+9rdKTk5WXFycLrvsMm3btu2U7X3ppZfUqVMnRUZG6pxzztFf//pXa196eroMw9C7776rAQMGyOl0qlu3btq0aZPfOV588UW1bNlSTqdTV199tebPn69GjRpJkhYvXqzZs2dr27ZtMgxDhmFo8eLF1rFHjhzR1VdfLafTqQ4dOmj58uWnbO/bb7+tbt26qXnz5lbZ4sWL1ahRI3344Yfq1KmTYmJiNGTIEB04cMCqM2HCBI0cOVKPPPKImjRpokaNGmnOnDkqKSnRtGnT1LhxY7Vo0UKLFi3yu965556rZs2a6Z///Ocp2wWEKoIPAA0YMEDr1q2zttetW6f+/furX79+Vnl+fr4+//xzK/gUFxfroYce0rZt27Rs2TKlp6dboxo2m01jx47Vm2++6XedN954QxdffLFat24tSRo1apQOHTqklStXasuWLTr//PN1+eWXVzha8cYbb+jBBx/U3LlztX37dj3yyCN64IEH9Oqrr/rVu++++3TXXXcpLS1NZ599tsaOHWvdyvv00081efJk/fGPf1RaWpquuOIKzZ071zp2zJgxmjp1qs4991wdOHBABw4c0JgxY6z9s2fP1ujRo/W///1Pv/71rzVu3LhTjq5s3LhRvXr1Oqk8Ly9PTz75pF5//XV9/PHH2rNnj+666y6/Oh999JH279+vjz/+WPPnz9fMmTN15ZVXKiEhQZ9//rkmT56sW2655aQ5PRdeeKE2btxYYZuAkHbGjzkFUO+9+OKLZnR0tFlcXGxmZWWZYWFh5qFDh8w333zTvPTSS03TNM21a9eaksyffvqp3HNs3rzZlGRmZ2ebpmmaW7duNQ3DsOq7XC6zefPm5vPPP2+apmlu3LjRjIuLMwsKCvzOc9ZZZ5kLFy40TdM0Z86caXbr1s1v35tvvulX/6GHHjL79OljmmbpE+Jfeukla/8333xjSjK3b99umqZpjhkzxhw2bJjfOcaNG2fGx8db2yde10eSef/991vbOTk5piRz5cqV5faJaZpmt27dzDlz5viVLVq0yJRk7tq1yyp77rnnzCZNmljb48ePN1u3bm26XC6rrGPHjuavfvUra7ukpMSMjo4233rrLb/z33HHHWb//v0rbBMQyhjxAaD+/fsrNzdXmzdv1saNG3X22WcrOTlZ/fr1s+b5rF+/Xu3atVOrVq0kSVu2bNHw4cPVqlUrxcbGql+/fpI8c1okqXv37urUqZM16rNhwwYdOnRIo0aNkiRt27ZNOTk5SkxMVExMjLXs3r273MnTubm5+uGHHzRx4kS/+g8//PBJ9c877zxrvWnTppJk3YbbuXOnLrzwQr/6J26fStlzR0dHKy4uzjp3efLz8xUZGXlSudPp9Jsr1bRp05POc+6558pmK/3PdJMmTdS1a1dr2263KzEx8aTjoqKilJeXV+n3BISSsNpuAIDa1759e7Vo0ULr1q3TsWPHrBDTrFkztWzZUp999pnWrVunyy67TJInhAwePFiDBw/WG2+8oeTkZO3Zs0eDBw9WUVGRdd5x48bpzTff1PTp0/Xmm29qyJAhSkxMlOT55tiJc4t8fPNtysrJyZHkmZ/Tu3dvv312u91v2+FwWOuGYUjyzDsKhrLn9p3/VOdOSkrSsWPHKnUe0zRPW6cy18/IyFBycnLFbwIIYQQfAJI883zWr1+vY8eOadq0aVb5pZdeqpUrV+qLL77QrbfeKknasWOHjh49qkcffVQtW7aUJL9vhflcd911uv/++7Vlyxb94x//0IIFC6x9559/vg4ePKiwsDC1adPmtO1r0qSJmjVrph9//FHjxo0L+H127NhRmzdv9is7cTs8PFwulyvga5TVo0cPffvtt0E5V2V9/fXXJ/0UAQAPbnUBkOQJPp988onS0tKsER9J6tevnxYuXKiioiJrYnOrVq0UHh6uZ599Vj/++KOWL1+uhx566KRztmnTRn379tXEiRPlcrk0YsQIa9/AgQPVp08fjRw5Uv/+97+Vnp6uzz77TPfdd1+5IUryTCyeN2+ennnmGX333Xf66quvtGjRIs2fP7/S7/MPf/iDPvjgA82fP1/ff/+9Fi5cqJUrV1ojQ7527969W2lpaTpy5IgKCwsrff4TDR48WJs2bQpakDqdvLw8bdmyRYMGDaqR6wH1DcEHgCRP8MnPz1f79u3VpEkTq7xfv37Kzs62vvYuScnJyVq8eLGWLl2qzp0769FHH9WTTz5Z7nnHjRunbdu26eqrr1ZUVJRVbhiGPvjgA1166aW66aabdPbZZ+s3v/mNfvrpJ7/rl/Xb3/5WL730khYtWqSuXbuqX79+Wrx4sdq2bVvp93nxxRdrwYIFmj9/vrp166ZVq1bpjjvu8JuHc+2112rIkCEaMGCAkpOT9dZbb1X6/CcaOnSowsLCtGbNmoDPURXvvfeeWrVqpV/96lc1cj2gvjHME28qA0CImTRpknbs2FFtXwF/7rnntHz5cn344YfVcv6yLrroIk2ZMkXXXXddtV8LqI+Y4wMg5Dz55JO64oorFB0drZUrV+rVV1/1+yHEYLvlllt0/PhxZWdnV+tjK44cOaJrrrlGY8eOrbZrAPUdIz4AQs7o0aO1fv16ZWdnq127dvrDH/6gyZMn13azANQAgg8AAAgZTG4GAAAhg+ADAABCBsEHAACEDIIPAAAIGQQfAAAQMgg+AAAgZBB8AABAyCD4AACAkEHwAQAAIeP/A49PxUgilqteAAAAAElFTkSuQmCC"
     },
     "metadata": {},
     "output_type": "display_data",
     "jetTransient": {
      "display_id": null
     }
    }
   ],
   "execution_count": 19
  },
  {
   "cell_type": "markdown",
   "id": "b9214b41",
   "metadata": {},
   "source": [
    "## Closing Remark"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2ba7fb3d",
   "metadata": {},
   "source": [
    "The final design in this notebook achieves reasonable performance but is by no means the best design. A more intricate optimization scheme can be used to enhance the final result as demonstrated in the [publication](https://doi.org/10.1364/OE.408432).\n",
    "\n",
    "Using the PSO optimizer from the `Design` plugin is a convenient plug-and-play tool for managing parallelized PSO runs within `Tidy3D`. Advanced users may wish to develop their own optimizer that supports advanced options like dynamic hyperparameters.\n",
    "\n",
    "Due to the large number of simulation runs, a PSO task can take a significant amount of time and FlexCredits. Users should have a good familiarity with Tidy3D before attempting to perform PSO to avoid making mistakes in the optimization and wasting credits. Running a smaller PSO task as a test and practice before a large PSO task is also highly recommended. "
   ]
  }
 ],
 "metadata": {
  "applications": [
   "Passive photonic integrated circuit components"
  ],
  "description": "This notebook demonstrates how to perform a particle swarm optimization of a polarization beam splitter in Tidy3D.",
  "feature_image": "./img/particle_swarm_optimization_pbs.png",
  "features": [
   "Global optimization"
  ],
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "keywords": "particle swarm optimization, PSO, polarization beam splitter, PBS, tidy3d, fdtd",
  "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.12"
  },
  "title": "Particle Swarm Optimization of a PBS| Flexcompute"
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
