{ "cells": [ { "cell_type": "markdown", "id": "0dff81f1-150e-4132-a41f-7d5b32dbae1d", "metadata": {}, "source": [ "# Adjoint Plugin: 1 Introduction\n", "\n", "## Introduction\n", "\n", "In this notebook, we will introduce the `adjoint` plugin of Tidy3D.\n", "The `adjoint` plugin allows users to take derivatives of arbitrary functions involving Tidy3D simulations through the use of the \"adjoint method\".\n", "The advantage of the adjoint method is that the gradients can be computed using only **two** FDTD simulations, independent of the number of parameters.\n", "This makes it possible to do gradient-based optimization or sensitivity analysis of devices with enormous numbers of parameters with minimal computational overhead.\n", "For more information on the technical details of the adjoint method and what it can be used for, we recommend these references (with links to their pre-print versions):\n", "\n", "* [Gradient-based \"inverse design\" optimization in photonics](https://arxiv.org/pdf/1801.06715.pdf).\n", "\n", "* [Adjoint method for electromagnetics](https://arxiv.org/abs/1908.10507)\n", "\n", "If you want to skip to some case studies of the `adjoint` plugin being used for some applications, see the\n", "\n", "* [Gradient Checking Notebook](https://docs.flexcompute.com/projects/tidy3d/en/v1.9.0rc2/notebooks/AdjointPlugin_2_GradientChecking.html).\n", "\n", "* [Inverse Design Notebook](https://docs.flexcompute.com/projects/tidy3d/en/v1.9.0rc2/notebooks/AdjointPlugin_3_InverseDesign.html).\n", "\n", "### Function differentiation\n", "\n", "The adjoint package enables users to take derivatives of functions that involve a Tidy3D simulation. For a bit of context, let's first talk about what we mean when we talk about differentiating functions in our programs.\n", "Say in our program we have programmatically defined a function of one variable $f(x)$. For example:\n", "```py\n", "def f(x):\n", " return x**2\n", "```\n", "\n", "Now, we wish to evaluate $\\frac{df(x)}{dx}$.\n", "\n", "If we know $\\frac{df}{dx}$ analytically, this is just a matter of writing a new function to compute this derivative, for example:\n", "\n", "```py\n", "def df(x):\n", " return 2*x\n", "```\n", "However, many of the more interesting and complex functions tend to compose several sub-functions together, for example\n", "$$f(x) = h(y) = h(g(x))$$\n", "might be written in a program as\n", "\n", "```py\n", "def f(x):\n", " y = x**2\n", " return 5 * y - y**3\n", "```\n", "\n", "As one can imagine, defining the derivative by hand can quickly become too daunting of a task as the complexity grows.\n", "\n", "However, we can simplify things greatly with knowledge of the derivatives of the simpler functions that make up $f$.\n", "Following the chain rule, we can write the derivative of $f$ above as\n", "$$\\frac{df}{dx}=\\frac{dh}{dy}\\frac{dg}{dx}(x)$$\n", "\n", "Thus, if we know the derivatives of the composite functions $h$ and $g$, we can construct the derivative of $f$ by multiplying all of the derivatives of the composite functions.\n", "This idea is straightforwardly generalized to functions of several inputs and outputs, and even functions that can be written more generally as a more complex \"computational graph\" rather than a sequence of operations.\n", "\n", "### Automatic differentiation\n", "\n", "The idea of a technique called \"automatic differentiation\" is to provide a way to compute these derivatives of composite functions in programming languages both efficiently and without the user needing to define anything by hand.\n", "\n", "Automatic differentiation works by defining \"derivative rules\" for each fundamental operation that the user might incorporate in his or her function. For example, derivative rules for `h` and `g`, in the example above may be used to help define the derivative for `f`. When the function is evaluated, all of the derivative information corresponding to each operation in the function are stitched together using the chain rule to construct a derivative for the entire function. Thus, functions of arbitrary complexity can be differentiated without deriving anything beyond just the derivative rules for the most basic operations contained within.\n", "\n", "This capability is provided by many programming packages, but we chose to utilize one from the [\"jax\"](https://jax.readthedocs.io/en/v1.9.0rc2/) package as it provides the flexibility and extendibility we needed for integrating this functionality into Tidy3D.\n", "\n", "Using `jax`, we may write a function $f$ using most of the fundamental operations in python and `numpy`. In `jax` both the operations and their derivatives are tracked when the function is called. Thus, `jax` gives the option to apply `jax.grad` to this function, which uses all of the derivative information and the chain rule to construct a new function that gives the derivative of the function with respect to its input arguments.\n", "\n", "This brings us back to the `adjoint` plugin. The point of the `adjoint` plugin is to extend `jax`'s automatic differentiation capability to allow it to track functions **that involve Tidy3D simulations** in their computational graph. In essence, we privode the \"derivative\" of the `tidy3d.web.run()` function, using the adjoint method, to tell jax how to differentiate functions that might involve both the setting up and postprocessing of a tidy3d simulation and its data. The end result is a framework where users can set up modeling and optimizations and utilize jax automatic differentiation for optimization and sensitivity analysis efficiently and without needing to derive a single derivative rule.\n", "\n", "In his notebook, we will give an overview of how `jax` works for beginners and provide simple example of the plugin. More complex case studies and examples will be provided in other notebooks, linked here:\n", "\n", "\n", "* [Gradient Checking Notebook](https://docs.flexcompute.com/projects/tidy3d/en/v1.9.0rc2/notebooks/AdjointPlugin_2_GradientChecking.html).\n", "\n", "* [Inverse Design Notebook](https://docs.flexcompute.com/projects/tidy3d/en/v1.9.0rc2/notebooks/AdjointPlugin_3_InverseDesign.html)." ] }, { "cell_type": "markdown", "id": "87d26e12-3c03-432d-9cf4-61f0b03a8608", "metadata": {}, "source": [ "## Automatic Differentiation using `jax`\n", "\n", "Before jumping into any Tidy3D simulations, we will give a bit of a primer on using jax for automatic differentiation. For more details, we highly recommend checking out jax's [tutorial on the subject](https://jax.readthedocs.io/en/v1.9.0rc2/notebooks/autodiff_cookbook.html), as we'll be covering a lot of the same topics but in less depth.\n", "\n", "First, we will import `jax` and its `numpy` wrapper, which provides most of the same functionality, but allows derivative tracking.\n", "\n", "Tip 1: if you run into an obscure error using `jax`, the first thing to check is whether you're using the `jax.numpy` wrapper instead of regular `numpy` in your function, as otherwise you will get errors from `jax` that are not super clear." ] }, { "cell_type": "code", "execution_count": 1, "id": "d1ce429f-3183-4f7f-8b16-dda847239742", "metadata": {}, "outputs": [], "source": [ "import jax\n", "import jax.numpy as jnp\n", "import matplotlib.pylab as plt" ] }, { "cell_type": "markdown", "id": "b5d017ba-6dc9-4cc0-b226-2b3c3438e0d5", "metadata": {}, "source": [ "Say we have a function $f$ that performs several operations on a single variable.\n", "\n", "We can define this function `f` in python and also derive its derivative for this simple case, which we write as a function `df`." ] }, { "cell_type": "code", "execution_count": 2, "id": "c501ff19-8e46-4aaf-86dd-89a97732dfa0", "metadata": {}, "outputs": [], "source": [ "def f(x):\n", " return 5 * jnp.sin(x) - x**2 + x\n", "\n", "def df(x):\n", " return 5 * jnp.cos(x) - 2*x + 1" ] }, { "cell_type": "markdown", "id": "434d1841-45e5-48a3-986c-56e630badd2d", "metadata": {}, "source": [ "Let's evaluate these functions at several points and plot them." ] }, { "cell_type": "code", "execution_count": 3, "id": "237ede5f-0a7d-45cf-927b-dcb2a9b57d9c", "metadata": {}, "outputs": [ { "data": { "image/png": "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XFa+TaFfUP6ary4xMdHiJCIiIpJbf31uX2neWbcvKklJSQDExMRYnERERESuVlJSEiEhIZf8vttPoe90Ojl+/DhBQUHYbLY8fe7ExERiYmI4cuRIoZyeX9vn/gr7Nmr73F9h30Zt37UzDIOkpCSio6Ox2y89EsXt96jY7XZKly6dr68RHBxcKP8B/kXb5/4K+zZq+9xfYd9Gbd+1udyelL9oMK2IiIi4LBUVERERcVkqKpfh4+PDK6+8go+Pj9VR8oW2z/0V9m3U9rm/wr6N2r785/aDaUVERKTw0h4VERERcVkqKiIiIuKyVFRERETEZamoiIiIiMtSUfmbt956i+bNm+Pv709oaGiuHmMYBi+//DJRUVH4+fnRpk0b9uzZk79Br8PZs2fp0aMHwcHBhIaG0r9/f5KTky/7mFatWmGz2S64PProowWU+PI+//xzypUrh6+vL02bNmX16tWXvf+PP/5ItWrV8PX1pXbt2vz2228FlPTaXc02jh079l/vla+vbwGmvTp//vknHTp0IDo6GpvNxowZM674mEWLFtGgQQN8fHyoVKkSY8eOzfec1+pqt2/RokX/ev9sNhuxsbEFE/gqDRs2jMaNGxMUFERkZCT33HMPu3btuuLj3OXn8Fq2z91+Br/88kvq1KmTM6Fbs2bNmD179mUfU9Dvn4rK32RmZtKlSxcGDhyY68e89957fPLJJ4wcOZJVq1YREBBA27ZtSU9Pz8ek165Hjx5s27aNefPmMXPmTP78808GDBhwxcc9/PDDnDhxIufy3nvvFUDay/vhhx94+umneeWVV1i/fj1169albdu2xMXFXfT+y5cvp3v37vTv358NGzZwzz33cM8997B169YCTp57V7uNYM4g+ff36tChQwWY+OqkpKRQt25dPv/881zd/8CBA7Rr147WrVuzceNGnnrqKR566CHmzp2bz0mvzdVu31927dp1wXsYGRmZTwmvz+LFixk0aBArV65k3rx5ZGVlcfvtt5OSknLJx7jTz+G1bB+4189g6dKleeedd1i3bh1r167llltuoWPHjmzbtu2i97fk/TPkX8aMGWOEhIRc8X5Op9MoWbKkMXz48Jzb4uPjDR8fH+P777/Px4TXZvv27QZgrFmzJue22bNnGzabzTh27NglH9eyZUvjySefLICEV6dJkybGoEGDcr52OBxGdHS0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//bXiIiIiFy7Qj9GRURERNyXioqIiIi4LBUVERERcVkqKiIiIuKyVFRERETEZamoiIiIiMtSURERERGXpaIiIiIiLktFRURERFyWioqIiIi4LBUVERERcVkqKiLiUk6dOkXJkiV5++23c25bvnw53t7e/1peXkQKPy1KKCIu57fffuOee+5h+fLlVK1alXr16tGxY0c++OADq6OJSAFTURERlzRo0CD++OMPGjVqxJYtW1izZg0+Pj5WxxKRAqaiIiIuKS0tjVq1anHkyBHWrVtH7dq1rY4kIhbQGBURcUn79u3j+PHjOJ1ODh48aHUcEbGI9qiIiMvJzMykSZMm1KtXj6pVq/LRRx+xZcsWIiMjrY4mIgVMRUVEXM7gwYOZOnUqmzZtIjAwkJYtWxISEsLMmTOtjiYiBUyHfkTEpSxatIiPPvqICRMmEBwcjN1uZ8KECSxZsoQvv/zS6ngiUsC0R0VERERclvaoiIiIiMtSURERERGXpaIiIiIiLktFRURERFyWioqIiIi4LBUVERERcVkqKiIiIuKyVFRERETEZamoiIiIiMtSURERERGXpaIiIiIiLuv/AW+Nw/m5xtMSAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "xs = jnp.linspace(-1, 3, 1001)\n", "plt.plot(xs, f(xs), label='f(x)')\n", "plt.plot(xs, df(xs), label='df/dx(x)')\n", "plt.xlabel('x')\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "3e9915a8-59e9-4209-bf29-bd21dcda84a3", "metadata": {}, "source": [ "Now let's use jax to compute the derivative for us and see how it compares to our analytical derivative.\n", "\n", "We first call `jax.grad(f)`, which returns a new function that can be evaluated at `x` to give the derivative `df/dx(x)`.\n", "\n", "For more details on `jax.grad` and the various other inputs it can take, refer to its documentation [here](https://jax.readthedocs.io/en/v1.9.0rc2/_autosummary/jax.grad.html)." ] }, { "cell_type": "code", "execution_count": 4, "id": "f846ded9-26ac-4778-b637-56768b07dd6e", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# get the gradient as a function of x\n", "df_jax = jax.grad(f)\n", "\n", "# get a set of points to feed the derivative function one by one (for now)\n", "xs_jax = jnp.linspace(-1, 3, 21)\n", "df_jax_eval = [df_jax(x) for x in xs_jax]\n", "\n", "plt.plot(xs, f(xs), label='f(x)')\n", "plt.plot(xs, df(xs), label='df/dx(x) [analytical]')\n", "plt.plot(xs_jax, df_jax_eval, 'k.', label='df/dx(x) [using jax]')\n", "plt.xlabel('x')\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "be79405a-621a-4170-9799-ef65efc68335", "metadata": {}, "source": [ "Note: `jax` provides several other useful gradient wrappers, which can be used in different contexts. \n", "\n", "For example [jax.value_and_grad](https://jax.readthedocs.io/en/v1.9.0rc2/_autosummary/jax.value_and_grad.html) returns both the function return value and the gradient value, which is useful to avoid repetitive computation if you need the value as the `jax.grad` call must evaluate `f`." ] }, { "cell_type": "code", "execution_count": 5, "id": "9d26f7d1-124b-4e0d-9f34-75cbf4030ad9", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAioAAAGwCAYAAACHJU4LAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB9GElEQVR4nO3deVhU5fvH8ffMsO+iIuAALiDu4p5LiWZZLmmZmjuKW1lZmqntZWWmlT9TUxOX1NzK1DQ1UzL3fV8BBUVBXNnXmfP7Y5Rv5AYKnBm4X9c1l8PMOWc+hwHm9jnPolEURUEIIYQQwgxp1Q4ghBBCCHE/UqgIIYQQwmxJoSKEEEIIsyWFihBCCCHMlhQqQgghhDBbUqgIIYQQwmxJoSKEEEIIs2WldoDHZTQauXz5Ms7Ozmg0GrXjCCGEECIfFEUhOTkZb29vtNr7t5tYfKFy+fJlfHx81I4hhBBCiEdw8eJF9Hr9fZ+3+ELF2dkZMJ2oi4uLymmEEEIIkR9JSUn4+Pjkfo7fj8UXKncu97i4uEihIoQQQliYh3XbkM60QgghhDBbUqgIIYQQwmxJoSKEEEIIsyWFihBCCCHMlhQqQgghhDBbUqgIIYQQwmxJoSKEEEIIsyWFihBCCCHMlhQqQgghhDBbUqgIIYQQwmxJoSKEEEIIsyWFisiX2NhYwsPDiY2NVTuKEEKIUkQKFZGX0QiZKZB2A1KvQ0oCYdO+wc/PjzZt2uDn50fYzOlgyFE7qRBCiFJAoyiKonaIx5GUlISrqyuJiYmyejKmlo+IiAgCAgLQ6/WQkwm3LkLiRUhJgNSE2/9ehZQrkHbdVJhkpZj+zU7Ne7wkI35TUjD+66dEp4Hot5zQu1qDlR3YuYKDO9iXAXs307+OHuDiDa56cKkIrhXBzg3usUrmXZmFEEKUePn9/LYqxkyiqBiy4cY5wn74niGfzsBoVNBqYHY3L0JrpAGPXotGXDfmKVIADApE3jCidzGYCpvsVEi+/PCD2ThB2apQrtrtWwBhG48xZPSnGI1GtFots2fPJjQ09JHzCiGEKFmkRcXSpN2Ay4dMt4STkHAarp0l9lbm/Vs+yjqBmy84VQAnD1Nrh1N507+O5cDW2VRE2Djevu8IOhvQ6Ii9fBk/Pz+MRuP/jqvTEX3qEPoK5SAnHTISIf2mKVv6TdMt5QokXoKkWNO/6TfuOpV7ttZotUTv/h19UBuwtivK76QQQggVSYtKSZCTaSpIYvfD5YNw6SDcPH/PTSMSbe7d8vHMQvTPdb7nJZf80Ov1zJ49m6FDh2IwGNDpdMyaNQt9QJ2CHSg73XQJ6noEXDsL1yKI2L4Ho3Iwb2ajkcjp3dBXsYeKDcCvOfi1AJ8mpktMQgghShVpUTEn2ekQuw+id0DMDtP9nIy7t3OvAt4NwLM2eNSE8tWJTdbgV7ny3S0f0dGF0u8jNjaWyMhI/P39C60fSWxs7N2tNVoN0WP06G0S826s0UKF2lAlGAKeAZ8nwMqmUHIIIYQoftKiYsZyO49WrYpedxUiN0PUFlPLiTE778YO5cCnqal1oWID8K5v6qz6H/oy3Lvlo5CKCr1eX+gdXe/bWjNwINyMhpidt287TC1J8UdNt51TTZeqqgSD/9MQ0M7UWVcIIUSJo3qLyqVLlxgzZgzr168nLS0Nf39/5s2bR6NGjfK1v6W1qIRN/44hb476X4fXjnaENvhXy4Czl+lSR6UWpn/LVSvQZZuiaPkoavnKnBRnKlgi/zLdUq/mfV7fGGp2hhovQBm/3OPKaCIhhDBP+f38VrVQuXnzJvXr16d169a8+uqrlC9fnoiICKpWrUrVqlXzdQyLKFSuRcCp34nd9Qt+Y3fd3eF12ovom3SCKq2gTOVH7k9SahiNEH8EIv6CyE1wcS95RjZ51yfsXAWGTPpFRhMJIYSZsohCZezYsezYsYNt27ble5/MzEwyMzNzv05KSsLHx8e8ChVFgbjDcGotnF4LV08DEH4+hzY/pd21eXh4OMHBwcWbsSRJjodTv8PJ1RCzg9jEnLtHExVifx0hhBCPL7+Fiqoz065Zs4ZGjRrRrVs3PDw8qF+/Pj/++OMD95kwYQKurq65Nx8fn2JK+xCKAvHH4M8PYUpdmB0M2yabihStFVR9moDun6LV5v2W63Q6/P391clcUjh7QpPBELIWRp0lIvC1u0dAGQxEznvN1OfFsvuPCyFEqaJqi4qdnWmejJEjR9KtWzf27dvHiBEjmDlzJv3797/nPmbXonLjPBz/BY79kttyAoC1A/i3hRqdIOBZ04ytQFhY2F2dR+WSROG652iiO3PKuGhNI6Uah0LdHqZ5Y4QQQhQ7i7j0Y2NjQ6NGjdi5c2fuY2+++Sb79u1j165d+TqGKn1U0m6YCpNjy01DiO/Q2UK1dlDnZfB/Bmwc7rm7JXZ4tTR3FYRfvktoYBIc/xWyb19+s3GGeq9A40HgUV3dwEIIUcpYxPBkLy8vatasmeexGjVq8Ouvv6qUKK88o0a8veH833BwoanfiSHLtJFGC5WfgjrdoUbHfE1KVhRDfUVeoaGhtGvX7u6C8NnP4cgS2DcHrkfCvh9NN/9noMWbUOlJ6cwshBBmRNVCpUWLFpw5cybPY2fPnsXPz0+lRP8TFhbGkCFDbo8a0TD7ZS9Ca6T8bwPPOlCvF9R+ydRHQpidexaE9m7wxKvQdBic3wp7f4Qzf5hGD0VuMs1T0/xN0zBnnUwzJIQQalP10s++ffto3rw5n376Kd27d2fv3r0MHjyY2bNn07t373wdoygu/Zj6OPhi/FePTJ0Gosd4oW/ZCxr0Ba96hfJawgzcOAe7psOhRf+bCbhMJWjxFgT1lhlwhRCiCFhEHxWAtWvXMm7cOCIiIqhcuTIjR45k8ODB+d6/KAqV8PBw2rRpc/fjmzYQ3LZdobyGMEOp10wtLHtn/28RRVdfeGqUqWDRWaubTwghShCLKVQeV9G1qNxjxWCZh6N0yEqFgz/B9u9Mq0CDafXpJ9+BoF5SsAghRCGwiHlUzNWdNWh0Oh1Aoa+bI8ycjaOpH8uII9BuAjh6wK0L8PubMK0RHPuF2AsXCA8PJzY2Vu20QghRokmLygPIMGIBQFYaHJgH26dAagJhB7MYsjYDo4JMzy+EEI9ILv0IUdiyUold/QV+PSb8Z3p+LdHRMVLMCiFEAcilHyEKm40jEeWeucf0/EYifxoBqdfVySWEECWYFCpCFEBAQMDd6zVpwP/an/B9A9OoIUOOSumEEKLkkUJFiAK4Z0frCWPRB9SFjFvwxzumBSljdj7wOEIIIfJH+qgI8Qju6mhtyDF1uN3yualgAaj9MrT7EpwrqJpVCCHMkXSmFUINqddhy2dwYAGgmNZ+euYzqN8PtNKAKYQQd0hnWiHU4FgWOv0fDAkHryDISITfR8CCjnAtQu10QghhcaRQEaIoeNeHQZvh2S/A2gFidsAPzWHr15CTpXY6IYSwGFKoCFFUdFbQ/HV4bTf4twVDFoR/AbOegksH1U4nhBAWQQoVIYpaGT/o/Qt0DQOHcnD1FMxpC+FfgiFb7XRCCGHWpFARojhoNFDnZRi+F2q9BIoBtk6EH9vAlZNqpxNCCLMlhYoQxcmxLHSbBy/PBfsyEH8UZrcyrSNkNKidTgghzI4UKkKooXZXeG0PVHvO1Hflr49h3vPEHt8tqzILIcS/SKEihFqcK0DPpdB5Otg4E7Z6G351m9GmTRv8/PwICwtTO6EQQqhOJnwTwgzEHt+NX91m/1mVWUd0dLSsyiyEKJFkwjchLEjE1fR7rMpsIHL3BnUCCSGEmZBCRQgzcN9VmXeNhl3TwbIbPoUQ4pFJoSKEGbjnqsyDm6J3NsLG92B5X9N0/EIIUcpIHxUhzEieVZkrVoR9c2DDODBmg3sV6L4QPGurHVMIIR6brJ4sREkRux+W94ekWLCyh47fQlAvtVMJIcRjkc60QpQU+kYwbJtpvaCcdFj1Kqx5A7Iz1E4mhBBFzkrtAEKIfHBwh14r4J9J8PcEOPgTXD4MrywGN1+101kUg1Hh/LVUoq6mYKPT4mCjw9HWynS7fd/eWodWq1E7qhACKVSEsBxaLQSPMbWw/Dro9vT7wdD9J6jUUu10Zikrx0hEQjInLiVx4nIixy8ncSouibSshy9X4Gijw+FfxYujjRUOtrrcgsbBxgonW9NjTrZWONj8b9uKZeypUs4RjUaKHSEel/RREcIS3boIS3uZihWtFTw/ERoPUjuVqtKzDJyKT+LE5SROXErk+OVEzsankGUw3rWtnbWWAA9nFBTSMg2kZOaQlmUgNSun0EaC+5V14OnqFXi6hgdNKrtjrZMr7UL8m3SmFaKky0qDNa/D8V9NXzccAM9/DVY26uYqBonp2Zy8bGolOXE5ieOXEom6mnLXpHkAznZW1PJ2oba3K7UrulLL24Uq5Z3Q3ePSjqIopGcbSM00kJaV878CJjOH1ExTIZOWmUPq7cfSsu4UObefzzTtc+5qap4CydnWiqcCy9O2hgfB1Two41jy3yMhHkYKFSFKA0WBHVPgr08BBXybmYYwO5VXO1mhuZaSmVuM3ClMYq6n3XPbck421PJ2pXZFU2FSy9sVH3f7Yr8Ek5qZw7aIa2w+dYXwMwlcS8nKfU6rgUZ+7rSp4UHbGh5ULe8kl4hEqSSFihClydmNpn4rmUngooeeP4NXPbVTPbLE9Gx+PRDL4j0xRF1Nvec2Fd3sTS0lt1tJald0xcPZ1uw+9I1GhSOxt9h8KoG/Tl3hdHxynufvXCJqW8ODxnKJSJQiUqgIUdpcPQtLe8L1SLB2hJfnQuBzaqcqkNPxSfy0K4bfDl4iPft/HV6rlHOk1p2CxNv0r6VePom9mcaW0wlsPpXArqjrcolIlFoWWah89dVXjBs3jhEjRjBlypR87SOFihD/kn4LVvSHc3+DRgvtJsATw9RO9UDZBiMbT8Tz064Y9p6/kft4gIcT/ZpXonOQNy521iomLDr5uUT0dA0PnpZLRKIEsrhCZd++fXTv3h0XFxdat24thYoQj8qQDetGmuZaAWgyFJ6bAFqdurn+IyEpg5/3XuDnPRdISM4EQKfV0K5WBfo+UYknqriXqg/m/F4i6v2EL1XLO6mUUojCY1GFSkpKCg0aNGDGjBl8/vnnBAUF3bdQyczMJDMzM/frpKQkfHx8pFAR4t8UBXb8H/z1senras8R2/QzIi5cJiAgAL1er1IshX3RN/lpVzQbjseTc3uYTjknW3o18aFnU1+8XO1VyWZu7neJSKfV0KuJLyPaBlDOyVbllEI8OosqVPr374+7uzvfffcdwcHBDyxUPvnkEz799NO7HpdCRYh7OLEKfhtK2N4khqzNwKiAVqtl9uzZhIaGFluMtKwcVh26zE+7ovO0FDTyK0PfZn48X9sLGyvpRHo/dy4Rrdh/kc2nEwBwsrXi1eCqhLasjJ21ebWWCZEfFlOoLF26lC+++IJ9+/ZhZ2f30EJFWlSEKJjYfevwa9oxzxwjOp2O6OjoIm9ZOX8tlYW7Ylhx4CLJGTmAabK1LkEV6dvMj1rerkX6+iXRrqjrfPnHKY5dSgTA29WOd9oF0iWookz7LyxKfgsVVafQv3jxIiNGjGDTpk3Y2dnlax9bW1tsbaW5U4j8ikhxuGsiNIPBQGRkZJEUKgajQvjpBH7aHcM/Z6/mPu5X1oG+T/jRraEPrg4ls3NscWhWtSyrh7dgzZHLTNp4hku30hm5/Ahzd5znvfY1aF61nNoRhShUqraorFq1ihdffBGd7n/NlgaDAY1Gg1arJTMzM89z9yKdaYV4sNjYWPz8/DAa/zcMVqeB6C3z0Qf3L7TXuZmaxbL9F1m0O4bYm+kAaDTQOtCDvs38aBVQXv7HX8gysg3M2xHNjPBIkjNNLVZta3gw9vnq+Hs4q5xOiAeziEs/ycnJxMTE5HlswIABVK9enTFjxlC7du2HHkMKFSEeLiwsjKFDh2IwGNBpNczqYEtoQzvo+B00DHmsY0dfS2VaeCS/H7lMZo6pGHK1t6ZHYx/6NPXDt6xDIZyBeJDrKZlM3RzB4j0XyDEq6LQaXmnsw1ttq1HeWVqghXmyiELlXh7WR+W/pFARIn9iY2OJjIzEv3Il9IcnwaFFpieC34NW75qaPwogM8fArK3nmBYeSdbtAqWWtwv9m1WiUz1v7G2kg2dxi7qawsT1p/nz5BXAtAK0qcNtFXk/hNmxiD4qQojio9fr/9cnxXcaOHvBP5Pg7y8hJR7aT873XCu7z13n/d+O5U5v/2RAOd5qW40Gvm6lau4Tc1O1vBOz+zVizzlTh9sjsYlM/vMsi3Zf4J12gbxUXzrcCstjdi0qBSUtKkI8hr0/wh+jAQVqdoaX5jxw9eUbqVlM+OMUKw7EAqb5Tz7sWIMX6nlLgWJmjEaF349e5usNpg63ADW9XHi/Qw1a+EuHW6E+i730U1BSqAjxmE6sgpWDwZAF/m1Nqy/b5O1XoigKvx68xBfrTnIzLRuAXk19GdOuuozgMXMZ2QYW7IxmWnhk7hDx1oHlGde+BtUqSIdboR4pVIQQ+Re5GZb2hpx08G0OvZaBnen3KTIhhQ9WHWP3OdM6PIEVnPnypdo09HNXM7EooBupWUzdHMGi3THkGBW0GujR2Je3nwnAwzl/00MIUZikUBFCFEzMLvi5O2QmgXd9MnqsYMbem8z8O4osgxE7ay1vta1GaMvKWOtkFllLdf5aKhPXn2bDiXgAHGx0DGtVlUFPVsbBRrotiuIjhYoQouAuH4ZFL0HadaK1PnRPG0sCZWgdWJ7POtfGx12GGpcU+6Jv8Pm6Uxy5eAsAL1c7pvduQAPfMuoGE6WGFCpCiAK7lpLJjyvXMyDqLTw1N4mlAhHPLSa4aSPpLFsCKYrC2qNxTNxwmtib6djotIzvUosejX3VjiZKASlUhBD5ZjQqLN9/kQnrT5OYno2PJoHVzl/jnnUZnL2h/xooF6B2TFFEUjJzGLX8MBtPmOZf6fuEHx92rCkLRYoild/Pb/kpFKKUO3slmR6zdzF25TES07Op6eXC96+9iPvrm6FcICRfhnnt4eoZtaOKIuJka8UPvRsy6plqACzcHUOfOXu4lpL5kD2FKHrSoiJEKZWRbeD7LRHM2nqOHKOCg42Okc9UI6R5JazudJZNvQY/dYYrx8GxPPT/HTxqqBtcFKm/Tl7hrWWHScnMwcvVjll9G1JX76Z2LFECyaUfIcR9bT17lQ9XHefCjTQAnqlZgU9eqEVFN/u7N067AT+9APHHwKGsqVipUKuYE4viFJmQwpCF+zl3NRUbKy0TXqxD14aFv9K2KN2kUBFC3CUhOYPxa0/x+5HLgGmkxycv1KJdLc8H75h2AxZ2gbgjYO9u6rPiWafoAwvVJGVk8/bSw2w+nQDAwBaVea999f+1tgnxmKRQEULkUhSFJXsvMmH9KZIzctBqYECLyrz9TDWcbPM5d0b6TVj4Elw+CPZloN9q8KpXtMGFqoxGhSl/nWXqlkgAmlcty7ReDXB3vP8yC0LklxQqQggA0rMMjPn1KGtut6LU1bvy5Yt1qF3R9REOdgsWdYVL+8HO1VSseNcv3MDC7Gw4HsfI5UdIyzJQ0c2e2f0aUsv7EX5+hPgXKVSEEFy8kcaQhQc4FZeElVbDmOeqM7BlZXSPs4JuRpKpWIndC7auxLadSUSKPQEBAf9bnVmUOGfikxmycD8x19Ows9by9cv1eKGet9qxhAWT4clClHLbI67Radp2TsUlUc7JhsWDmjL4qSqPV6SAaQ2gvivBtxlhu67i17QDbdq0wc/Pj7CwsMIJL8xOoKcza4a3pFW18mRkG3lzySEmrD+FwWjR/9cVFkBaVIQoYRRF4cdt5/hq/WmMCtTTu/JDn4Z432tEz2OIjTqDX0B1/v05pdPpiI6OlpaVEsxgVJi08Qwzt0YB8GRAOb7vWR83B+m3IgpGWlSEKIXSsnJ4Y8khvvzDVKR0a6hn2dBmhV6kAERcuMx//zNtMBiIjIws9NcS5kOn1TD2+ep837M+dtZatkVco/P0HZyJT1Y7miihpFARooS4cD2Nl2bsZO3ROKy0GsZ3rsXXL9fFzlpXJK8XEBCAVpv3T4hOA/5lZQXe0qBTPW9WvtoCfRl7Yq6n8eKMHWw4Hqd2LFECSaEiRAnwz9mrdJq2ndPxyZRzsmXJkCfo26xSkS4kqNfrmT17NjqdqRDSaWFWRzv0m4bAzegie11hPmp6u/D76y1p4V+WtCwDwxYdZPLGMxil34ooRNJHRQgLpigKM7eeY9LG2/1RfNyY2acBXq6Ff6nnfmJjY4mMjMTfqwz6TYPg2llw84UB68FV+qqUBjkGI1+tP82c7ecBaFPdgymvBOFiZ61yMmHOZHiyECVcamYO7/5ylHXHTM3tPRr58FmXWthaFc2lnnxJioP57eHGOXCvAiF/gIuXenlEsfrtUCxjfz1GZo6RKuUcmd2vEf4eTmrHEmZKOtMKUYLFXE+l6w87WXcsDmudhs+71OarrnXULVLAVJT0/93UonLjnGmNoJSr6mYSxebF+np+GdYcb1c7zl1Lpcv0Hfx18orasYSFk0JFCAvz95kEOn1v6o9S3tmWJYOfoM8TfkXaH6VAXPWmYsVFb7oMtOglyEhUO5UoJnX0rqx5oyVNKruTkpnDoJ/2M/ufKLVjCQsmhYoQFkJRFKaHRzJg/j6SMnKo7+vG2jda0qiSu9rR7lamkml6fcfyEH8Ufu4BWWlqpxLFpJyTLYsHNaV/Mz8AvvzjNHNv918RoqCkUBHCAqRm5jD854NM2ngGRYGeTXxYOuQJKrjYqR3t/sr5Q5+VYOsKF3bB8n6Qk6V2KlFMrHVaPu1cmxFPBwDw2dqTLNl7QeVUwhJJoSKEmTt/LZUXZ+zgj2PxWOs0fPliHSa8VFf9/ij54VUXei8HK3uI3AS/DQWjQe1Uohi91TaAIU9VAeC9347x26FYlRMJSyOFihBmLPx0Ai9M287ZKyl4ONuydEgzejX1VTtWwfg+AT0WgdYaTqyEdaPAsgcbigLQaDSMe746fZ/wQ1Fg1PIjrD8mE8OJ/JNCRQgzpCgK07ZEMHDBPpIzcmjoV4a1b7SkoV8ZtaM9moC28NJsQAMH5sHmT9VOJIqRRqPh0xdq0a2hHqMCby49xJbTMhpI5I8UKkKYmZTMHF5ddJDJf55FUaB3U1+WDH4CD3Puj5IftV+CTlNM97d/B9unqJlGFDOtVsNXXevSqZ432QaFYYsOsiPymtqxhAWQQkUIM3L+9twTG07EY6PT8tVLdfjixTrYWJWQX9WGIfDMZ6b7f30M++epGkcUL51Ww7fd6/FMzQpk5RgZtGA/+6NvqB1LmLkS8tdPCMt34nIiL/+wk8iEFCq42LJ06BO80sTC+qPkR4sR0HKk6f7at+HEb+rmEcXKWqdlWq/6PFWtPOnZBkLm7eNo7C21YwkzpnqhMmHCBBo3boyzszMeHh506dKFM2fOqB1LiGJ1IOYGr8zezfXULGp5u/D7Gy1p4Guh/VHy4+mPoFEooMDKIXD+H7UTiWJka6VjVp+GNL09KVzfsL2ciktSO5YwU6oXKlu3bmX48OHs3r2bTZs2kZ2dzbPPPktqaqra0YQoFtsjrtFnzl6SM3JoXKkMS4Y8gYezhfdHeRiNBtpPghovgCELlvaG+GNqpxLFyN5GR1hIY+r7upGYnk3fsD1EJqSoHUuYIbNblPDq1at4eHiwdetWnnrqqbuez8zMJDMzM/frpKQkfHx8ZFFCYZE2nojnjZ8PkWUw8lS18szq0xB7GwuYH6WwZGeYptiP2QFOnhD6J5TxUzuVKEaJ6dn0+nE3Jy4n4elix/KhzfAt66B2LFEMLHZRwsRE05og7u73nhZ8woQJuLq65t58fHyKM54QhWblwVheW3yQLIOR52t78mO/UlakAFjbwSs/g0dNSIk3FS2p19VOJYqRq701C0ObEuDhRHxSBr3m7ObyrXS1YwkzYlYtKkajkRdeeIFbt26xffv2e24jLSqiJFi4K5oPV58A4OWGer56qQ5WOrP7f0PxSboMYc9C4kWo2Aj6rwEbR7VTiWKUkJRB91m7iL6eRpVyjiwdWgougZZyFtmiMnz4cI4fP87SpUvvu42trS0uLi55bkJYkhl/R+YWKSHNK/F117qlu0gBcPGGPr+CfRm4tB9WhIAhW+1Uohh5uNixePATVHSz59y1VPrO2cuNVFkbSphRofL666+zdu1awsPD0ev1ascRotApisJX60/z9QbTqLY32vjzcaeaaLUalZOZifKB0Ov2ukARf8Lvb8lU+6VMRTd7fh7clAoutpy5kky/uXtITJeCtbRTvVBRFIXXX3+d3377jS1btlC5cmW1IwlR6IxGhQ9XH2fm1igA3mtfnVHPBqLRSJGSh08T6DYPNFo4vIjYZe8QHh5ObKwsZFda+JV1ZPGgppR1tOH4pSQGzNtLamaO2rGEilQvVIYPH86iRYv4+eefcXZ2Jj4+nvj4eNLTpTOVKBmyDUZGLj/Mot0X0GjgyxfrMOSpqmrHMl+Bz0PHKYQdzMKv17e0adMGPz8/wsLC1E4miom/hzMLQ5viam/NwQu3GLRgPxnZsup2aaV6Z9r7/Y9y3rx5hISEPHT//HbGEUINGdkG3lhyiE0nr2Cl1fBN93p0DqqodiyzFxsbi5+fL0bj//486XQ6oqOj5dJwKXLk4i16z9lDSmYOraqVZ3a/hthalbKRcSWYxXSmVRTlnrf8FClCmLPUzBxCF+xj08kr2FhpmdmnoRQp+RQREZGnSAEwGAxERkaqlEiooZ6PG/MGNMbeWsfWs1d5c8khcgxGtWOJYqZ6oSJESZSYZpppc0fkdRxtdMwf0Ji2NSuoHctiBAQEoNXm/fOk04B/OVuVEgm1NK7kzo/9GmFjpWXjiSuMWnEEg1E6WZcmUqgIUciuJmfyyo+7OXjhFq721iwa1JTmVcupHcui6PV6Zs+ejU5naubXaWFWRzv04W9Amqy2W9q0DCjHD70bYKXVsPrwZd5beeyuFjdRcqneR+VxSR8VYU4u3Uqn75w9nLuWSjknWxYNakJ1T/m5fFSxsbFERkbiX8EZ/fq+kHQJ/FpA39/ASlpXSpt1R+N4Y8lBjIppDqKPO9WUkXMWzGL6qAhRUpy/lkr3mbs4dy2Vim72rBjWTIqUx6TX6wkODkZfoyH0XgG2LqZ1gVYPB6P0VShtOtT1YnK3emg0MH9nNBM3nMHC/68t8kEKFSEKwam4JLrN3MWlW+lUKefIimHNqFxOpoAvVBVqQfefQGsFx1ZA+BdqJxIqeKmBni+61AFg5tYoFu2OUTmRKGpSqAjxmA5euEmPWbu4lpJJTS8Xlg9rhrebvdqxSqaqraHT/5nub5sMBxaom0eooldTX959LhCAz9ae5ECM9FsqyaRQEeIx7Iy8Rp85e0jKyKGBrxtLhjxBOSfpO1Gk6veBp9413V/7NkRuVjePUMWrrarSoa4X2QaFYYsOkpCUoXYkUUSkUBHiEf118goh8/eRlmWgpX+53Jk0RTFo/R7UfQUUAyzvD/HH1E4kiplGo+HrrnUJrODM1eRMXl18kKwc6bdUEkmhIsQjWH34EkMXHSArx8izNSswp38jHG2t1I5Vemg08ML3UOlJyEqGxd0hKU7tVKKYOdpaMatvQ5ztrDgQc5Pxa0+qHUkUASlUhCigVYcu8daywxiMCi/Vr8iM3g2ws5ZpvYudlQ30WAjlAiH5Mix5BbLS1E4lilmlco783ytBACzcHcOK/RfVDSQKnRQqQhTAhuPxjFpxBEUxdeib3K0eVjr5NVKNfRnotQzs3SHuMKwaJsOWS6E21SvwVtsAAN5fdZxjsYkqJxKFSf7CCpFPW89e5Y0lBzEYFbo20PN559potTLZlOrcK8MrP4POBk6ulmHLpdSbbQJoW8ODrBwjwxYd4HpKptqRRCGRQkWIfNhz7jpDF+4n26DQvo4nE7vWkSLFnPg1g05TTfe3TYYjS9XNI4qdVqvh2x5BVC7nyKVb6bwhCxiWGFKoCPEQhy/eInTBfjKyjbQOLM+UHvXlco85CuoJLUea7q95A2J2qZtHFDsXO2tm9W2Ig42OnVHX+XrjGbUjiUIgf22FeIBTcUn0n7uXlMwcmlUpyw99GmJjJb82ZqvNh1CjExiyYFlvuHFe7USimFWr4MzkbvUAmP3POX4/clnlROJxyV9cIe7j3NUU+obtITE9m/q+bvzYv5GM7jF3Wi28OAu8giDtOvzcAzKkY2Vp076OF8NaVQXg3V+OciY+WeVE4nFIoSLEPVy8kUbvOXu4lpJFTS8X5oc0wUnmSbEMNo7Qcyk4e8O1M7BiABhy1E4litnodoG09C9HeraBoQv3k5ierXYk8YikUBHiP64kZdAnbA9xiRlULe/IwtAmuDrIjLMWxcULei4BaweI2gwbx6mdSBQznVbD9z3rU9HNnujraby19BBGo6y0bImkUBHiX66nZNJnzh5irqfh427P4kFPUFbW7rFM3kHw0mzT/b2zYc9sVeOI4lfG0YZZfRtia6Ul/MxVpmyOUDuSeARSqAhxW2J6Nv3m7iUiIQVPFzt+HvQEnq52ascSj6NGJ2j7ien+hjEQ8ZeqcUTxq13RlQkv1QFg6uYINp28onIiUVBSqAgBpGbmMHD+Pk5cTqKsow2LBjXFx91B7ViiMLR4C4J6g2KEXwbA1bNqJxLF7KUGekKaVwJg5LLDnLuaom4gUSBSqIhSLyPbwOCf9nMg5iYudlYsDG2Kv4eT2rFEYdFooOMU8G0GmUmmNYHSb6qdShSz9zvUoEkld5Izcxi68AApmdLB2lJIoSJKtWyDkeGLD7Iz6jqONjrmD2xCTW8XtWOJwmZlA90XgqsP3IiCFQOIjYkmPDyc2NhYtdOJYmCt0zKtd30quNgSkZDCu78cQVGkc60lkEJFlFoGo8Jbyw6z+XQCtlZa5vRvTAPfMmrHEkXFqbxpTSBrB8J+2Yhf5Sq0adMGPz8/wsLC1E4nioGHsx0zejfEWqfhj2PxzNx6Tu1IIh+kUBGlktGoMPbXo6w7Goe1TsPMvg1pVrWs2rFEUfOqS2yzzxmyNgPj7f9NG41Ghg4dKi0rpURDvzJ88kItACZtPM22iKsqJxIPI4WKKHUUReGztSdZcSAWrQamvlKf1oEeascSxSRCU4X/TqdhMBiIjIxUJ5Aodr2a+NKjkQ9GBd5YcoiLN9LUjiQeQAoVUepM2niG+TujTfdfrsfzdbzUDSSKVUBAAFpt3j99Op0Of39/lRKJ4qbRaPi0cy3q6V25lZbN0IUHSM8yqB1L3IcUKqJUmR4eyYy/owAY36U2XRvqVU4kipter2f27NnodKZ1m3QamNWzMnoPd5WTieJkZ63jhz4NKetow8m4JN7/7Zh0rjVTUqiIUmPejvNMur3s+7jnq9P3CT+VEwm1hIaGEh0dTfjvS4ke60to1QRY/RrIB1Wp4u1mz7ReDdBpNaw8dIkFt1tahXmRQkWUCsv3XeTT308C8ObTAQy9vbKqKL30ej3BHXugH7oEtFZw4jfYNlntWKKYNatalnHPVwfg83Wn2Hv+hsqJxH+ZRaEyffp0KlWqhJ2dHU2bNmXv3r1qRxIlyJojlxmz8igAg1pW5u22ASonEmbFrzl0+MZ0f8vncGqtunlEsQttWZnOQd7kGBVeW3yA+MQMtSOJf1G9UFm2bBkjR47k448/5uDBg9SrV4927dqRkJCgdjRRAmw6eYWRyw6jKNCziS/vd6iBRqNRO5YwNw1DoMkQ0/2VQ+DKCVXjiOKl0Wj46qW6VPd05lpKFq8uPkBmjnSuNReqFyrffvstgwcPZsCAAdSsWZOZM2fi4ODA3Llz1Y4mLNz2iGsMX3yQHKNClyBvPu9SW4oUcX/tvoTKT0F2qmma/dTraicSxcjeRsfsvo1wtbfm0IVbjF97Uu1I4jZVC5WsrCwOHDhA27Ztcx/TarW0bduWXbt23XOfzMxMkpKS8tyE+K/jlxIZunA/WQYjz9aswORu9dBppUgRD6Czhm4LoEwluHUBVvQHQ7baqUQx8i3rwP+9EoRGA4t2XyD8tLTsmwNVC5Vr165hMBioUKFCnscrVKhAfHz8PfeZMGECrq6uuTcfH5/iiCosyMUbaYTM20dqloFmVcryfa/6WOlUbzwUlsDBHXouBRsniN4Gf36odiJRzIIDPRjYojIAY349ys3ULJUTCYv76z1u3DgSExNzbxcvXlQ7kjAjN1Kz6D93L9dSMqnu6cysfg2xtdKpHUtYEo8a8OJM0/09P8DhJermEcVudLtA/D2cSEjO5MPVx9WOU+qpWqiUK1cOnU7HlStX8jx+5coVPD0977mPra0tLi4ueW5CAKRnGRi0YB/nrqXi7WrH/AFNcLGzVjuWsEQ1OsFT75ru/z4CLh1UN48oVnbWOr7tbrpcvPZoHGuOXFY7UqmmaqFiY2NDw4YN2bx5c+5jRqORzZs306xZMxWTCUuTYzDyxpJDHLxwCxc7KxYMbIKnq53asYQlCx4H1Z4DQyYs6wMpsnhdaVJX78YbbUzLKny46jhXkmTIslpUv/QzcuRIfvzxRxYsWMCpU6d49dVXSU1NZcCAAWpHExZCURQ+WnOCv05dwcZKy5z+jQmo4Kx2LGHptFp4aTaU9YekS9K5thQa3tqfunpXEtOzefeXozLFvkpUL1R69OjB5MmT+eijjwgKCuLw4cNs2LDhrg62QtzP9PBIft5zAY0G/q9HEE0qy5otopDYucIrP4ONM8TsgI3vqZ1IFCNrnZZvu9fDxkrL1rNX+XnvBbUjlUoaxcJLxKSkJFxdXUlMTJT+KqXQiv0XGf2LadbZTzrVJOR2b30hCtXpdbC0l+l+5xlQv7e6eUSxCtt+nvFrT+Jgo2P9iCfxK+uodqQSIb+f36q3qAjxqP4+k8DYlccAGNqqihQpouhU7wCtxprur30bLh1QN48oVgOaV+KJKu6kZRkYtfwIBqNF///e4kihIizSsdhEXlt8EMPtWWfHtKuudiRR0rUaA4HtTZ1rl/aBFJkMrLTQajVMerkeTrZW7I+5yY/bzqkdqVSRQkVYnAvX0xgwfy9pWQZa+Jfl65froZVZZ0VR02rhxVlQrhokX4bl/SBHJgMrLXzcHfioY00Avv3zLKfjZVb04iKFirAo11My6T9vL9dSsqjh5cLMPg2xsZIfY1FM7FxMnWttXeDCLtg4Tu1Eohh1a6SnbQ0PsgxG3l52hKwco9qRSgX5Cy8sRnqWgdAF+zl/LZWKbvbMH9AYZ5nQTRS3cgGmYcsA++bAwYXq5hHFRqPRMOGlurg72nAqLompmyPUjlQqSKEiLIJpQreDHL54C1d7axYMbEwFF5nQTagk8HkIvj1Ued1IiN2vbh5RbMo72/JFl9oAzPg7koMXbqqcqOSTQkWYPUVR+HD1cf46lYCtlZaw/o3w95AJ3YTKnhoN1TuCIcs0c23ylYfvI0qE5+t48WL9ihgVGLX8CGlZOWpHKtGkUBFm7/stkSzZe9E0odsr9WlUSSZ0E2ZAqzUtXlguEJLjpHNtKfPJC7XwdLHj/LVUJq4/rXacEk0KFWHWlu+/yLebzgLw6Qu1eK72vRerFEIVts63O9e6wsXdsGGM2olEMXG1t2ZSt7oALNgVw7YIWQuqqEihIsxW+JkExt2e0O3V4Kr0a1ZJ3UBC3Es5f+j6I6CB/XOJ3TCV8PBwYmNj1U4mitiTAeXp18wPgNErjpKYLmtBFQUpVIRZOnLxFq8tMk3o9lL9irzbLlDtSELcX7V20Po9wg5m4dd+BG3atMHPz4+wsDC1k4kiNvb56lQq60B8UgafrjmhdpwSSQoVYXZirqcycP4+0rMNPBlQjq+61kWjkQndhHmLrfwKQ9ZmcGd2daPRyNChQ6VlpYRzsLHim+5BaDWw8tAl1h+LUztSiSOFijAr11My6T93L9dTs6jl7cIPMqGbsBARUVH8dwkYg8FAZGSkOoFEsWnoV4ZhraoC8N5vx7ianKlyopJFPgGE2UjLymHggv1EX09DX8aeeQMa42RrpXYsIfIlICAArTbvn1SdVoO/v79KiURxeqttNWp4uXAzLZtxK4+iKLJwYWGRQkWYhRyDkdd/PsSRi7dwc7BmwcAmeDjLhG7Ccuj1embPno1OpwNAp4FZHWzRJ8lKy6WBjZWWb7vXw1qn4a9TCaw4IJf8CosUKkJ1iqLwwarjbDn9vwndqpZ3UjuWEAUWGhpKdHQ04eHhRP/0OqENbGDVa3D1jNrRRDGo4eXCyGdMHf8/+/0ksTfTVE5UMkihIlQ3dXMkS/ddRKuBqT3r09BPJnQTlkuv1xMcHIy+53dQ6UnISoGlvSFDVtstDYY8VYWGfmVIyczhnRVHMP6345IoMClUhKpW7L/Id3+ZJnT7rHNt2tWSCd1ECaGzgpfngbM3XI+AVa+C9Fso8XRaDd90q4e9tY7d524wb2e02pEsnhQqQjU7Iq/lTuj2WnBV+jzhp3IiIQqZU3nosRB0NnB6LWz/Tu1EohhUKufI+x1qAPD1htNEJiSrnMiySaEiVBFxJZlhiw6QY1ToVM+bd56VCd1ECaVvBM9/bbq/ZTxEbVE3jygWvZv68lS18mTmGBm5/AjZBqPakSyWFCqi2F1NzmTA/H0kZ+TQyK8Mk16ui1YrE7qJEqxhCNTvC4oRfgmFmzFqJxJFTKPR8HXXurjYWXE0NpHp4TKfzqOSQkUUq/QsA4N+2k/szXQqlXVgdr9G2Fnr1I4lRNHSaKD9ZPCuD+k3YHlfyE5XO5UoYp6udozvUhuAaVsiORp7S91AFkoKFVFsjEaFt5cdzp0rZd6AJrg72qgdS4jiYW0H3ReCQ1mIOwJrR0rn2lLghXredKjjRY5RYeTyI2RkG9SOZHGkUBHFZsL6U2w4EY+NTsvsvo2oXM5R7UhCFC83H3h5Lmi0cORn2C+LFpZ0Go2G8V1qU97ZlsiEFCZtlDl1CkoKFVEsFu6O4cdt5wGY1K0uTSrLXCmilKoSDG0/Md1fPxYu7lUzjSgG7o42TOxaB4C5O86z9/wNlRNZFilURJELP5PAx6uPAzDqmWp0DqqociIhVNb8TajZGYzZsLwfJF9RO5EoYm2qV6B7Iz2KAu//doysHBkFlF9SqIgidfJyEq8vPohRgZcb6nm9jSzQJgQaDXSeDuUCITkOVoSAIVvtVKKIvde+BmUdbYhISGHO9nNqx7EYUqiIIhOfmMHA+ftIzTLQrEpZvnyxDhqNDEMWAgBbZ3hlMdg4w4WdsOkjtROJIubmYMN77U0TwU3dHMHFG7IWUH5IoSKKRGpmDgPn7yM+KYOq5R2Z2achNlby4yZEHuUC4MWZpvu7Z8DRFermEUXupQYVaVrZnYxsI5+sOYEiI78eSj45RKHLMRh5Y8khTsYlUdbRhvkDmuDqYK12LCHMU42O8OQo0/01b0D8cXXziCKl0Wj44sXaWOs0bD6dwJ8npX/Sw6hWqERHRxMaGkrlypWxt7enatWqfPzxx2RlZakVSRQCRVH4bO1JtpxOwNZKy5z+jfBxd1A7lhDmrfX7ULUN5KTDst6QflPtRKII+Xs4M+SpKgB8suYEqZk5Kicyb6oVKqdPn8ZoNDJr1ixOnDjBd999x8yZM3nvvffUiiQKwdwd0fy0KwaNBqb0CKK+bxm1Iwlh/rQ66BoGbr5wMxpWDgGjjAopyV5vHYC+jD1xiRlMub2CvLg3jWJGF8gmTZrEDz/8wLlz+e8NnZSUhKurK4mJibi4uBRhOvEwG0/EM2zRARQF3mtfnSFPVVU7khCWJe4IhD0LORnQaiy0Hqd2IlGEwk8nMGD+PnRaDWvfaEkNr9L1GZbfz2+z6qOSmJiIu/uDJwLLzMwkKSkpz02o72jsLUYsPYSiQK+mvgx+sorakYSwPF71oOMU0/2tX8GZDarGEUWrdXUPnqvlicGo8P5vxzAazabdwKyYTaESGRnJ999/z9ChQx+43YQJE3B1dc29+fj4FFNCcT+xN9MYOH8/GdlGWlUrz2cv1JJhyEI8qqCe0Hiw6f7KIXA9St08okh9/EJNHG10HLxwi+X7L6odxywVeqEyduxYNBrNA2+nT5/Os8+lS5d47rnn6NatG4MHD37g8ceNG0diYmLu7eJFeWPVlJSRzcD5+7iWkkl1T2em9aqPlc5s6l8hLFO7L8GnKWQmwrI+kJWqdiJRRLxc7Xn7mWoATFh/muspmSonMj+F3kfl6tWrXL9+/YHbVKlSBRsb06q5ly9fJjg4mCeeeIL58+ej1RbsQ076qKgn22BkwLx9bI+8hoezLauGt8DbzV7tWEKUDElxMLsVpFyB2l1NnW2lpbJEyjEY6TRtB6fikujaQM833eupHalY5PfzW9XOtJcuXaJ169Y0bNiQRYsWodPpCnwMKVTUoSgKY389xrL9F3Gw0bF8aDNqV3RVO5YQJUvMTljQCYw50G4CNHtN7USiiBy8cJOuP+xEUWDpkCd4okpZtSMVObPvTHvp0iWCg4Px9fVl8uTJXL16lfj4eOLj49WKJArgh61RLNt/Ea0Gvu9ZX4oUIYqCX3PTZSCAPz8gdtdKwsPDiY2NVTeXKHQNfMvQs4kvAB+sOi6LFv6LaoXKpk2biIyMZPPmzej1ery8vHJvwrz9fuQyX284A8BHHWvydI0KKicSogRrMgTq9iDsQDp+LbrSpk0b/Pz8CAsLUzuZKGRj2lWnrKMNkbJoYR5mNY/Ko5BLP8XrQMwNev64h6wcIwNaVOLjTrXUjiREiRd7LgI//2r8e/SqTqcjOjoavV6vXjBR6FYejGXk8iPYWWvZ9HarEj2zt9lf+hGWJ+Z6KoN/OkBWjpG2NSrwQYeaakcSolSIiInlv1NsGAwGIiMj1QkkisyL9SvyRBXTooUfy6KFgBQqIp9upmYxYN4+bqRmUaeiK1N7BqHTyggEIYpDQEDAXSMidVot/v7+KiUSRUWj0fB5F9OihVtOJ7DxhCxaKIWKeKjMHANDFx3g3LVUvF3tCOvfCAcbK7VjCVFq6PV6Zs+enTsyUqeBWZ0c0GsSVE4mioK/hzNDby9B8unvsmihFCrige4MQ957/gZOtlbMHdAYDxc7tWMJUeqEhoYSHR1N+ObNRP9fJ0KDtLC8H6Q+eN4qYZleb+OPj7ssWghSqIiH+L/NEfx26BI6rYYZvRtQ3VM6LAuhFr1eT3CbNugHLwT3qpB4EX4ZAIbS/T/uksjOWsdnL9QGTKvSn7xcete1k0JF3Ndvh2KZ8lcEAJ93qc1T1cqrnEgIAYCdK/RYBNYOcH4rbBmvdiJRBFpX96B9HdOihR+sKr2LFkqhIu5pz7nrvPvLUQCGtqqSOxGREMJMVKgJnaeZ7u+YAidXqxpHFI2POtbKXbRwWSldtFAKFXGXqKspDFl4gGyDwvO1PRnTrrrakYQQ91K7KzR73XR/1Wtw9Yy6eUSh83S1Y+SzgQB8tf4010rhooVSqIg8rqdkMmDePhLTswnyceO7HkFoZRiyEOar7adQ6UnISoGlvSGj9PZlKKn6N/OjppcLienZTPjjtNpxip0UKiJXRraBIQsPcOFGGvoy9vzYrxF21gVfKFIIUYx0VvDyPHCpCNcjYNWrIJOElShWOi1fvFgbjQZ+PRjLrqjSNdJLChUBgNGo8M6KIxyIuYmznRXzBzSmvLOt2rGEEPnhVB66/wQ6Gzi9FrZ/p3YiUcjq+5ah1+2+gh+uLl2LFkqhIgD4dtNZ1h6Nw0qrYVafhvh7OKsdSQhREPpG0H6S6f6W8RC1Rd08otC926465ZxMixb+uK30LFoohYpg+f6LTAs3rRny5Ut1aO5fTuVEQohH0jAE6vcFxQi/hMLNGLUTiULk6mDN+x1qADB1cwQXb6SpnKh4SKFSyu2MvMZ7K48B8Hprf7o38lE5kRDisbSfDN71If0GLO8L2elqJxKFqEtQRZpVKUtmjpGPVh8vFYsWSqFSikUmJDN00QFyjAqd6nkz8plqakcSQjwuazvovhAcykLcEVg3SjrXliAajYbxtxctDD9zlY0n4tWOVOSkUCmlriZnEjJvH8kZOTTyK8Okl+vKMGQhSgo3H9NIII0WDi+G/XPVTiQKkb+HE8NamRYt/GTNSVJK+KKFUqiUQulZBgb9tJ/Ym+n4lXVgtgxDFqLkqdIK2n5iur9+DFzcq2ocUbiGt/bH192B+KQMpmwq2YsWSqFSyhiNCiOXH+bIxVu42lszL6Qx7o42ascSQhSF5m9Czc5gzDattJx8Re1EopDYWev4rHMtAObtLNmLFkqhUspM3Hia9cfjsdZpmN23IVXKO6kdSQhRVDQa6DwdyleH5DhYEQKGbLVTiUISHOhBhzpeGIwK75fgRQulUClFft5zgVlbTWPvv365Lk2rlFU5kRCiyNk6m1ZatnGGCzth00dqJxKF6MOONXG00XHowi2W7iuZixZKoVJK/HP2Kh+uPg7AW20DeLG+XuVEQohiUy4AXpxpur97BhxdoW4eUWg8Xe0YdXvRwokbTnMrLUvlRIVPCpVS4Ex8Mq8tPojBqPBi/YqMeDpA7UhCiOJWoyM8+Y7p/po3IP64unlEoenXzI/qns4kpmcz5a8IteMUOilUSriEpAwGzNtLSmYOTSq781XXOmg0MgxZiFKp9XtQ9WnISYdlfSD9ptqJRCGw0mn5oENNABbtjiEyIUXlRIVLCpUSLC0rh9AF+7mcmEGVco7M7tsQWysZhixEqaXVQdc54OYLN8/DyiFgLD2L25VkLQPK0baGBzlGhS//OKV2nEIlhUoJZTAqjFh6mGOXEnF3tGHegMa4OcgwZCFKPQd3U+daKzuI+BO2TlQ7kSgk77WvgZVWw5bTCfxz9qracQqNFCol1Jd/nGLTySvYWGmZ3bchfmUd1Y4khDAXXvWg4xTT/a1fEbt1IeHh4cTGxqoaSzyeKuWd6NesEgCfrztJjqFktJZJoVIC/bQrmrDt5wGY3K0ejSq5q5xICGF2gnpC48GEHczCr3U/2rRpg5+fH2FhYWonE49hxNMBuDlYc/ZKCktKyHBlKVRKmPDTCXyy5gQAo9sF8kI9b5UTCSHMVWyt1xiyNoM784QZjUaGDh0qLSsWzNXBmrfbmhaY/W7TWRLTLX+CPylUSpATlxN5/eeDGBXo3kjPa8FV1Y4khDBjEedj+O9kpgaDgcjISHUCiULRq6kv/h5O3EjNYtoWyx+uLIVKCRF7M40B8/aRmmWgedWyfPGiDEMWQjxYQEAAWm3ejwGdVoO/v79KiURhsNZpeb9DDQDm74zm/LVUlRM9HrMoVDIzMwkKCkKj0XD48GG141icxLRsQubtIyE5k8AKzvzQpyHWOrN4a4UQZkyv1zN79mx0OtO0BToNzOpgiz7liMrJxONqHehBq2rlyTYoTLDw4cpm8Wn27rvv4u0tfSkeRUa2gcEL9xOZkIKnix3zBjTG1d5a7VhCCAsRGhpKdHQ04eHhRM8fRmgDG9P8Kgmn1Y4mHtMHHWqg02r48+QVdkZdUzvOI1O9UFm/fj1//vknkydPVjuKxTEaFUatOMLe8zdwtrVi/sDGeLvZqx1LCGFh9Ho9wcHB6HtPhUpPQlYKLO0J6bfUjiYeQ0AFZ3o39QVg/NpTGCx0dWVVC5UrV64wePBgFi5ciIODQ772yczMJCkpKc+ttJqw/hTrjsZhrdMwq29Dqnu6qB1JCGHJdNbQbT64+sKNc/BrKBgNaqcSj+GtttVwsbPiVFwSK/Zb5nBl1QoVRVEICQlh2LBhNGrUKN/7TZgwAVdX19ybj49PEaY0X3O3n+fHbaa5Uia9XI/m/uVUTiSEKBEcy8Eri8DKHiL/gi3j1U4kHoO7ow1v3l6IdvKfZ0jOsLzhyoVeqIwdOxaNRvPA2+nTp/n+++9JTk5m3LhxBTr+uHHjSExMzL1dvGiZFeLjWH8sjvHrTgLw7nOBdKlfUeVEQogSxasedJ5mur/9Ozj+q7p5xGPp16wSlcs5ci0lixl/R6kdp8A0iqIU6kWrq1evcv369QduU6VKFbp3787vv/+eZwitwWBAp9PRu3dvFixYkK/XS0pKwtXVlcTERFxcSv6lj/3RN+g9Zw+ZOUb6POHL+M61ZRiyEKJobPoIdvyfqXVl0CbwrKN2IvGI/jp5hUE/7cdGp2XzqFb4uOevu0VRyu/nd6EXKvl14cKFPP1LLl++TLt27fjll19o2rQper0+X8cpTYVK1NUUuv6wk1tp2bStUYFZfRui00qRIoQoIkYDLO4GUZtN/VaG/A2OZdVOJR6Boij0CdvDjsjrdKjjxfTeDdSOlO/Pb9X6qPj6+lK7du3cW7Vqpil/q1atmu8ipTRJSM6g/9y93ErLJsjHje971pciRQhRtLQ6eDkMylSGxAuwoj8YctROJR6BRqPhgw410Wpg3bE49p6/oXakfFN9eLJ4uNTMHELn7yf2ZjqVyjoQ1r8R9jY6tWMJIUoD+zLQcwnYOEH0NvjzA7UTiUdUw8uFHo3vDFc+idFChiubTaFSqVIlFEUhKChI7ShmJcdgZPjPBzl2KRF3RxvmD2hCWSdbtWMJIUoTjxrw4kzT/T0/wOGf1c0jHtmoZ6vhZGvFsUuJrDx0Se04+WI2hYq4m6IofLDqOH+fuYqdtZaw/o2oVM5R7VhCiNKoRidoNcZ0//e3IPaAqnHEoynnZMsbbUxrOX294TSpmeZ/KU8KFTP2/ZZIlu67iFYD3/dsQH3fMmpHEkKUZq3GQmB7MGTCsj6QfEXtROIRhLSohK+7AwnJmczcav7DlaVQMVMr9l/k201nAfi0c22eqVlB5URCiFJPq4UXZ0G5QEi+DMt6Q3aG2qlEAdla6XivfXUAZv9zjku30lVO9GBSqJihrWevMm7lMQBeDa5K3yf8VE4khBC32bmYOtfauUHsPvh9BKgzy4V4DO1qedK0sjuZOUYmrjfvBSilUDEzxy8l8tqiA+QYFboEeTP62UC1IwkhRF5lq0L3BaDRwdGlpknhhEXRaDR82LEmGg2sOXKZAzE31Y50X1KomJHYm2kMmL+P1CwDzauW5euX66GVuVKEEOaoSjA8P9F0/69P4MwGNdOIR1C7oivdGprmLTPn4cpSqJiJxLRsQubt42pyJtU9nZnZtyE2VvL2CCHMWONB0GggoJhWWr5yUu1EooDeeTYQBxsdhy/eYs2Ry2rHuSf5JDQDGdkGBi/cT2RCCp4udswb0BgXO2u1YwkhxINpNPD811DpSchKgSWvQOqD13oT5sXDxY7hrU3DlSduOE16lkHlRHeTQkVlRqPCqBVH2Hv+Bs62Vswf2BgvV3u1YwkhRP7orKH7T1CmEtyKgeX9ICdL7VSiAEJbVqaimz1xiRnM/uec2nHuIoWKyiasP8W6o3FY6zTM6tuQ6p4le2FFIUQJ5OAOPZeCjTPEbIc/3pGRQBbEzlrH2OdNw5Vnbo0iPtG8hpxLoaKiudvP8+O28wBM7laP5v7lVE4khBCPyKOGaQFDNHBwAeydrXYiUQAd63rR0K8M6dkGvt5oXsOVpVBRyfpjcYxfZ+p4Nua56nQOqqhyIiGEeEzV2sEzn5nubxgHUVvUzSPyTaPR8FHHmgCsPHiJIxdvqRvoX6RQUcH+6BuMWHYYRYG+T/gxrFUVtSMJIUThaP4G1OsFigFWhBB7dBvh4eHExsaqnUw8RD0fN16qb/pP8/i1J1HM5PKdFCrF7Ex8MqEL9pOVY+SZmhX45IVaaDQyV4oQooTQaKDTFNA3IWznVfyCnqJNmzb4+fkRFhamdjrxEKOfC8TOWsv+mJusOxandhxACpVideF6Gn3D9pCYnk19XzemvlIfnUzoJoQoaaxsiW35NUPWZnBnDjGj0cjQoUOlZcXMebnaM6xVVQAm/HGajGz1hytLoVJMEpIy6BO2h4TbE7rND2mCvY1O7VhCCFEkIuJu8d+JTg0GA5GRkeoEEvk29KmqeLnacelWOmHbz6sdRwqV4nArLYu+YXu5cCMNX3cHfhrYBFcHmdBNCFFyBQQEoNXm/YjRabX4+/urlEjkl72NjnefM60zNyM8koRkdYcrS6FSxNKychgwfx9nriTj4WzLotCmeLjYqR1LCCGKlF6vZ/bs2eh0ppZjnQZmdbRFn3pc5WQiPzrXq0g9HzdSswx8s/GsqlmkUClCmTkGhi48wKELt3C1t2ZhaFN8yzqoHUsIIYpFaGgo0dHRhG/ZQvScEELrW8MvAyHuqNrRxENotf8brrz8wEWOX0pUL4tqr1zCGYwKby87zLaIazjY6Jg3oDGBns5qxxJCiGKl1+sJbt0aff/ZULkVZKfCzz0gyTxGlIj7a+hXhk71vFEUmLcjWrUcUqgUAUVReP+3Y/xxLB4bnZbZfRvRwLeM2rGEEEI9d9YEKlcNki/Dkh6Qlap2KvEQY54L5MOONZnwUh3VMkihUgS+2nCapfsuotXA1J5BtAyQqfGFEAJ7N+i1HBzKQtwR+HUwGNUf/iruT1/GgdCWlbGxUq9ckEKlkP3wdxSztppWn/zqpbo8V9tL5URCCGFG3CvDK0tAZwtn1sFfH6udSJg5KVQK0c97LjBxg2kxp/fb16B7Yx+VEwkhhBnybQpdZpju7/we9s9TN48wa1KoFJLfj1zm/VXHABjeuiqDn5L1e4QQ4r7qvAzB75nurxsFUeHq5hFmSwqVQvD3mQRGLjctMti7qS/vPBuodiQhhDB/rd6Fuj1MCxgu7w8Jp9VOJMyQFCqP6UDMDYYtOkC2QaFTPW8+61xbFhkUQoj80Gjghe/BtxlkJsLP3SAlQe1UwsxIofIYTsUlMWDePjKyjQQHluebbvVkkUEhhCgIK1vosRjKVIZbF+Dn7jJsWeQhhcojir6WSt+wvSRl5NDIrww/9G6o6vAtIYSwWI5loc+vYO8Olw/BigFgyFE7lTAT8sn6COITTSshX0vJpIaXC2EhjWUlZCGEeBxlq0KvZWBlBxEb4Y9RoCgP30+UeKoXKuvWraNp06bY29tTpkwZunTponakB7qZmkXfsD3E3kynUtnbKyHby0rIQgjx2HyaQNc5gAYOzIdt36idSJgBVQuVX3/9lb59+zJgwACOHDnCjh076NWrl5qRHig1M4eQ+fuISEjB08WOhaFNKe9sq3YsIYQoOWp0gue/Nt3fMh6OLFU3j1CdlVovnJOTw4gRI5g0aRKhoaG5j9esWVOtSA+UmWNgyML9HLl4izIO1iwMbYKPu6yELIQQha7pEEi8YJoMbvVwcPaEKsFqpxIqUa1F5eDBg1y6dAmtVkv9+vXx8vLi+eef5/jx4w/cLzMzk6SkpDy3opZjMDJiyWF2RF7H0UbH/AFNCKggKyELIUSRafsZ1HoJjDmwrC/EP/izQZRcqhUq586Z1sP55JNP+OCDD1i7di1lypQhODiYGzdu3He/CRMm4Orqmnvz8SnaaeoVRWHcymNsOBGPjZWWH/s3op6PW5G+phBClHpaLbw4E/xaQGYSLO4GiZfUTiVUUOiFytixY9FoNA+8nT59GqPRCMD7779P165dadiwIfPmzUOj0bBixYr7Hn/cuHEkJibm3i5evFjYp5BLURS+WHeKFQdi0Wk1TOtZn+ZVZSVkIYQoFla28MpiKBcIyZdh8cuQkah2KlHMCr2PyqhRowgJCXngNlWqVCEuLg7I2yfF1taWKlWqcOHChfvua2tri61t8XRgnfF3FHO2nwdgYte6PFvLs1heVwghxG32ZaDPLzCnLSSchGV9oPcvpiJGlAqFXqiUL1+e8uXLP3S7hg0bYmtry5kzZ2jZsiUA2dnZREdH4+fnV9ixCmzh7hgmbTwDwEcda/JyQ73KiYQQopRy84XeK2Beezj/D6wcAi/PBa3MX1UaqNZHxcXFhWHDhvHxxx/z559/cubMGV599VUAunXrplasXFeTMgB48+kABrasrHIaIYQo5bzqQY9FoLWGk6uIXfgq4Vu2EBsbq3YyUcQ0iqLe1H/Z2dmMGzeOhQsXkp6eTtOmTZkyZQq1atXK9zGSkpJwdXUlMTERFxeXQs23M/IazaqWlUUGhRDCXBxfSdh7fRiyNh2jAlqtltmzZ+eZ5kJYhvx+fqtaqBSGoixUhBBCmJfY2Fj8/HwxGv/30aXT6YiOjkavl0v0liS/n9+qT6EvhBBC5FdERESeIgXAYDAQGRmpUiJR1KRQEUIIYTECAgLQavN+dOk04G99VaVEoqhJoSKEEMJi6PV6Zs+ejU5nGvGj02qY1dEO/da34PIhdcOJIiGFihBCCIsSGhpKdHQ04eHhREdFENq1LWSlwKKX4ZpcAipppFARQghhcfR6PcHBwegrVYUei03Dl9OuwcIXISlO7XiiEEmhIoQQwrLZuUDvX8G9imnV5YUvQup1tVOJQiKFihBCCMvnVB76/gbOXnD1FCx6SdYFKiGkUBFCCFEylKkE/VaDQ1mIOww/94CsVLVTicckhYoQQoiSo3ygqWXF1hUu7IKlvSEnU+1U4jFIoSKEEKJk8apnWnHZ2hHOhcMvA8GQrXYq8YikUBFCCFHy+DSBnj+DzhZOr4VVr4HRqHYq8QikUBFCCFEyVQmG7gtAawXHlsO6kWDZy9uVSlKoCCGEKLkCn4cXZwEaODAP/vxAihULI4WKEEKIkq3Oy/DCVNP9XdPg7wnq5hEFIoWKEEKIkq9BP3juK9P9rRNh69fq5hH5JoWKEEKI0uGJV6Htp6b74V/AP5PVzSPyxUrtAMXFYDCQnS3D00TJZG1tnbuarBDiAVq+BYoRNn8KW8aDRgtPjlQ7lXiAEl+oKIpCfHw8t27dUjuKEEXKzc0NT09PNBqN2lGEMG9PjgTFAFs+NxUsWh20GKF2KnEfJb5QuVOkeHh44ODgIH/ERYmjKAppaWkkJCQA4OXlpXIiISzAU6NNo3/Cv4BNH4FGB81fVzuVuIcSXagYDIbcIqVs2bJqxxGiyNjb2wOQkJCAh4eHXAYSIj9avQtGA2z9Cv5833QZqNlraqcS/1GiC5U7fVIcHBxUTiJE0bvzc56dnS2FihD5FTzW1Gfln69h4zjQaInVdyQiIoKAgAD0er3aCUu9UjHqRy73iNJAfs6FeAQaDbR+D54cBUDYl2/j5+dLmzZt8PPzIywsTOWAolQUKkIIIcR9aTTQ5kNiA0MZsjYDo9E0c63RaGTo0KHExsaqHLB0k0JFCCGE0GiIqNAR439m1zcYDERGRqqTSQBSqJgtRVEYMmQI7u7uaDQaDh8+zPXr1/Hw8CA6Ojpfx8jKyqJSpUrs37+/aMMKIUQJEFCtGlpt3o9FnVaDf9WqKiUSIIWK2dqwYQPz589n7dq1xMXFUbt2bb744gs6d+5MpUqV8nUMGxsb3nnnHcaMGVO0YYUQogTQ6/XMnj07tzO6TgOzOtiiPz5NFjJUUYke9fNfiqKQnm1Q5bXtrXUF6uwYFRWFl5cXzZs3ByAtLY2wsDA2btxYoNft3bs3o0aN4sSJE9SqVatA+wohRGkTGhpKu3btiIyMxD9lL/r9X8CemZCTCR2+Ba38/764lapCJT3bQM2PCvZBX1hOftYOB5v8fbtDQkJYsGABYBrJ4efnx+TJk7G1teWJJ57I3e6zzz5j5syZHDt2LHeemA4dOpCWlsbmzZvRarWUKVOGFi1asHTpUsaPH1/4JyaEECWMXq+/PSw5GCp6w+rX4cA8U7HSeZppJltRbKQ0NEP/93//x2effYZerycuLo59+/axbds2GjZsmGe7999/n0qVKjFo0CAApk+fzs6dO1mwYEGe66xNmjRh27ZtxXoOQghRItTvA13nmGauPfIz/DLQVLCIYlOqWlTsrXWc/Kydaq+dX66urjg7O6PT6fD09AQgJiYGb2/vPNvpdDoWLVpEUFAQY8eOZerUqcyZMwdfX98823l7exMTE/P4JyGEEKVRnZdBZ2MqUk6ugoxE6LEIbJ3UTlYqqNqicvbsWTp37ky5cuVwcXGhZcuWhIeHF9nraTQaHGysVLk97mRc6enp2NnZ3fV4lSpVmDx5MhMnTuSFF16gV69ed21jb29PWlraY72+EEKUajVfgN7LwdoRzoXDT50h7YbaqUoFVQuVjh07kpOTw5YtWzhw4AD16tWjY8eOxMfHqxnLLJUrV46bN2/e87l//vkHnU5HdHQ0OTk5dz1/48YNypcvX9QRhRCiZKvaBvqvAfsycGk/zHseki6rnarEU61QuXbtGhEREYwdO5a6desSEBDAV199RVpaGsePH1crltmqX78+J0+evOvxZcuWsXLlSv7++28uXLhwzw6zx48fp379+sURUwghSjZ9IxiwAZy94eppCGsH12RCuKKkWqFStmxZAgMD+emnn0hNTSUnJ4dZs2bh4eFxV6fRf8vMzCQpKSnPrTRo164dJ06cyNOqEhsby6uvvsrEiRNp2bIl8+bN48svv2T37t159t22bRvPPvtscUcWQoiSyaM6hG4E96qQeAHmtoPLh9VOVWKpVqhoNBr++usvDh06hLOzM3Z2dnz77bds2LCBMmXK3He/CRMm4Orqmnvz8fEpxtTqqVOnDg0aNGD58uWAaU6YkJAQmjRpwuuvvw6YiplXX32VPn36kJKSAsCuXbtITEzk5ZdfVi27EEKUOG6+MHAjeNaFtGswvyOc26p2qhJJoyiFO93e2LFjmThx4gO3OXXqFIGBgXTp0oXs7Gzef/997O3tmTNnDmvWrGHfvn14eXndc9/MzEwyM/83NCwpKQkfHx8SExNxcXHJs21GRgbnz5+ncuXK9+yIamnWrVvH6NGjOX78+F3TPN9Pjx49qFevHu+9914RpxNqK2k/70JYhIwkWNITYraD1ho6T4d6PdROZRGSkpJwdXW95+f3vxX68ORRo0YREhLywG2qVKnCli1bWLt2LTdv3swNOGPGDDZt2sSCBQsYO3bsPfe1tbXF1ta2sGNbhA4dOhAREcGlS5fy1ZKUlZVFnTp1ePvtt4shnRBClEJ2LtDnV1g1DE78Br8NgaRYaDnStCqzeGyFXqiUL18+XyNM7gyX/W/LgFarxWg0FnasEuOtt97K97Y2NjZ88MEHRRdGCCEEWNtB17ngUhF2TYPNn8Gti9B+MuhK1XRlRUK1PirNmjWjTJky9O/fnyNHjnD27FlGjx7N+fPn6dChg1qxhBBCiILTaqHdF/D814DGNOX+0l6QmaJ2MounWqFSrlw5NmzYQEpKCm3atKFRo0Zs376d1atXU69ePbViCSGEEI+u6VDTrLVWdhCxEeZ3gJQEtVNZNFXbpBo1alTg1YCFEEIIs1ajI/RfC0t6QNxhmPM09FoOHjXUTmaRZFFCIYQQorD5NIbQTeBeBW5dgLBnid32M+Hh4cTGxqqdzqJIoSKEEEIUhbJVYdBm8GtJ2K5r+LXqTZs2bfDz8yMsLEztdBZDChUhhBCiqDi4E9v6e4aszcR4e9Yyo9HI0KFDpWUln6RQsRDBwcF5hianpaXRtWtXXFxc0Gg03Lp1K1/H+fvvvwu0/R1hYWEFmoZ/w4YNBAUFPXSoeUhICBqNBo1Gw6pVqwqU6XFFR0ej0Wg4fPjwYx3nk08+ISgoqFAyAcyfPx83N7c8X9/5HhVkeLoQwjxEnI/B+J+5VQ0GA5HHDqiUyLJIoWKhFixYwLZt29i5cydxcXG4urrmPte6dWvmzJlTaK+VkZHBhx9+yMcff5zvfZ577jmsra1ZvHhxvraNi4vj+eeff5yYxeJeBdU777zD5s2bi+w1e/ToQVxcHM2aNSuy1xBCFJ2AgIC75gzTacB/71hIOKVSKsshhYqFioqKokaNGtSuXRtPT080t2dAvHHjBjt27KBTp06F9lq//PILLi4utGjRokD7hYSEMHXq1IduZ2tri6enp8XOOOzk5ETZsmWL7Pj29vZ4enpiY2NTZK8hhCg6er2e2bNno9PpANDptMzqXhG9chl+fNo0o624r9JVqCgKZKWqcyvAkkqpqan069cPJycnvLy8+Oabb/I8HxwczDfffMM///yDRqMhODg497l169bRoEEDKlSoAMAff/xBtWrVsLe3p3Xr1kRHR+c51sCBA6lbt27u+klZWVnUr1+ffv365W6zdOnSPIVPRkYGtWrVYsiQIbmPRUVF4ezszNy5c3Mf69SpE/v37ycqKirf537HmDFjqFatGg4ODlSpUoUPP/yQ7Ozs3OfvXG5ZuHAhlSpVwtXVlVdeeYXk5OTcbTZs2EDLli1xc3OjbNmydOzY8b5ZFEXB39+fyZMn53n88OHDaDQaIiMjqVSpEgAvvvgiGo0m9+t7XfqZO3cutWrVwtbWFi8vr9yFIwG+/fZb6tSpg6OjIz4+Prz22mu5i0gKIUqm0NBQoqOjCQ8PJzo6htCwI1D5KchOhRUh8OeHYMhRO6ZZKl1z+2anwZfe6rz2e5fBxjFfm44ePZqtW7eyevVqPDw8eO+99zh48GDuh+HKlSsZO3Ysx48fZ+XKlXn+p71mzRo6d+4MwMWLF3nppZcYPnw4Q4YMYf/+/YwaNSrPa02dOpV69eoxduxYvvvuO95//31u3brFtGnTcrfZvn07ffv2zf3azs6OxYsX07RpUzp06EDHjh3p06cPzzzzDAMHDszdztfXlwoVKrBt2zaqVq1aoG+Xs7Mz8+fPx9vbm2PHjjF48GCcnZ159913c7eJiopi1apVuWtGde/ena+++oovvvgCMBV8I0eOpG7duqSkpPDRRx/x4osvcvjw4buaYTUaDQMHDmTevHm88847uY/PmzePp556Cn9/f/bt24eHhwfz5s3jueeey/3f0X/98MMPjBw5kq+++ornn3+exMREduzYkfu8Vqtl6tSpVK5cmXPnzvHaa6/x7rvvMmPGjAJ9j4QQlkWv16PX6//3QJ/fYPOnsHOq6RZ3GF6eB47lVMtojkpXoWIBUlJSCAsLY9GiRTz99NOAqT/Kv3+43d3dcXBwwMbGBk9Pz9zHMzMz2bBhA5988glg+sCsWrVqbotMYGAgx44dy7O6tZOTE4sWLaJVq1Y4OzszZcoUwsPDcxeKvHXrFomJiXh75y3wgoKC+Pzzzxk0aBCvvPIKMTExrF279q7z8fb2JiYmpsDfh3+vUVSpUiXeeecdli5dmqdQMRqNzJ8/H2dnZwD69u3L5s2bcwuVrl275jnm3LlzKV++PCdPnqR27dp3vWZISAgfffQRe/fupUmTJmRnZ/Pzzz/ntrLcWcPKzc0tz/f9vz7//HNGjRrFiBEjch9r3Lhx7v1/d4itVKkSn3/+OcOGDZNCRYjSRmcFz46Hig1g1XA4/w/MagU9FpoeE0BpK1SsHUwtG2q9dj5ERUWRlZVF06ZNcx9zd3cnMDDwoftu2bIFDw8PatWqBcCpU6fyHAe4Z4fMZs2a8c477zB+/HjGjBlDy5Ytc59LT08HTK0o/zVq1ChWrVrFtGnTWL9+/T37adjb2+cuQFkQy5YtY+rUqURFRZGSkkJOTs5dy4BXqlQpt0gB8PLyIiHhf1NVR0RE8NFHH7Fnzx6uXbuWOwLpwoUL9yxUvL296dChA3PnzqVJkyb8/vvvZGZm0q1bt3znTkhI4PLly7lF5r389ddfTJgwgdOnT5OUlEROTg4ZGRmkpaXh4JC/nxMhRAlS60UoXx2W9oYbUTD3OWg/CRr0kxWYKW19VDQa0+UXNW7F8MO2Zs0aXnjhhQLvZzQa2bFjBzqdjsjIyDzPlS1bFo1Gw82bN+/aLyEhgbNnz6LT6YiIiLjnsW/cuJGv1bT/bdeuXfTu3Zv27duzdu1aDh06xPvvv09WVlae7aytrfN8rdFo8gyH7tSpEzdu3ODHH39kz5497NmzB+Cu4/zboEGDWLp0Kenp6cybN48ePXoUqHiwt7d/4PPR0dF07NiRunXr8uuvv3LgwAGmT5/+0FxCiBLOowYMCYfA9mDIhN/fhJVDIDP54fuWcKWrULEAVatWxdraOvdDFeDmzZucPXv2gfspisLvv/+e2z8FoEaNGuzduzfPdrt3775r30mTJnH69Gm2bt3Khg0bmDdvXu5zNjY21KxZk5MnT96138CBA6lTpw4LFixgzJgxnDqVd5hdRkYGUVFR1K9f/8En/R87d+7Ez8+P999/n0aNGhEQEFDgy0fXr1/nzJkzfPDBBzz99NPUqFHjnsXWf7Vv3x5HR0d++OEHNmzYkKfPDZiKI4PBcN/9nZ2dqVSp0n2HKx84cACj0cg333zDE088QbVq1bh8WaVWPiGEebFzhR6L4emPQaODY8thdjDEH1M7maqkUDEzTk5OhIaGMnr0aLZs2cLx48cJCQm5q/Pnfx04cIC0tLQ8l22GDRtGREQEo0eP5syZM/z888/Mnz8/z36HDh3io48+Ys6cObRo0YJvv/2WESNGcO7cudxt2rVrx/bt2/PsN336dHbt2sWCBQvo3bs3Xbp0oXfv3nlaBXbv3o2trW2B5/8ICAjgwoULLF26lKioKKZOncpvvxVs+F6ZMmUoW7Yss2fPJjIyki1btjBy5MiH7qfT6QgJCWHcuHEEBATclf1OERIfH3/fwueTTz7hm2++YerUqURERHDw4EG+//57APz9/cnOzub777/n3LlzLFy4kJkzZxbo3IQQJZhWC0+OhJB14FIRrkeahjDvCyvQ6NGSRAoVMzRp0iSefPJJOnXqRNu2bWnZsiUNGzZ84D6rV6+mffv2WFn9r9uRr68vv/76K6tWraJevXrMnDmTL7/8Mvf5jIwM+vTpQ0hISO7w4yFDhtC6dWv69u2b23IQGhrKH3/8QWJiIgCnT59m9OjRzJgxAx8fHwBmzJjBtWvX+PDDD3OPv2TJEnr37l3gfhcvvPACb7/9Nq+//jpBQUHs3Lkzz3HzQ6vVsnTpUg4cOEDt2rV5++23mTRpUr72DQ0NJSsriwEDBtz13DfffMOmTZvw8fG5b0tR//79mTJlCjNmzKBWrVp07Ngx99JYvXr1+Pbbb5k4cSK1a9dm8eLFTJgwoUDnJoQoBfyawbDtUO0506WgdSPhlwGQkah2smKnURTLLtGSkpJwdXUlMTHxrs6WGRkZnD9/nsqVK9+zM2hJUrduXT744AO6d+9eJMfv1q0bDRo0YNy4cfna/tq1awQGBrJ//34qV6583+1CQkK4detWsU+f/yDbtm3j6aef5uLFi7nz0ZiD4OBggoKCmDJlyj2fL00/70KUGooCu6bDXx+DMQfKVIKXfgSfJmone2wP+vz+N2lRKQGysrLo2rVrkU5BP2nSJJycnPK9fXR0NDNmzHhgkXLH2rVrcXJyuufw5uKUmZlJbGwsn3zyCd26dTObImXx4sU4OTmxbds2taMIIYqbRgPNX4eBG8HVF25Gw9x2sOVzMGQ/dPeSQFpUhKoSEhJISkoCTMOLHR3zNyleUZg/fz6hoaEEBQWxZs0aKlasqFqWf0tOTubKlSuAaQ6XcuXuPRmU/LwLUcJlJMIfo+HoMtPXXkGm1pXy1VSN9ajy26IihYoQJYT8vAtRShxfCWvfhoxbYGUPz44n1us5IiIjCQgIyDv7rRmTSz9CCCFESVT7JXhtF1RpDTnphH3+Jn5+vrRp0wY/Pz/CwsLUTliopFARQgghLI2LN/RZSWyDsQxZm4Hx9rURo9HI0KFDiY2NVTdfIZJCRQghhLBEWi0Rzk/kFil3GAwGIg9sVSdTEZBCRQghhLBQAQEBd00IqtOA//a3YOc0MN5/Jm1LIYWKEEIIYaH0ej2zZ89Gp9MBptm1Z4XURe+YBX++D3PawuVDKqd8PFKoCCGEEBYsNDSU6OhowsPDiY6OJjTsMHSaCrYucPkg/NgG1r0D6bfUjvpIpFCxEMHBwbz11lu5X6elpdG1a1dcXFzQaDTcunUrX8f5+++/C7T9HWFhYTz77LP53n7Dhg0EBQXlWc34XkJCQtBoNGg0mkKbnfZRz9EcXmf+/Pm5349/v99CCPEger2e4OBg09BkjQYa9ofX90GdbqAYYd+PMK0RHFlmcWsGSaFioRYsWMC2bdvYuXMncXFxuLq65j7XunVr5syZU2ivlZGRwYcffsjHH3+c732ee+45rK2tWbx4cb62jYuLK7SZdZs3b37X96QoFMXr9OjRg7i4uAIv5CiEEHdx9oSuc6DfGigbAKlX4bchML8jXDmpdrp8k0Iln2JjYwkPDzebIV9RUVHUqFGD2rVr4+npiUajAeDGjRvs2LEjd5HBwvDLL7/g4uJCixYtCrRfSEgIU6dOfeh2tra2eHp6Ymtr+6gR87CxscnzPSkqRfE69vb2eHp6YmNjU2jHFEKUclVawas74emPTBPExWyHmS1Mk8alXFU73UNJoZIPYWFh+Pn5FdtkOqmpqfTr1w8nJye8vLz45ptv8jwfHBzMN998wz///INGoyE4ODj3uXXr1tGgQYPcdWr++OMPqlWrhr29Pa1btyY6OjrPsQYOHEjdunXJzMwETOsG1a9fn379+uVus3Tp0jyFT0ZGBrVq1WLIkCG5j0VFReHs7MzcuXNzH+vUqRP79+8nKiqqQOd/r0sqhw8fRqPR5OaPiYmhU6dOlClTBkdHR2rVqsUff/xxz/3nz5+Pm5sbGzdupEaNGjg5OeW24tyRk5PDm2++iZubG2XLlmXMmDH079+fLl265Dvn9evX6dmzJxUrVsTBwYE6deqwZMmS3O2vXr2Kp6dnnhWsd+7ciY2NDZs3by7Q90gIIQrEygaeHAXD90CNTqbLQfvnwtT6sP07yM5QO+F9SaHyELGxsQwZMiS3r0VxTKYzevRotm7dyurVq/nzzz/5+++/OXjwYO7zK1euZPDgwTRr1oy4uDhWrlyZ+9yaNWvo3LkzABcvXuSll16iU6dOHD58mEGDBjF27Ng8rzV16lRSU1NzH3///fe5desW06ZNy91m+/btNGrUKPdrOzs7Fi9ezIIFC1i9ejUGg4E+ffrwzDPPMHDgwNztfH19qVChQpEspjd8+HAyMzP5559/OHbsGBMnTnzgoolpaWlMnjyZhQsX8s8//3DhwgXeeeed3OcnTpzI4sWLmTdvHjt27CApKanAfWYyMjJo2LAh69at4/jx4wwZMoS+ffuyd+9eAMqXL8/cuXP55JNP2L9/P8nJyfTt25fXX3+dp59++pG+D0IIUSBl/KDHIgj5w7RWUFYy/PUJTGsMx381y/4rVmoHMHcRERF3dQg1GAxERkYWyXoKKSkphIWFsWjRotwPrwULFuR5LXd3dxwcHHIvPdyRmZnJhg0b+OSTTwD44YcfqFq1am6LTGBgYO6H+h1OTk4sWrSIVq1a4ezszJQpUwgPD89dd+HWrVskJibi7e2dJ2dQUBCff/45gwYN4pVXXiEmJuaeqx97e3sTExNTON+cf7lw4QJdu3alTp06AFSpUuWB22dnZzNz5kyqVq0KwOuvv85nn32W+/z333/PuHHjePHFFwGYNm1abgtNflWsWDFP8fPGG2+wceNGli9fTpMmpiXZ27dvz+DBg+nduzeNGjXC0dGRCRMmFOh1hBDisVVqAYPD4dhy+OtTSLwAvwyEnd9D6w/A/2lTp1wzUGQtKl988QXNmzfHwcEBNze3e25z4cIFOnTogIODAx4eHowePZqcnJyiivRI7jmZjk6Hv79/kbxeVFQUWVlZNG3aNPcxd3d3AgMDH7rvli1b8PDwoFatWgCcOnUqz3GAe3bSbNasGe+88w7jx49n1KhRtGzZMve59PR0gHsucjdq1CiqVavGtGnTmDt3LmXLlr1rG3t7e9LS0h6avaDefPNNPv/8c1q0aMHHH3/M0aNHH7i9g4NDbpECppWaExISAEhMTOTKlSu5xQSY3uOGDRsWKJPBYGD8+PHUqVMHd3d3nJyc2LhxIxcuXMiz3eTJk8nJyWHFihUsXry40PrmCCFEgWi1UO8VeOMAtH4frB1Nc64s7grznofo7WbRP7PICpWsrCy6devGq6++es/nDQYDHTp0ICsri507d7JgwQLmz5/PRx99VFSRHsk9J9OZNcssV6dcs2YNL7zwQoH3MxqN7NixA51OR2RkZJ7nypYti0aj4ebNm3ftl5CQwNmzZ9HpdERERNzz2Ddu3KB8+fIFynOnMPz3wt7Z2dl5thk0aBDnzp2jb9++HDt2jEaNGvH999/f95jW1tZ5vtZoNBT2wuGTJk3i//7v/xgzZgzh4eEcPnyYdu3akZWVlWe7qKgoLl++jNFovKvPkBBCFDsbB2j1Lrx1FJq9DlZ2cGEXYW8+g5+vj+qLHRZZofLpp5/y9ttv5zbN/9eff/7JyZMnWbRoEUFBQTz//POMHz+e6dOn3/WHXW13TaYTGlpkr1W1alWsra3Zs2dP7mM3b97k7NmzD9xPURR+//333P4pADVq1MjtH3HH7t2779p30qRJnD59mq1bt7JhwwbmzZuX+5yNjQ01a9bk5Mm7h7INHDiQOnXqsGDBAsaMGcOpU6fyPJ+RkUFUVBT169d/8En/x53C5t+dXQ8fPnzXdj4+PgwbNoyVK1cyatQofvzxxwK9zh2urq5UqFCBffv25T5mMBjy9AvKjx07dtC5c2f69OlDvXr1qFKlyl3vW1ZWFn369KFHjx6MHz+eQYMG5bbsCCGEqhzLQbsv4M1DxFbuYTaLHarWmXbXrl3UqVMnd3QKQLt27UhKSuLEiRP33S8zM5OkpKQ8t+KQZzKdIuTk5ERoaCijR49my5YtHD9+nJCQkLsuP/3XgQMHSEtLy3PZZtiwYURERDB69GjOnDnDzz//zPz58/Psd+jQIT766CPmzJlDixYt+PbbbxkxYgTnzp3L3aZdu3Zs3749z37Tp09n165dLFiwgN69e9OlSxd69+6dp8jcvXs3tra2BZ4TxN/fHx8fHz755BMiIiJYt27dXSOf3nrrLTZu3Mj58+c5ePAg4eHh1KhRo0Cv829vvPEGEyZMYPXq1Zw5c4YRI0Zw8+bNAg09DggIYNOmTezcuZNTp04xdOhQrly5kmeb999/n8TERKZOncqYMWOoVq1ang7IQgihOhdvInx73nuxw/+0uhcH1QqV+Pj4PEUKkPt1fHz8ffebMGECrq6uuTcfH58izamGSZMm8eSTT9KpUyfatm1Ly5YtH9pfYvXq1bRv3x4rq//1j/b19eXXX39l1apV1KtXj5kzZ+YZGpuRkUGfPn0ICQnJHX48ZMgQWrduTd++fTEYTItZhYaG8scff5CYmAjA6dOnGT16NDNmzMj9/s+YMYNr167x4Ycf5h5/yZIl9O7dGwcHhwKdv7W1NUuWLOH06dPUrVuXiRMn8vnnn+fZxmAwMHz4cGrUqMFzzz1HtWrVmDFjRoFe59/GjBlDz5496devH82aNcPJyYl27drds2/O/XzwwQc0aNCAdu3aERwcjKenZ57hzX///TdTpkxh4cKFuLi4oNVqWbhwIdu2beOHH3545OxCCFHYirt/5gMpBTBmzBgFeODt1KlTefaZN2+e4urqetexBg8erDz77LN5HktNTVUA5Y8//rhvhoyMDCUxMTH3dvHiRQVQEhMT79o2PT1dOXnypJKenl6Q07RIderUUZYtW1Zkx3/55ZeVL7/8Mt/bX716VXF3d1fOnTv3wO369++vdO7c+THTFT6DwaBUq1ZN+eCDD+67zYYNGxSNRqNkZmYW+uu3atVKGTFiRIH2KU0/70KIojdnzhxFp9MpgKLT6ZQ5c+YU6vETExPv+/n9bwUanjxq1ChCQkIeuM3Dhone4enpeVf/iTvN5P8ecvtftra2MkriP7KysujatWuhTUF/L5MmTeL333/P9/bR0dHMmDGDypUrP3TbtWvX4uTkxNKlS+nYsePjxHxkMTEx/Pnnn7Rq1YrMzEymTZvG+fPn6dWr1z23v3LlCqtXryYgIKBQZ5FdvHgxQ4cOJT09naCgoEI7rhBCFFRoaCjt2rUjMjISf39/1QaRaBSlaGd3mT9/Pm+99dZdC7etX7+ejh07EhcXh4eHBwCzZ89m9OjRJCQk5LsYSUpKwtXVlcTExNy5P+7IyMjg/PnzVK5cuUBN+KL4JCQk5PYz8vLywtHRUZUcFy9e5JVXXuH48eMoikLt2rX56quveOqpp+65fcOGDUlOTmbGjBm0bdu20HIkJyfnFuxubm6UK1cu3/vKz7sQwpI86PP734pswrcLFy5w48YNLly4gMFgyB214e/vj5OTE88++yw1a9akb9++fP3118THx/PBBx8wfPhwaTEpRTw8PHILVTX5+PiwY8eOfG9/4MCBIsnh7OyMs7NzkRxbCCEsUZEVKh999BELFizI/frOENXw8HCCg4PR6XSsXbuWV199lWbNmuHo6Ej//v3zzBYqhBBCiNKtyC/9FLX8XPqpVKkS9vb2KiUUonikp6cTHR0tl36EEBYhv5d+SvSihHdmIy2KKdyFMDd3fs7/OwuvEEJYshK9KKFOp8PNzS135k8HB4cCTeAlhCVQFIW0tDQSEhJwc3PLXe5BCCFKghJdqMD/hjrLNOWipHNzc3vg0H4hhLBEJb5Q0Wg0eHl54eHhcdfCdkKUFNbW1tKSIoQokUp8oXKHTqeTP+RCCCGEhSnRnWmFEEIIYdmkUBFCCCGE2ZJCRQghhBBmy+L7qNyZr+7OejFCCCGEMH93PrcfNu+sxRcqycnJgGmtFiGEEEJYluTkZFxdXe/7vMVPoW80Grl8+TLOzs6FPplbUlISPj4+XLx48YHT+1oqOT/LV9LPUc7P8pX0c5Tze3SKopCcnIy3tzda7f17olh8i4pWq0Wv1xfpa7i4uJTIH8A75PwsX0k/Rzk/y1fSz1HO79E8qCXlDulMK4QQQgizJYWKEEIIIcyWFCoPYGtry8cff4ytra3aUYqEnJ/lK+nnKOdn+Ur6Ocr5FT2L70wrhBBCiJJLWlSEEEIIYbakUBFCCCGE2ZJCRQghhBBmSwoVIYQQQpgtKVT+5YsvvqB58+Y4ODjg5uaWr30UReGjjz7Cy8sLe3t72rZtS0RERNEGfQw3btygd+/euLi44ObmRmhoKCkpKQ/cJzg4GI1Gk+c2bNiwYkr8YNOnT6dSpUrY2dnRtGlT9u7d+8DtV6xYQfXq1bGzs6NOnTr88ccfxZT00RXkHOfPn3/Xe2VnZ1eMaQvmn3/+oVOnTnh7e6PRaFi1atVD9/n7779p0KABtra2+Pv7M3/+/CLP+agKen5///33Xe+fRqMhPj6+eAIX0IQJE2jcuDHOzs54eHjQpUsXzpw589D9LOX38FHOz9J+B3/44Qfq1q2bO6Fbs2bNWL9+/QP3Ke73TwqVf8nKyqJbt268+uqr+d7n66+/ZurUqcycOZM9e/bg6OhIu3btyMjIKMKkj653796cOHGCTZs2sXbtWv755x+GDBny0P0GDx5MXFxc7u3rr78uhrQPtmzZMkaOHMnHH3/MwYMHqVevHu3atSMhIeGe2+/cuZOePXsSGhrKoUOH6NKlC126dOH48ePFnDz/CnqOYJpB8t/vVUxMTDEmLpjU1FTq1avH9OnT87X9+fPn6dChA61bt+bw4cO89dZbDBo0iI0bNxZx0kdT0PO748yZM3neQw8PjyJK+Hi2bt3K8OHD2b17N5s2bSI7O5tnn32W1NTU++5jSb+Hj3J+YFm/g3q9nq+++ooDBw6wf/9+2rRpQ+fOnTlx4sQ9t1fl/VPEXebNm6e4uro+dDuj0ah4enoqkyZNyn3s1q1biq2trbJkyZIiTPhoTp48qQDKvn37ch9bv369otFolEuXLt13v1atWikjRowohoQF06RJE2X48OG5XxsMBsXb21uZMGHCPbfv3r270qFDhzyPNW3aVBk6dGiR5nwcBT3H/P7smiNA+e233x64zbvvvqvUqlUrz2M9evRQ2rVrV4TJCkd+zi88PFwBlJs3bxZLpsKWkJCgAMrWrVvvu40l/h7ekZ/zs+TfwTvKlCmjzJkz557PqfH+SYvKYzh//jzx8fG0bds29zFXV1eaNm3Krl27VEx2b7t27cLNzY1GjRrlPta2bVu0Wi179ux54L6LFy+mXLly1K5dm3HjxpGWllbUcR8oKyuLAwcO5Pnea7Va2rZte9/v/a5du/JsD9CuXTuzfK/g0c4RICUlBT8/P3x8fB74PyNLZGnv4aMKCgrCy8uLZ555hh07dqgdJ98SExMBcHd3v+82lvwe5uf8wHJ/Bw0GA0uXLiU1NZVmzZrdcxs13j+LX5RQTXeuG1eoUCHP4xUqVDDLa8rx8fF3NSFbWVnh7u7+wLy9evXCz88Pb29vjh49ypgxYzhz5gwrV64s6sj3de3aNQwGwz2/96dPn77nPvHx8RbzXsGjnWNgYCBz586lbt26JCYmMnnyZJo3b86JEyeKfPHO4nC/9zApKYn09HTs7e1VSlY4vLy8mDlzJo0aNSIzM5M5c+YQHBzMnj17aNCggdrxHshoNPLWW2/RokULateufd/tLO338I78np8l/g4eO3aMZs2akZGRgZOTE7/99hs1a9a857ZqvH8lvlAZO3YsEydOfOA2p06donr16sWUqPDl9xwf1b/7sNSpUwcvLy+efvppoqKiqFq16iMfVxS+Zs2a5fmfUPPmzalRowazZs1i/PjxKiYT+REYGEhgYGDu182bNycqKorvvvuOhQsXqpjs4YYPH87x48fZvn272lGKRH7PzxJ/BwMDAzl8+DCJiYn88ssv9O/fn61bt963WCluJb5QGTVqFCEhIQ/cpkqVKo90bE9PTwCuXLmCl5dX7uNXrlwhKCjokY75KPJ7jp6ennd1wszJyeHGjRu555IfTZs2BSAyMlK1QqVcuXLodDquXLmS5/ErV67c91w8PT0LtL3aHuUc/8va2pr69esTGRlZFBGL3f3eQxcXF4tvTbmfJk2amP2H/+uvv57bOf9hrQaW9nsIBTu//7KE30EbGxv8/f0BaNiwIfv27eP//u//mDVr1l3bqvH+lfg+KuXLl6d69eoPvNnY2DzSsStXroynpyebN2/OfSwpKYk9e/bc9/peUcjvOTZr1oxbt25x4MCB3H23bNmC0WjMLT7y4/DhwwB5irPiZmNjQ8OGDfN8741GI5s3b77v975Zs2Z5tgfYtGlTsb5XBfEo5/hfBoOBY8eOqfpeFSZLew8Lw+HDh832/VMUhddff53ffvuNLVu2ULly5YfuY0nv4aOc339Z4u+g0WgkMzPzns+p8v4VWTddCxQTE6McOnRI+fTTTxUnJyfl0KFDyqFDh5Tk5OTcbQIDA5WVK1fmfv3VV18pbm5uyurVq5WjR48qnTt3VipXrqykp6ercQoP9dxzzyn169dX9uzZo2zfvl0JCAhQevbsmft8bGysEhgYqOzZs0dRFEWJjIxUPvvsM2X//v3K+fPnldWrVytVqlRRnnrqKbVOIdfSpUsVW1tbZf78+crJkyeVIUOGKG5ubkp8fLyiKIrSt29fZezYsbnb79ixQ7GyslImT56snDp1Svn4448Va2tr5dixY2qdwkMV9Bw//fRTZePGjUpUVJRy4MAB5ZVXXlHs7OyUEydOqHUKD5ScnJz7ewYo3377rXLo0CElJiZGURRFGTt2rNK3b9/c7c+dO6c4ODgoo0ePVk6dOqVMnz5d0el0yoYNG9Q6hQcq6Pl99913yqpVq5SIiAjl2LFjyogRIxStVqv89ddfap3CA7366quKq6ur8vfffytxcXG5t7S0tNxtLPn38FHOz9J+B8eOHats3bpVOX/+vHL06FFl7NixikajUf78809FUczj/ZNC5V/69++vAHfdwsPDc7cBlHnz5uV+bTQalQ8//FCpUKGCYmtrqzz99NPKmTNnij98Pl2/fl3p2bOn4uTkpLi4uCgDBgzIU4idP38+zzlfuHBBeeqppxR3d3fF1tZW8ff3V0aPHq0kJiaqdAZ5ff/994qvr69iY2OjNGnSRNm9e3fuc61atVL69++fZ/vly5cr1apVU2xsbJRatWop69atK+bEBVeQc3zrrbdyt61QoYLSvn175eDBgyqkzp87w3H/e7tzTv3791datWp11z5BQUGKjY2NUqVKlTy/j+amoOc3ceJEpWrVqoqdnZ3i7u6uBAcHK1u2bFEnfD7c69z++zfSkn8PH+X8LO13cODAgYqfn59iY2OjlC9fXnn66adzixRFMY/3T6MoilJ07TVCCCGEEI+uxPdREUIIIYTlkkJFCCGEEGZLChUhhBBCmC0pVIQQQghhtqRQEUIIIYTZkkJFCCGEEGZLChUhhBBCmC0pVIQQQghhtqRQEUIIIYTZkkJFCCGEEGZLChUhhBBCmC0pVIQQZuXq1at4enry5Zdf5j62c+dObGxs7lpeXghR8smihEIIs/PHH3/QpUsXdu7cSWBgIEFBQXTu3Jlvv/1W7WhCiGImhYoQwiwNHz6cv/76i0aNGnHs2DH27duHra2t2rGEEMVMChUhhFlKT0+ndu3aXLx4kQMHDlCnTh21IwkhVCB9VIQQZikqKorLly9jNBqJjo5WO44QQiXSoiKEMDtZWVk0adKEoKAgAgMDmTJlCseOHcPDw0PtaEKIYiaFihDC7IwePZpffvmFI0eO4OTkRKtWrXB1dWXt2rVqRxNCFDO59COEMCt///03U6ZMYeHChbi4uKDValm4cCHbtm3jhx9+UDueEKKYSYuKEEIIIcyWtKgIIYQQwmxJoSKEEEIIsyWFihBCCCHMlhQqQgghhDBbUqgIIYQQwmxJoSKEEEIIsyWFihBCCCHMlhQqQgghhDBbUqgIIYQQwmxJoSKEEEIIsyWFihBCCCHM1v8DF0G6zgHJwuEAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "f_and_df = jax.value_and_grad(f)\n", "vals_and_grads = [f_and_df(x) for x in xs_jax]\n", "fs, dfs = list(zip(*vals_and_grads))\n", "\n", "plt.plot(xs_jax, fs, label='f(x)')\n", "plt.plot(xs, df(xs), label='df/dx(x) [analytical]')\n", "plt.plot(xs_jax, df_jax_eval, 'k.', label='df/dx(x) [using jax]')\n", "plt.xlabel('x')\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "a727c6f0-b26a-4b3e-9582-148098f136ec", "metadata": {}, "source": [ "We can also take an elementwise gradient using [jax.vmap](https://jax.readthedocs.io/en/v1.9.0rc2/_autosummary/jax.vmap.html), which vectorizes our gradient function." ] }, { "cell_type": "code", "execution_count": 6, "id": "9abb7392-9e0c-4cd6-8fd3-6ce78f563fce", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df_jax_vectorized = jax.vmap(jax.grad(f))\n", "\n", "# get a set of points to feed the derivative function one by one (for now)\n", "df_jax_eval = df_jax_vectorized(xs)\n", "\n", "plt.plot(xs, f(xs), label='f(x)')\n", "plt.plot(xs, df(xs), label='df/dx(x) [analytical]')\n", "plt.plot(xs, df_jax_eval, 'k-.', label='df/dx(x) [using jax]')\n", "plt.xlabel('x')\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "18a7936e-9919-4ace-85bf-d8c14d124649", "metadata": {}, "source": [ "Before we continue, there are a few things to watch out for when using jax for gradient calculation:\n", "\n", "1. `jax.grad` outputs doesn't automatically convert input arguments from `int` to `float`, so avoid passing `int` types to your functions." ] }, { "cell_type": "code", "execution_count": 7, "id": "d648c131-b674-49a7-b441-ca6569e6540d", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1.7015114\n", "TypeError('grad requires real- or complex-valued inputs (input dtype that is a sub-dtype of np.inexact), but got int32. If you want to use Boolean- or integer-valued inputs, use vjp or set allow_int to True.')\n" ] } ], "source": [ "# ok\n", "print(df_jax(1.0))\n", "\n", "# errors\n", "try:\n", " df_jax(1)\n", "except TypeError as e:\n", " print(repr(e))" ] }, { "cell_type": "markdown", "id": "003ef198-e0a2-495f-844e-adeff0563c1d", "metadata": {}, "source": [ "2. When differentiating with respect to several arguments, you need to tell `jax.grad` which arguments you want to take the derivative with respect to as a tuple in indices. Otherwise it will take the derivative with respect to only the first argument." ] }, { "cell_type": "code", "execution_count": 8, "id": "b42164ce-41df-4bb2-8e23-eb11b2a45547", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "dgdx=1.0\n", "dgdx=1.0, dgdy=1.0, dgdz=2.0\n" ] } ], "source": [ "def g(x, y, z):\n", " return x * y + z**2\n", "\n", "# only gives dg/dx\n", "dg = jax.grad(g)\n", "dgdx = dg(1.,1.,1.) \n", "print(f'dgdx={dgdx}')\n", "\n", "# gives derivative w.r.t. all three args\n", "dg_all = jax.grad(g, argnums=(0,1,2))\n", "dgdx, dgdy, dgdz = dg_all(1., 1., 1.)\n", "print(f'dgdx={dgdx}, dgdy={dgdy}, dgdz={dgdz}')" ] }, { "cell_type": "markdown", "id": "cbb36cd5-fef1-47d1-b25f-1fb7cc0d882b", "metadata": {}, "source": [ "## Incorporating Automatic Differentiation in `Tidy3D`\n", "\n", "With that basic introduction to automatic differentiation using `jax`, we can now show how the `tidy3d.plugins.adjoint`lets us do the same thing but where our functions can now involve setting up, running, and postprocessing a `tidy3d.Simulation`.\n", "\n", "We'll need to import special `Jax` components from the adjoint plugin for this to work. These components are registered with `jax` so it knows how to handle them in its automatic differentiation pipeline.\n", "\n", "We'll also need to import a special `web.run()` wrapper from the plugin. This [tidy3d.plugins.adjoint.web.run](https://docs.flexcompute.com/projects/tidy3d/en/v1.9.0rc2/_autosummary/tidy3d.plugins.adjoint.run.html) function operates the same as `web.run()`, except its derivative rules are defined in the backend using the adjoint method. Thus, `jax` will know how to \"differentiate\" [tidy3d.plugins.adjoint.web.run](https://docs.flexcompute.com/projects/tidy3d/en/v1.9.0rc2/_autosummary/tidy3d.plugins.adjoint.run.html) and it can be used within a function that we want to take derivatives with respect to.\n", "\n", "\n", "Here is a diagram showing how the input arguments of our function `f` are related to the `JaxSimulation` and how the `JaxSimulationData` output of `tidy3d.plugins.adjoint.web.run` is related to the return value of `f`. This diagram can be a useful reference when moving through this section.\n", "\n", "\n", "\n", "### Introducing `JaxSimuation`\n", "\n", "Now we will show how to set up a very simple function using the adjoint plugin and differentiate it.\n", "\n", "First, both our `Simulation` and some of its `.structures` may be dependent on the function arguments. Therefore, we need to use a special `Simulation` subclass called [JaxSimulation](https://docs.flexcompute.com/projects/tidy3d/en/v1.9.0rc2/_autosummary/tidy3d.plugins.adjoint.JaxSimulation.html).\n", "\n", "[JaxSimulation](https://docs.flexcompute.com/projects/tidy3d/en/v1.9.0rc2/_autosummary/tidy3d.plugins.adjoint.JaxSimulation.html) is just a `jax`-compatible stand in for `Simulation` and behaves almost entirely the same, except for a few important differences:\n", "\n", "1. it accepts an additional field `.input_structures`. These `input_structures` are tidy3d structures that can depend on the function arguments, and therefore need to be, `jax`-compatible, themselves. Thus, the structures used in this field must be of the `jax`-compatible type [JaxStructure](https://docs.flexcompute.com/projects/tidy3d/en/v1.9.0rc2/_autosummary/tidy3d.plugins.adjoint.JaxStructure.html), which itself contains a `.medium` field of type [JaxMedium](https://docs.flexcompute.com/projects/tidy3d/en/v1.9.0rc2/_autosummary/tidy3d.plugins.adjoint.JaxMedium.html) and a `.geometry` field that is of type [JaxBox](https://docs.flexcompute.com/projects/tidy3d/en/v1.9.0rc2/_autosummary/tidy3d.plugins.adjoint.JaxBox.html). The `center`, `size`, and `permittivity` fields of these components may all depend on the function input arguments and the final gradients of the function will be given with respect to the values these fields.\n", "\n", "> At the time of publishing, only `JaxStructures` with geometry of `JaxBox` are supported. However, the medium may contain [JaxMedium](https://docs.flexcompute.com/projects/tidy3d/en/v1.9.0rc2/_autosummary/tidy3d.plugins.adjoint.JaxMedium.html), [JaxAnisotropicMedium](https://docs.flexcompute.com/projects/tidy3d/en/v1.9.0rc2/_autosummary/tidy3d.plugins.adjoint.JaxAnisotropicMedium.html), or [JaxCustomMedium](https://docs.flexcompute.com/projects/tidy3d/en/v1.9.0rc2/_autosummary/tidy3d.plugins.adjoint.JaxCustomMedium.html). \n", "\n", "> Any extraneous `Structures` can be added to the `JaxSimulation.structures` as long as they don't depend on the funciton arguments. These structures will still influence the simulation result as normal, but are \"static\". \n", "\n", "> The `input_structures` are always assumed to be added *on top of* the existing `.structures`.\n", "\n", "2. it accepts another additional field `.output_monitors`, which define the set of monitors with corresponding data that the return value of our function will depend on. Note that at the time of writing, only `ModeMonitor` are supported.\n", "\n", "3. to convert a `JaxSimulation` to a `Simulation`, one may call `sim, info = JaxSimulation.to_simulation()` where the `sim` is the `Simulation` with all `structures` and `monitors` put together and `info` is just a special information container that is needed to reconstruct the `JaxSimulation` from `sim` using `JaxSimulation.from_simulation(sim, info)`.\n", "\n", "Let us now import these new `Jax` Tidy3d types and use them in an example." ] }, { "cell_type": "code", "execution_count": 9, "id": "f304ea94-34df-4741-ab99-87003884eee7", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "WARNING:rich:This version of Tidy3D was pip installed from the 'tidy3d-beta' repository on PyPI. Future releases will be uploaded to the 'tidy3d' repository. From now on, please use 'pip install tidy3d' instead.\n", "INFO:rich:Using client version: 1.9.0rc2\n" ] } ], "source": [ "import tidy3d as td\n", "from tidy3d.plugins.adjoint import JaxSimulation, JaxStructure, JaxMedium, JaxBox" ] }, { "cell_type": "markdown", "id": "e54cc9fa-b5f2-4f62-b31e-3a0e1fa7acac", "metadata": {}, "source": [ "### Simulation example\n", "\n", "In our example, we will set up a function that involves a simulation of transmission through a waveguide in the presence of a scatterer.\n", "\n", "This scatterer geometry and material properties will depend on the function input arguments.\n", "\n", "The output of the function will simply be the power transmitted into the 0th order mode.\n", "\n", "We will then take the gradient of the output of this function (power) with respect to the scatterer geometric and medium properties using `jax`.\n", "\n", "To start, it can often be helpful to break our function up into a few parts for debugging.\n", "\n", "Therefore, we will introduce one function to make the `JaxSimulation` given the input arguments and one function to postprocess the result." ] }, { "cell_type": "code", "execution_count": 10, "id": "3cbe5188-a552-40db-a1e6-ddb4af0ead63", "metadata": {}, "outputs": [], "source": [ "def make_simulation(center: float, size: float, eps: float) -> JaxSimulation:\n", " \"\"\"Makes a simulation with a variable scatter width, height, and relative permittivity.\"\"\"\n", " \n", " wavelength = 1.0\n", " freq0 = td.C_0 / wavelength\n", " dl = 0.02\n", "\n", " # a \"static\" structure\n", " waveguide=td.Structure(\n", " geometry=td.Box(size=(td.inf, 0.3, 0.2)),\n", " medium=td.Medium(permittivity=2.0)\n", " )\n", " \n", " # our \"forward\" soruce\n", " mode_src = td.ModeSource(\n", " size=(0,1.5,1.5),\n", " center=(-0.9,0,0),\n", " mode_index=0,\n", " source_time=td.GaussianPulse(freq0=freq0, fwidth=freq0/10),\n", " direction=\"+\",\n", " )\n", " \n", " # a monitor to store data that our overall function will depend on\n", " mode_mnt = td.ModeMonitor(\n", " size=(0,1.5,1.5),\n", " center=(+0.9,0,0),\n", " mode_spec=mode_src.mode_spec,\n", " freqs=[freq0],\n", " name=\"mode\",\n", " )\n", " \n", " # the structure that depends on the input parameters, which we will differentiate our function w.r.t\n", " scatterer = JaxStructure(\n", " geometry=JaxBox(\n", " center=center,\n", " size=size,\n", " ),\n", " medium=JaxMedium(permittivity=eps)\n", " )\n", "\n", " return JaxSimulation(\n", " size=(2,2,2),\n", " run_time=1e-12,\n", " structures=[waveguide],\n", " input_structures=[scatterer],\n", " sources=[mode_src],\n", " output_monitors=[mode_mnt],\n", " boundary_spec=td.BoundarySpec.all_sides(td.PML()),\n", " grid_spec=td.GridSpec.uniform(dl=dl),\n", " )" ] }, { "cell_type": "markdown", "id": "f4dcb88e-490f-4579-bb7d-4166bd6a3be5", "metadata": {}, "source": [ "> Note: adding `.monitors` to the `JaxSimulation` will work as intended, but the function being differentiated should not depend on data corresponding to these monitors. This can, however,be useful for debugging, for example by examining field patterns, as the data will still be accessible in the output data.\n", "\n", "Let's try setting up the simulation and plotting it for starters." ] }, { "cell_type": "code", "execution_count": 11, "id": "f4da7dc4-b13b-4c62-8590-4877ed71422a", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABSoAAAHCCAYAAADo9PdCAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAACw3UlEQVR4nOzdeZhjVYE+/vcmN0t3qqqTrm56EWRzaXYQAWFURHvsEcYRF8aFEccFBFfEceEnA8KMw7jCqAjiqMwo+GXwUXTUQQFBXBhcAEcRBBVFoBs66aRSla7KzU3O749wcpNUlnP3eyvv53n60a5OKrfr5Z7T983NOZoQQoCIiIiIiIiIiIgoRImwD4CIiIiIiIiIiIiIRSURERERERERERGFjkUlERERERERERERhY5FJREREREREREREYWORSURERERERERERGFjkUlERERERERERERhY5FJREREREREREREYWORSURERERERERERGFjkUlERERERERERERhY5FJVHM3XrrrdA0DbfeemvYh0JEROQa5zUiIlpJOK8R2cOikigmPvOZz+Cqq64K+zAcueaaa3DppZeGfRg9Pv/5z+OAAw5ANpvFU5/6VHzqU59Sfm69Xsf73vc+bN68GatWrcIxxxyDG2+8ceBjf/KTn+DZz342Vq9ejY0bN+Id73gHFhYWvPprEBHFFuc1b3FeIyIKF+c1b7RaLXzkIx/Bvvvui2w2i0MPPRRf+cpXlJ9fqVRwxhlnYP369cjlcjjhhBNw5513DnzsN7/5TTzjGc9ANpvFk5/8ZFxwwQUwTdOrvwo5JYgoFg466CBx/PHHL/t6s9kUi4uLotlsBn9Qik466SSx9957h30YHVdccYUAIF7+8peLK6+8Urz2ta8VAMS//uu/Kj3/Va96ldB1XfzDP/yD+OxnPyuOPfZYoeu6+OEPf9jzuLvuuktks1lxxBFHiMsvv1x84AMfEJlMRvzVX/2VH38tIqJY4bzmHc5rRETh47zmjfe///0CgDj99NPFlVdeKU466SQBQHzlK18Z+9xmsymOO+44kcvlxAc/+EHx6U9/Whx44IFienpa3H///T2P/c53viM0TRMnnHCCuPLKK8Xb3/52kUgkxJlnnunXX40UsaikWFlYWAj7EEIzbOKLgyhNfLt37xazs7PipJNO6vn6qaeeKnK5nNi1a9fI599xxx0CgPjoRz/a+dri4qLYf//9xbHHHtvz2Be96EVi06ZNYm5urvO1z33ucwKA+O53v+vB34aI4o7z2vFhH4YjnNc4rxHRYJzXjg/7MByJyrz28MMPi1QqJd761rd2vtZqtcRznvMcseeeewrTNEc+/9prrxUAxHXXXdf52uOPPy7y+bx49atf3fPYAw88UBx22GGi0Wh0vvaBD3xAaJom7r33Xo/+RuQEi0oKzcMPPyze8IY3iE2bNol0Oi322WcfceaZZ4p6vS6EEOKLX/yiACBuvfVWcdZZZ4n169eLfD7fef5ll10mDjzwQJFOp8WmTZvEW97yFlEul3te4/777xcve9nLxIYNG0QmkxFPetKTxCtf+UpRqVQ6j/ne974n/uIv/kKsWbNG5HI58bSnPU2ce+65Y49f5XlLS0vi/PPPF/vvv79Ip9Nizz33FO95z3vE0tLSsu/3pS99SRx11FFi1apVIp/Pi+c85zmdf/TvvffeAkDPLzkJ3nLLLQKAuOWWW3q+33/913+JZzzjGSKbzYrZ2Vlx6qmniocffrjnMa973etELpcTDz/8sHjJS14icrmcWLdunXj3u989dhIQQojrr79enHjiiZ0M99tvP3HRRRf1PPf4449fduyjJsEvfOELAoD4/Oc/3/P1D33oQwKA+Pa3vz32uEb59re/PfD7/OQnPxEAxJe+9KWRz3/Pe94jkslkz0WaEEL8y7/8iwAgHnroISGEEHNzc0LXdfGe97yn53H1el1MTU2JN77xja7+HkQUPZzXenFea3vuc58rDj300IF/9rSnPU288IUvHHtco3BeIyK/cF7rxXnNOqb+x8tfF1xwwdhjGuWyyy4TAMQ999zT8/VrrrlGAFh2p3+/U045RWzYsGHZ3atnnHGGWL16dSfXe+65RwAQl112Wc/jHnnkEQFA/NM//ZOrvwe5o3v0CXIiWx599FEcffTRnfUjtmzZgkceeQRf/epXsXv3bqTT6c5j3/KWt2D9+vU4//zzUavVAAAf/OAHceGFF2Lr1q0466yz8Nvf/haXX345fvazn+HHP/4xUqkUDMPAtm3bUK/X8fa3vx0bN27EI488gm9961uoVCpYs2YN7rnnHvz1X/81Dj30UFx00UXIZDL43e9+hx//+Mcjj1/lea1WC3/zN3+DH/3oRzjjjDNwwAEH4Fe/+hUuueQS3H///bj++us7j73wwgvxwQ9+EMcddxwuuugipNNp3HHHHfj+97+PF77whbj00kvx9re/HVNTU/jABz4AANiwYcPQ47vqqqvw+te/HkcddRQuvvhiPPbYY/i3f/s3/PjHP8Zdd92FfD7feWyz2cS2bdtwzDHH4GMf+xhuuukmfPzjH8f++++Ps846a+TP4aqrrsLU1BTOOeccTE1N4fvf/z7OP/98VKtVfPSjHwUAfOADH8Dc3BwefvhhXHLJJQCAqampod/z9a9/Pb72ta/hnHPOwV/+5V9ir732wq9+9StceOGFeOMb34gTTzyx89hyuYxmsznyGAFg9erVWL16NQDgrrvuAgA885nP7HnMkUceiUQigbvuugt/93d/N/R73XXXXXja056GmZmZnq8fffTRAIC77767c8ymaS57nXQ6jcMPP7xzHES0MnBe47w2zGtf+1qcfvrp+PWvf42DDz648/Wf/exnuP/++3Heeed1vsZ5jYiigvMa57Vh3vzmN2Pr1q09X7vhhhtw9dVXY4899uh8rVgsjjw2aXp6GplMBkB7TsrlcjjggAN6HiPnpLvuugvPfvazh36vu+66C894xjOQSPRux3L00UfjyiuvxP33349DDjlk6Ny5efNm7LnnnpzTwhZ2U0qT6bTTThOJREL87Gc/W/ZnrVZLCGG9Q/fsZz+75x2fxx9/XKTTafHCF76w552ST3/60wKA+MIXviCEaK+jhL7bvvtdcsklAoDYuXOnreNXed6XvvQlkUgklr3rI9eR+vGPfyyEEOKBBx4QiURCvPSlL132zo/8WQgx/KME/e/QGYYh9thjD3HwwQeLxcXFzuO+9a1vCQDi/PPP73xNvht20UUX9XzPI444Qhx55JGjfwii/XGzfm9+85t73q0Swv5HCbZv3y7Wrl0r/vIv/1LU63VxxBFHiCc/+cnL7vYY9M7loF/d7+y99a1vFclkcuDrrl+/XrzqVa8aeWwHHXSQeP7zn7/s6/JduSuuuEIIIcR1110nAIjbbrtt2WNPOeUUsXHjxnE/BiKKEc5rnNeGqVQqIpvNive97309X3/HO94hcrlcz8ckOa8RUVRwXuO8puqBBx4Qa9asEX/5l3/Z89+BynwGQHzxi1/sOY799ttv2WvUajUBQLz//e8feSy5XE684Q1vWPZ1+emDG264QQghxEc/+tGeTw10O+qoo8SznvUs1b8++YC7flPgWq0Wrr/+erz4xS9e9g4GAGia1vP7008/HclksvP7m266CYZh4Oyzz+55p+T000/HzMwMvv3tbwMA1qxZAwD47ne/i927dw88FvlO1Te+8Q20Wi3lv4PK86677joccMAB2LJlC4rFYufX85//fADALbfcAgC4/vrr0Wq1cP755y9756f/Z6Hi5z//OR5//HG85S1vQTab7Xz9pJNOwpYtWzo/n25nnnlmz++f85zn4A9/+MPY11q1alXn/8/Pz6NYLOI5z3kOdu/ejfvuu8/2sUsbN27EZZddhhtvvBHPec5zcPfdd+MLX/jCsrs9rr76atx4441jf5122mmd5ywuLva8A9wtm81icXFx5LEtLi523vHrf6788+7/HfbYca9DRPHBeY3z2ihr1qzBS17yEnzlK1+BEAJA++6Ya6+9FieffDJyuVznsZzXiCgKOK9xXlNVq9Xw0pe+FIVCAV/5yld6/jtQmc9uvPFGbNu2rfMc1TlpGM5pKwM/+k2B27lzJ6rVas/Hn0bZd999e37/pz/9CQDw9Kc/vefr6XQa++23X+fP9913X5xzzjn4xCc+gauvvhrPec5z8Dd/8zf4u7/7u86k+MpXvhL//u//jje96U14//vfjxe84AV42ctehle84hXLJqFuKs974IEHcO+992L9+vUDv8fjjz8OAPj973+PRCKBAw88UOnnMc6wnw8AbNmyBT/60Y96vpbNZpcdY6FQQLlcHvta99xzD8477zx8//vfR7Va7fmzubk5u4fe41WvehW+/OUv49vf/jbOOOMMvOAFL1j2mL/4i7+w/X1XrVoFwzAG/tnS0lLPZD7s+fV6feBz5Z93/++wx457HSKKD85rbZzXhjvttNNw7bXX4oc//CGe+9zn4qabbsJjjz2G1772tT2P47xGRFHAea2N89p4p59+On7/+9/jJz/5CWZnZ3v+rP/j4SpU5yS3z+ecFm0sKiny3AwSH//4x/H3f//3+MY3voHvfe97eMc73oGLL74Y//u//4s999wTq1atwm233YZbbrkF3/72t3HDDTfg2muvxfOf/3x873vf63lHqP+Yxj2v1WrhkEMOwSc+8YmB32OvvfZy/Pfy0rC/4ziVSgXHH388ZmZmcNFFF2H//fdHNpvFnXfeife973223vEcpFQq4ec//zkA4De/+Q1ardayf4zs3LlTaS2vqampzjormzZtQrPZxOOPP96zhophGCiVSti8efPI77Vp0yY88sgjy76+fft2AOg8f9OmTT1f73/suNchopWL85q/ojivbdu2DRs2bMCXv/xlPPe5z8WXv/xlbNy4cdlFHOc1Ioojzmv+iuK8BgD/9m//hq985Sv48pe/jMMPP3zZn+/YsUPp+6xZs6bz39CmTZtwyy23QAjRc7dq/5w0zKZNm4bOU93P757T+nPevn17Z01MCgc/+k2BW79+PWZmZvDrX//a0fP33ntvAMBvf/vbnq8bhoEHH3yw8+fSIYccgvPOOw+33XYbfvjDH+KRRx7BFVdc0fnzRCKBF7zgBfjEJz6B3/zmN/jQhz6E73//+51b/YcZ97z9998fu3btwgte8AJs3bp12S/5Dtr++++PVquF3/zmNyNfT/VjBcN+PvJr/T8fp2699VaUSiVcddVVeOc734m//uu/xtatW1EoFJY91slHIt761rdifn4eF198MX70ox/h0ksvXfaYo446Cps2bRr762Mf+1jnOXISlSWo9POf/xytVmvgJNvt8MMPx/3337/sHck77rij5/sffPDB0HV92esYhoG777577OsQUXxwXuO8Nk4ymcRrXvMafPWrX0W5XMb111+PV7/61csuPjmvEVEUcF7jvDbOD3/4Q/zDP/wDzj77bJx66qkDH6Myn23atAnXXntt5zmHH344du/ejXvvvbfne/XPScMcfvjhuPPOO5eVsHfccQdWr16Npz3taT3fp39Oe/TRR/Hwww9zTgsZi0oKXCKRwMknn4z//u//XjYwAOis3zTM1q1bkU6n8clPfrLnsZ///OcxNzeHk046CQBQrVZhmmbPcw855BAkEonOLd67du1a9v3loDToNnBJ5Xl/+7d/i0ceeQSf+9znlj12cXGxsyPeySefjEQigYsuumjZgNr998vlcqhUKkOPSXrmM5+JPfbYA1dccUXP3+F//ud/cO+993Z+Pm7Ji6vuYzQMA5/5zGeWPTaXy9n6aMFXv/pVXHvttfjXf/1XvP/978erXvUqnHfeebj//vt7HudkLa/nP//5WLt2LS6//PKe73X55Zdj9erVPT+fYrGI++67r2fNnFe84hVoNpu48sorO1+r1+v44he/iGOOOabzjtyaNWuwdetWfPnLX8b8/HznsV/60pewsLCAU045RfnnQUTRxnmN85qK1772tSiXy3jzm9+MhYWFgTtxc14joijgvMZ5bZTt27fjb//2b/HsZz+7s3P4IE7WqHzJS16CVCrVc4xCCFxxxRV40pOehOOOO67nOO677z40Go3O117xilfgsccew9e+9rXO14rFIq677jq8+MUv7qxJedBBB2HLli248sorez7JcPnll0PTNLziFa9Q+lmQT0LYwIdIPPzww2Ljxo1i9erV4uyzzxaf/exnxQc/+EFx0EEHiXK5LISwdpEbtNPcBRdcIACIF77wheLTn/60ePvb3y6SyaQ46qijhGEYQgghvv71r4snPelJ4uyzzxaf+cxnxCc/+Ulx1FFHiVQqJW6//XYhhBDvfOc7xRFHHCHOO+888bnPfU586EMfEk960pPEnnvuKSqVytDjV3les9kUJ554otA0TbzqVa8Sn/rUp8Sll14qzjzzTLF27dqev9c//uM/CgDiuOOOEx/72MfEpz71KXHaaaf17Gr2lre8RWiaJv7pn/5JfOUrXxE333yzEGL5LnLdP7tjjjlGXHrppeLcc88Vq1evFvvss0/n5ytEexe5XC439Oc7SrFYFIVCQey9997i4x//uPjEJz4hjjjiCHHYYYctO56PfOQjAoB417veJa655hrxzW9+c+j3feyxx8S6devECSec0NlFr1gsig0bNohjjz122U57Tlx22WUCgHjFK14hPve5z4nTTjtNABAf+tCHeh4nfw7dfxch2rub6rou3vOe94jPfvaz4rjjjhO6rosf/OAHPY/7xS9+ITKZjDjiiCPE5ZdfLj7wgQ+IbDYrXvjCF7r+OxBRtHBe47ym4uCDDxYAxAEHHKD0eFWc14jIa5zXOK8N84pXvEIkk0nxiU98QnzpS1/q+fXLX/5y5DGpeM973iMAiDPOOEN87nOfEyeddJIAIK6++uqex8kd0R988MHO10zTFM961rPE1NSUuPDCC8Vll10mDjroIDE9PS3uu+++nuf/93//t9A0TTz/+c8XV155pXjHO94hEomEOP30013/HcgdFpUUmj/96U/itNNOE+vXrxeZTEbst99+4q1vfauo1+tCiNETnxBCfPrTnxZbtmwRqVRKbNiwQZx11lk9g/of/vAH8YY3vEHsv//+IpvNirVr14oTTjhB3HTTTZ3H3HzzzeIlL3mJ2Lx5s0in02Lz5s3i1a9+tbj//vtHHrvq8wzDEB/+8IfFQQcdJDKZjCgUCuLII48UF154oZibm+t57Be+8AVxxBFHdB53/PHHixtvvLHz5zt27BAnnXSSmJ6eFgDE8ccfL4QYPPEJIcS1117b+X5r164Vp556qnj44Yd7HuNm4hNCiB//+MfiWc96lli1apXYvHmzeO973yu++93vLjuehYUF8ZrXvEbk83kBQOy9995Dv+fLXvYyMT09Lf74xz/2fP0b3/iGACA+/OEPjz0uFVdeeaV4+tOfLtLptNh///3FJZdc0ilGpWEXdIuLi+If/uEfxMaNG0UmkxFHHXWUuOGGGwa+zg9/+ENx3HHHiWw2K9avXy/e+ta3imq16snfgYiihfMa57Vx5IXgv/zLvyg93g7Oa0TkNc5rnNcGOf744wWAgb8uuOCCscc0TrPZFP/yL/8i9t57b5FOp8VBBx0kvvzlLy973KCiUgghdu3aJd74xjeK2dlZsXr1anH88ccP/W/061//ujj88MNFJpMRe+65pzjvvPM6RTqFRxNizH3bRERERETk2r/927/hXe96F/74xz/iyU9+ctiHQ0RERBQ5LCqJiIiIiHwmhMBhhx2G2dnZsRtAEBEREU0qPewDICIiIiJaqWq1Gr75zW/illtuwa9+9St84xvfCPuQiIiIiCKLd1QSEREREfnkj3/8I/bdd1/k83m85S1vwYc+9KGwD4mIiIgoslhUEhERERERERERUegSYR8AEREREREREREREYtKIiIiIiIiIiIiCh030xmj1Wrh0UcfxfT0NDRNC/twiIhoBCEE5ufnsXnzZiQSfC9uEM5rRETxwDltPM5pRETxoTqvsagc49FHH8Vee+0V9mEQEZENf/7zn7HnnnuGfRiRxHmNiCheOKcNxzmNiCh+xs1rLCrHmJ6eBgC8973vxapVq3x7nWazCdM0AQC6riOZTC57jNz3aN26dUilUp4fgxACO3fuBABkMhmsWbPG89dQMTc3h3q9DgBYv359KO+OGoaBSqUCAMjn80in04EfA/OwMA9L1PKYmprC3NwcAAR6LEIIGIbReV3538Ti4iI+8pGPdMZuWs6PeW1YHirPA7yb16J2fnC8Yh4A8+gWhzwajQaKxSIAf+c1wzA6Y2A6nR74WpzTxvNqTlPJYxy3c1oczo+g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/O9nPP6M1PDnNB5/Rmr4cyKn+N+OGv6c1PDnNB5/Rmri+HPiZjpEREREREREREQUOt5RSURERERERERERKFjUUlEREREREREREShY1FJREREREREREREoWNRSURERERERERERKFjURlxH/rQh3Dcccdh9erVyOfzSs8RQuD888/Hpk2bsGrVKmzduhUPPPCAvwcaol27duHUU0/FzMwM8vk83vjGN2JhYWHkc573vOdB07SeX2eeeWZARxyMyy67DPvssw+y2SyOOeYY/PSnPx35+Ouuuw5btmxBNpvFIYccgu985zsBHWm47PycrrrqqmX/3WSz2QCPNni33XYbXvziF2Pz5s3QNA3XX3/92OfceuuteMYznoFMJoOnPOUpuOqqq3w/TooPzmvjcV4bjPPaeJzTxuO8Rl7inKaG89pynNPUcF4bbaXOaSwqI84wDJxyyik466yzlJ/zkY98BJ/85CdxxRVX4I477kAul8O2bduwtLTk45GG59RTT8U999yDG2+8Ed/61rdw22234Ywzzhj7vNNPPx3bt2/v/PrIRz4SwNEG49prr8U555yDCy64AHfeeScOO+wwbNu2DY8//vjAx//kJz/Bq1/9arzxjW/EXXfdhZNPPhknn3wyfv3rXwd85MGy+3MCgJmZmZ7/bv70pz8FeMTBq9VqOOyww3DZZZcpPf7BBx/ESSedhBNOOAF33303zj77bLzpTW/Cd7/7XZ+PlOKC89p4nNeW47w2Huc0NZzXyEuc09RwXuvFOU0N57XxVuycJigWvvjFL4o1a9aMfVyr1RIbN24UH/3oRztfq1QqIpPJiK985Ss+HmE4fvOb3wgA4mc/+1nna//zP/8jNE0TjzzyyNDnHX/88eKd73xnAEcYjqOPPlq89a1v7fy+2WyKzZs3i4svvnjg4//2b/9WnHTSST1fO+aYY8Sb3/xmX48zbHZ/Tqrn4UoFQHz9618f+Zj3vve94qCDDur52itf+Uqxbds2H4+M4ojz2mCc1wbjvDYe5zT7OK+RVzinDcd5bTnOaWo4r9mzkuY03lG5wjz44IPYsWMHtm7d2vnamjVrcMwxx+D2228P8cj8cfvttyOfz+OZz3xm52tbt25FIpHAHXfcMfK5V199NdatW4eDDz4Y5557Lnbv3u334QbCMAz84v9v7/5Cqr7/OI6/KjvWEIuWespa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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# starting set of input parameters\n", "center0 = (0., 0., 0.)\n", "size0 = (0.5, 1.0, 1.0)\n", "eps0 = 3.0\n", "\n", "jax_sim = make_simulation(center=center0, size=size0, eps=eps0)\n", "_, axes = plt.subplots(1, 3, figsize=(16, 5))\n", "\n", "# sim, _ = jax_sim.to_simulation()\n", "for ax, dim in zip(axes, 'xyz'):\n", " jax_sim.plot(**{dim:0}, ax=ax)\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "a390df41-e293-4dbf-83e0-f5dff8e700cc", "metadata": {}, "source": [ "### Post-processing the output data\n", "\n", "After the simulation is run, it returns a [JaxSimulation](https://docs.flexcompute.com/projects/tidy3d/en/v1.9.0rc2/_autosummary/tidy3d.plugins.adjoint.JaxSimulation.html), which is a jax-compatible subclass of `SimulationData`. In addition to the `.data` corresponding to the `.monitors` in the `JaxSimulation`, `JaxSimulationData` also stores a `.output_data`, which stores the data corresponding to `JaxSimulation.output_monitors`. It is the `.output_data` that our differentiable function should depend on. These output data objects are also `Jax` subclasses of `Tidy3d` data objects, so their functionality may be slightly different, but overall can be used in the same way.\n", "\n", "> Note: currently only `.sel()` selection is supported in jax-compatible DataArray objects. So you should use `.sel()` and pass the values you want to select instead of using `.interp()` or `isel()` \n", "\n", "Let's write a function that will postprocess our `JaxSimulationData` and return the power in the mode amplitude of our output mode monitor." ] }, { "cell_type": "code", "execution_count": 12, "id": "5d5c14b9-cb22-4ced-aad8-834b29c5800b", "metadata": {}, "outputs": [], "source": [ "from tidy3d.plugins.adjoint import JaxSimulationData\n", "\n", "def compute_power(jax_sim_data: JaxSimulationData) -> float:\n", " \"\"\"Post process the result of the JaxSimulation run to return the power in the mode at index=0.\"\"\"\n", "\n", " freq0 = jax_sim_data.simulation.output_monitors[0].freqs[0]\n", " jax_mode_data = jax_sim_data.output_monitor_data['mode']\n", " mode_amps = jax_mode_data.amps\n", " amp = mode_amps.sel(direction=\"+\", f=freq0, mode_index=0)\n", " return abs(amp)**2" ] }, { "cell_type": "markdown", "id": "a49d64c6-7591-4b8b-bfa3-d09c1501d4b0", "metadata": {}, "source": [ "### Defining the tidy3d simulation function for differentiation\n", "\n", "Next, we can import the `tidy3d.plugins.adjoint.web.run` function and put all the pieces together into a single function to compute the 0th order transmitted power as a function of `center`,`size`, and `eps` (relative permittivty) of the scatterer." ] }, { "cell_type": "code", "execution_count": 13, "id": "7257472c-5db1-4b93-8cdb-24b3cc32775d", "metadata": { "tags": [] }, "outputs": [], "source": [ "from tidy3d.plugins.adjoint.web import run as run_adjoint" ] }, { "cell_type": "code", "execution_count": 14, "id": "946493e2-b10a-4824-aef0-2e8f1ec113f1", "metadata": {}, "outputs": [], "source": [ "def power(center: float, size: float, eps: float) -> float:\n", " \"\"\"Compute power transmitted into 0th order mode given a set of scatterer parameters.\"\"\"\n", " jax_sim = make_simulation(center=center, size=size, eps=eps)\n", " jax_sim_data = run_adjoint(jax_sim, task_name='adjoint_power')\n", " return compute_power(jax_sim_data)" ] }, { "cell_type": "markdown", "id": "90ee44c1-38a6-4dba-add5-9b36c43454cb", "metadata": {}, "source": [ "### Running and differentiating the simulation using `jax`\n", "\n", "Finally, using the `jax` tools described earlier, we can differentiate this `power` function. \n", "\n", "For demonstration, let's use `jax.value_and_grad` to both compute the power **and** the gradient w.r.t. each of the 3 input parameters." ] }, { "cell_type": "code", "execution_count": 15, "id": "8a6518dd-c5a9-4826-95f6-7a0ed90e2f9a", "metadata": {}, "outputs": [], "source": [ "d_power = jax.value_and_grad(power, argnums=(0,1,2))" ] }, { "cell_type": "markdown", "id": "6f787405-1c6e-40b1-81d2-1a64d667e009", "metadata": {}, "source": [ "We will run this function and assign variables to the power values and the gradients returned.\n", "\n", "Note that running this will set off **two** separate tasks, one after another, called, `\"adjoint_power_fwd\"` and `\"adjoint_power_adj\"`.\n", "\n", "The first is evaluating our simulation in \"forward mode\", computing the power and stashing information needed for gradient computation.\n", "\n", "The second step runs the \"adjoint\" simulation, in which the output monitor is converted to a source and the simulation is re-run.\n", "\n", "The results of both of these simulations runs are combined behind the scene to tell jax how to compute the gradient for us." ] }, { "cell_type": "code", "execution_count": 16, "id": "68f34dce-3504-4dba-8012-436c4ff21ecc", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:rich:Created task 'adjoint_power_fwd' with task_id '4cfe1713-135e-49bd-9c7c-bf17b6a14449'.\n" ] }, { "data": { "text/html": [ "
\n"
      ],
      "text/plain": [
       "\u001b[?25l"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "0cd894bd15fa4a4b8f8f46f1d9549da1",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "
\n",
       "
\n" ], "text/plain": [ "\n", "\u001b[?25h" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:rich:Maximum FlexUnit cost: 0.025\n", "INFO:rich:status = queued\n" ] }, { "data": { "text/html": [ "
\n"
      ],
      "text/plain": [
       "\u001b[?25l"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:rich:status = preprocess\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "
\n",
       "
\n" ], "text/plain": [ "\n", "\u001b[?25h\r", "\u001b[1A\u001b[2K" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:rich:starting up solver\n", "INFO:rich:running solver\n" ] }, { "data": { "text/html": [ "
\n"
      ],
      "text/plain": [
       "\u001b[?25l"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "fc99eda7e53c4e91b9b58049d2495723",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:rich:early shutoff detected, exiting.\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "
\n",
       "
\n" ], "text/plain": [ "\n", "\u001b[?25h" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:rich:status = postprocess\n" ] }, { "data": { "text/html": [ "
\n"
      ],
      "text/plain": [
       "\u001b[?25l"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:rich:status = success\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "
\n",
       "
\n" ], "text/plain": [ "\n", "\u001b[?25h\r", "\u001b[1A\u001b[2K" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:rich:Billed FlexUnit cost: 0.025\n", "INFO:rich:downloading file \"output/monitor_data.hdf5\" to \"simulation_data.hdf5\"\n" ] }, { "data": { "text/html": [ "
\n"
      ],
      "text/plain": [
       "\u001b[?25l"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "5b29d3a7b5cc48bfaa7cb82960a5b6b1",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "
\n",
       "
\n" ], "text/plain": [ "\n", "\u001b[?25h" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:rich:loading SimulationData from simulation_data.hdf5\n", "INFO:rich:Created task 'adjoint_power_adj' with task_id '6c4355a2-ed73-4bd2-a43d-b3f04da12004'.\n" ] }, { "data": { "text/html": [ "
\n"
      ],
      "text/plain": [
       "\u001b[?25l"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "4d4ef8d0eb3a4925847ef8caa2029846",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "
\n",
       "
\n" ], "text/plain": [ "\n", "\u001b[?25h" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:rich:status = queued\n" ] }, { "data": { "text/html": [ "
\n"
      ],
      "text/plain": [
       "\u001b[?25l"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:rich:Maximum FlexUnit cost: 0.025\n",
      "INFO:rich:status = preprocess\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "
\n",
       "
\n" ], "text/plain": [ "\n", "\u001b[?25h\r", "\u001b[1A\u001b[2K" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:rich:starting up solver\n", "INFO:rich:running solver\n" ] }, { "data": { "text/html": [ "
\n"
      ],
      "text/plain": [
       "\u001b[?25l"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "0476bbc074d1430a9dcb904f2f2f70a7",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:rich:early shutoff detected, exiting.\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "
\n",
       "
\n" ], "text/plain": [ "\n", "\u001b[?25h" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:rich:status = postprocess\n" ] }, { "data": { "text/html": [ "
\n"
      ],
      "text/plain": [
       "\u001b[?25l"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:rich:status = success\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "
\n",
       "
\n" ], "text/plain": [ "\n", "\u001b[?25h\r", "\u001b[1A\u001b[2K" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:rich:Billed FlexUnit cost: 0.025\n", "INFO:rich:downloading file \"output/monitor_data.hdf5\" to \"simulation_data.hdf5\"\n" ] }, { "data": { "text/html": [ "
\n"
      ],
      "text/plain": [
       "\u001b[?25l"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "6b8c24eb82aa4e1a8ae00ff126e95067",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Output()"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "
\n",
       "
\n" ], "text/plain": [ "\n", "\u001b[?25h" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:rich:loading SimulationData from simulation_data.hdf5\n" ] } ], "source": [ "power_value, (dp_center, dp_dsize, dp_deps) = d_power(center0, size0, eps0)" ] }, { "cell_type": "markdown", "id": "0ac63a75-89de-42c5-929d-f46da6f22864", "metadata": {}, "source": [ "> Note: the gradient evaluation functions returned by `jax.grad()` do not accept keyword arguments (ie. `center=(0.,0.,0.)`) and instead accept positional arguments (without the argument name). You may run across this when trying to evaluate gradients so it's a good idea to keep in mind.\n", "\n", "We can take a look at our computed power and gradient information. " ] }, { "cell_type": "code", "execution_count": 17, "id": "f0a786d2-88c7-406a-a6cd-956e6cfb904c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "power = 0.548\n", "d_power/d_center = (-0.006544657051563263, -0.019715994596481323, 0.03331965208053589)\n", "d_power/d_size = (-0.024730555713176727, 0.13145549595355988, -0.14747855067253113)\n", "d_power/d_eps = -0.1650194227695465\n" ] } ], "source": [ "print(f\"power = {power_value:.3f}\")\n", "print(f\"d_power/d_center = {dp_center}\")\n", "print(f\"d_power/d_size = {dp_dsize}\")\n", "print(f\"d_power/d_eps = {dp_deps}\")" ] }, { "cell_type": "markdown", "id": "a20619d4-d14b-431f-b543-7f0f0bc2907a", "metadata": {}, "source": [ "From this, we can infer several things that fit our intuition, for example that:\n", "* the transmitted power should **decrease** if we increase the permittivity of our scatterer.\n", "* the transmitted power does not depend strongly on the position of the scatterer along the propagation direction.\n", "\n", "## Conclusion & Next Steps\n", "\n", "This gives the most basic introduction to the principles behind the adjoint plugin.\n", "\n", "In subsequent notebooks, we will show how to:\n", " * Check the gradients returned by this method against brute force computed gradients for accuracy.\n", " * Perform gradient-based optimization using the adjoint plugin." ] }, { "cell_type": "code", "execution_count": null, "id": "07afec21-48ce-444c-a0a8-4d8251f1caee", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.9" }, "vscode": { "interpreter": { "hash": "9e43a20ef2440406ea6cbfb61ead7c471aba2de37f508addf1f0635fad81ef64" } }, "widgets": { "application/vnd.jupyter.widget-state+json": { "state": { "018d413e05d34ed5bfa115f4d97f041e": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "050a32e248bf44eba2824506c442e89b": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "199ecf663ac8479790c9493ced1e11eb": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "1e1cdf818596485ba1f61b4d324282b6": { "model_module": "@jupyter-widgets/output", "model_module_version": "1.0.0", "model_name": "OutputModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/output", "_model_module_version": "1.0.0", "_model_name": "OutputModel", "_view_count": null, "_view_module": "@jupyter-widgets/output", "_view_module_version": "1.0.0", "_view_name": "OutputView", "layout": "IPY_MODEL_7e05c33b14a0490ba860f495bc130542", "msg_id": "", "outputs": [ { "data": { "text/html": "
🏃  Starting 'adjoint_power_fwd'...\n🏃  Starting 'adjoint_power_fwd'...
\n", "text/plain": "\r\u001b[2K\u001b[32m🏃 \u001b[0m \u001b[1;32mStarting 'adjoint_power_fwd'...\u001b[0m\n\u001b[32m🏃 \u001b[0m \u001b[1;32mStarting 'adjoint_power_fwd'...\u001b[0m" }, "metadata": {}, "output_type": "display_data" } ], "tabbable": null, "tooltip": null } }, "1f193330d96e4a5f81b8e1218ccd6211": { "model_module": "@jupyter-widgets/output", "model_module_version": "1.0.0", "model_name": "OutputModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/output", "_model_module_version": "1.0.0", "_model_name": "OutputModel", "_view_count": null, "_view_module": "@jupyter-widgets/output", "_view_module_version": "1.0.0", "_view_name": "OutputView", "layout": "IPY_MODEL_b6b771ea0ee94a78be2a60a1a7b75cfe", "msg_id": "", "outputs": [ { "data": { "text/html": "
% done (field decay = 1.19e-07) ━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━   8% -:--:--\n% done (field decay = 1.19e-07) ━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━   8% -:--:--
\n", "text/plain": "\r\u001b[2K% done (field decay = 1.19e-07) \u001b[38;2;249;38;114m━━━\u001b[0m\u001b[38;5;237m╺\u001b[0m\u001b[38;5;237m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[35m 8%\u001b[0m \u001b[36m-:--:--\u001b[0m\n% done (field decay = 1.19e-07) \u001b[38;2;249;38;114m━━━\u001b[0m\u001b[38;5;237m╺\u001b[0m\u001b[38;5;237m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[35m 8%\u001b[0m \u001b[36m-:--:--\u001b[0m" }, "metadata": {}, "output_type": "display_data" } ], "tabbable": null, "tooltip": null } }, "236b38d6b2524ed99c02e5381428ddca": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "2c9593da2cfc40c9ba46c0e842984451": { "model_module": "@jupyter-widgets/output", "model_module_version": "1.0.0", "model_name": "OutputModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/output", "_model_module_version": "1.0.0", "_model_name": "OutputModel", "_view_count": null, "_view_module": "@jupyter-widgets/output", "_view_module_version": "1.0.0", "_view_name": "OutputView", "layout": "IPY_MODEL_68b3f499ede04275adcef568d44b7a0b", "msg_id": "", "outputs": [ { "data": { "text/html": "
🏃  Finishing 'adjoint_power_fwd'...\n🏃  Finishing 'adjoint_power_fwd'...
\n", "text/plain": "\r\u001b[2K\u001b[32m🏃 \u001b[0m \u001b[1;32mFinishing 'adjoint_power_fwd'...\u001b[0m\n\u001b[32m🏃 \u001b[0m \u001b[1;32mFinishing 'adjoint_power_fwd'...\u001b[0m" }, "metadata": {}, "output_type": "display_data" } ], "tabbable": null, "tooltip": null } }, "474acde103184fcebc9e791901277b57": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "5a3bf557922e4b7893882dd42c3f778e": { "model_module": "@jupyter-widgets/output", "model_module_version": "1.0.0", "model_name": "OutputModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/output", "_model_module_version": "1.0.0", "_model_name": "OutputModel", "_view_count": null, "_view_module": "@jupyter-widgets/output", "_view_module_version": "1.0.0", "_view_name": "OutputView", "layout": "IPY_MODEL_199ecf663ac8479790c9493ced1e11eb", "msg_id": "", "outputs": [ { "data": { "text/html": "
 simulation.json ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0.0%0.0/3.9 kB?-:--:--\n simulation.json ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0.0%0.0/3.9 kB?-:--:--
\n", "text/plain": "\r\u001b[2K\u001b[1;31m↑\u001b[0m \u001b[1;34msimulation.json\u001b[0m \u001b[38;5;237m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[35m0.0%\u001b[0m • \u001b[32m0.0/3.9 kB\u001b[0m • \u001b[31m?\u001b[0m • \u001b[36m-:--:--\u001b[0m\n\u001b[1;31m↑\u001b[0m \u001b[1;34msimulation.json\u001b[0m \u001b[38;5;237m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[35m0.0%\u001b[0m • \u001b[32m0.0/3.9 kB\u001b[0m • \u001b[31m?\u001b[0m • \u001b[36m-:--:--\u001b[0m" }, "metadata": {}, "output_type": "display_data" } ], "tabbable": null, "tooltip": null } }, "5fa48dc1e3064c0ab7c5b17bf52a1682": { "model_module": "@jupyter-widgets/output", "model_module_version": "1.0.0", "model_name": "OutputModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/output", "_model_module_version": "1.0.0", "_model_name": "OutputModel", "_view_count": null, "_view_module": "@jupyter-widgets/output", "_view_module_version": "1.0.0", "_view_name": "OutputView", "layout": "IPY_MODEL_018d413e05d34ed5bfa115f4d97f041e", "msg_id": "", "outputs": [ { "data": { "text/html": "
 monitor_data.hdf5 ━━━━━━━━━━━━━━━━━━━━━━━━━━━╺━━━━━━━━━━━━ 68.6%2.6/3.8 MB5.5 MB/s0:00:01\n monitor_data.hdf5 ━━━━━━━━━━━━━━━━━━━━━━━━━━━╺━━━━━━━━━━━━ 68.6%2.6/3.8 MB5.5 MB/s0:00:01
\n", "text/plain": "\r\u001b[2K\u001b[1;32m↓\u001b[0m \u001b[1;34mmonitor_data.hdf5\u001b[0m \u001b[38;2;249;38;114m━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[38;5;237m╺\u001b[0m\u001b[38;5;237m━━━━━━━━━━━━\u001b[0m \u001b[35m68.6%\u001b[0m • \u001b[32m2.6/3.8 MB\u001b[0m • \u001b[31m5.5 MB/s\u001b[0m • \u001b[36m0:00:01\u001b[0m\n\u001b[1;32m↓\u001b[0m \u001b[1;34mmonitor_data.hdf5\u001b[0m \u001b[38;2;249;38;114m━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[38;5;237m╺\u001b[0m\u001b[38;5;237m━━━━━━━━━━━━\u001b[0m \u001b[35m68.6%\u001b[0m • \u001b[32m2.6/3.8 MB\u001b[0m • \u001b[31m5.5 MB/s\u001b[0m • \u001b[36m0:00:01\u001b[0m" }, "metadata": {}, "output_type": "display_data" } ], "tabbable": null, "tooltip": null } }, "64b3c915833540128d10d08db0ca98ee": { "model_module": "@jupyter-widgets/output", "model_module_version": "1.0.0", "model_name": "OutputModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/output", "_model_module_version": "1.0.0", "_model_name": "OutputModel", "_view_count": null, "_view_module": "@jupyter-widgets/output", "_view_module_version": "1.0.0", "_view_name": "OutputView", "layout": "IPY_MODEL_050a32e248bf44eba2824506c442e89b", "msg_id": "", "outputs": [ { "data": { "text/html": "
% done (field decay = 1.65e-07) ━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━   8% -:--:--\n% done (field decay = 1.65e-07) ━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━   8% -:--:--
\n", "text/plain": "\r\u001b[2K% done (field decay = 1.65e-07) \u001b[38;2;249;38;114m━━━\u001b[0m\u001b[38;5;237m╺\u001b[0m\u001b[38;5;237m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[35m 8%\u001b[0m \u001b[36m-:--:--\u001b[0m\n% done (field decay = 1.65e-07) \u001b[38;2;249;38;114m━━━\u001b[0m\u001b[38;5;237m╺\u001b[0m\u001b[38;5;237m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[35m 8%\u001b[0m \u001b[36m-:--:--\u001b[0m" }, "metadata": {}, "output_type": "display_data" } ], "tabbable": null, "tooltip": null } }, "68b3f499ede04275adcef568d44b7a0b": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "748042aff2524e7dbb0f9461a9bb9929": { "model_module": "@jupyter-widgets/output", "model_module_version": "1.0.0", "model_name": "OutputModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/output", "_model_module_version": "1.0.0", "_model_name": "OutputModel", "_view_count": null, "_view_module": "@jupyter-widgets/output", "_view_module_version": "1.0.0", "_view_name": "OutputView", "layout": "IPY_MODEL_a9a5e7153c8546cebc0966c249d74130", "msg_id": "", "outputs": [ { "data": { "text/html": "
 simulation.json ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0.0%0.0/4.3 kB?-:--:--\n simulation.json ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0.0%0.0/4.3 kB?-:--:--
\n", "text/plain": "\r\u001b[2K\u001b[1;31m↑\u001b[0m \u001b[1;34msimulation.json\u001b[0m \u001b[38;5;237m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[35m0.0%\u001b[0m • \u001b[32m0.0/4.3 kB\u001b[0m • \u001b[31m?\u001b[0m • \u001b[36m-:--:--\u001b[0m\n\u001b[1;31m↑\u001b[0m \u001b[1;34msimulation.json\u001b[0m \u001b[38;5;237m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[35m0.0%\u001b[0m • \u001b[32m0.0/4.3 kB\u001b[0m • \u001b[31m?\u001b[0m • \u001b[36m-:--:--\u001b[0m" }, "metadata": {}, "output_type": "display_data" } ], "tabbable": null, "tooltip": null } }, "7e05c33b14a0490ba860f495bc130542": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "a631083bd16b4b1d8f890505dddc9284": { "model_module": "@jupyter-widgets/output", "model_module_version": "1.0.0", "model_name": "OutputModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/output", "_model_module_version": "1.0.0", "_model_name": "OutputModel", "_view_count": null, "_view_module": "@jupyter-widgets/output", "_view_module_version": "1.0.0", "_view_name": "OutputView", "layout": "IPY_MODEL_c83cd538ef5c44dc8266ea2277a34ab3", "msg_id": "", "outputs": [ { "data": { "text/html": "
 monitor_data.hdf5 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╺━━━━━━━━━ 75.6%2.9/3.8 MB5.0 MB/s0:00:01\n monitor_data.hdf5 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╺━━━━━━━━━ 75.6%2.9/3.8 MB5.0 MB/s0:00:01
\n", "text/plain": "\r\u001b[2K\u001b[1;32m↓\u001b[0m \u001b[1;34mmonitor_data.hdf5\u001b[0m \u001b[38;2;249;38;114m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[38;5;237m╺\u001b[0m\u001b[38;5;237m━━━━━━━━━\u001b[0m \u001b[35m75.6%\u001b[0m • \u001b[32m2.9/3.8 MB\u001b[0m • \u001b[31m5.0 MB/s\u001b[0m • \u001b[36m0:00:01\u001b[0m\n\u001b[1;32m↓\u001b[0m \u001b[1;34mmonitor_data.hdf5\u001b[0m \u001b[38;2;249;38;114m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[38;5;237m╺\u001b[0m\u001b[38;5;237m━━━━━━━━━\u001b[0m \u001b[35m75.6%\u001b[0m • \u001b[32m2.9/3.8 MB\u001b[0m • \u001b[31m5.0 MB/s\u001b[0m • \u001b[36m0:00:01\u001b[0m" }, "metadata": {}, "output_type": "display_data" } ], "tabbable": null, "tooltip": null } }, "a9a5e7153c8546cebc0966c249d74130": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "b6b771ea0ee94a78be2a60a1a7b75cfe": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "c83cd538ef5c44dc8266ea2277a34ab3": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "e28c7c8603bc491c9c3f9f4e0ef54f14": { "model_module": "@jupyter-widgets/output", "model_module_version": "1.0.0", "model_name": "OutputModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/output", "_model_module_version": "1.0.0", "_model_name": "OutputModel", "_view_count": null, "_view_module": "@jupyter-widgets/output", "_view_module_version": "1.0.0", "_view_name": "OutputView", "layout": "IPY_MODEL_474acde103184fcebc9e791901277b57", "msg_id": "", "outputs": [ { "data": { "text/html": "
🏃  Finishing 'adjoint_power_adj'...\n🏃  Finishing 'adjoint_power_adj'...
\n", "text/plain": "\r\u001b[2K\u001b[32m🏃 \u001b[0m \u001b[1;32mFinishing 'adjoint_power_adj'...\u001b[0m\n\u001b[32m🏃 \u001b[0m \u001b[1;32mFinishing 'adjoint_power_adj'...\u001b[0m" }, "metadata": {}, "output_type": "display_data" } ], "tabbable": null, "tooltip": null } }, "fe35410f3c4e45768ce3ecc321a5beac": { "model_module": "@jupyter-widgets/output", "model_module_version": "1.0.0", "model_name": "OutputModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/output", "_model_module_version": "1.0.0", "_model_name": "OutputModel", "_view_count": null, "_view_module": "@jupyter-widgets/output", "_view_module_version": "1.0.0", "_view_name": "OutputView", "layout": "IPY_MODEL_236b38d6b2524ed99c02e5381428ddca", "msg_id": "", "outputs": [ { "data": { "text/html": "
🚶  Starting 'adjoint_power_adj'...\n🚶  Starting 'adjoint_power_adj'...
\n", "text/plain": "\r\u001b[2K\u001b[32m🚶 \u001b[0m \u001b[1;32mStarting 'adjoint_power_adj'...\u001b[0m\n\u001b[32m🚶 \u001b[0m \u001b[1;32mStarting 'adjoint_power_adj'...\u001b[0m" }, "metadata": {}, "output_type": "display_data" } ], "tabbable": null, "tooltip": null } } }, "version_major": 2, "version_minor": 0 } } }, "nbformat": 4, "nbformat_minor": 5 }