{ "cells": [ { "cell_type": "markdown", "id": "df03ca2b-256f-472c-bcaf-e35a529143c6", "metadata": {}, "source": [ "# Adjoint Plugin: 4 Multi-Objective Gradients\n", "\n", "In this notebook, we will show how to use the adjoint plugin efficiently for objectives involving several simulations.\n", "\n", "One common application of this, which we will explore, is objective functions that depend on several frequencies." ] }, { "cell_type": "code", "execution_count": 1, "id": "5accbf7e-221b-46b8-8aa4-b010fde0a816", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import jax.numpy as jnp\n", "import jax\n", "\n", "import tidy3d as td\n", "import tidy3d.plugins.adjoint as tda\n" ] }, { "cell_type": "markdown", "id": "6a908597-1bb4-45ff-8fc9-dca626011d5c", "metadata": {}, "source": [ "### Setup\n", "\n", "First, let's define the frequencies that our objective will depend on" ] }, { "cell_type": "code", "execution_count": 2, "id": "247c3045-6b11-4a86-9bc7-d9ba1a8c173e", "metadata": {}, "outputs": [], "source": [ "freq_min = 1e14\n", "freq_max = 2e14\n", "num_freqs = 2\n", "freqs = np.linspace(freq_min, freq_max, num_freqs)\n", "\n", "wavelength_max = td.C_0 / freq_min\n" ] }, { "cell_type": "markdown", "id": "d96aca0f-a9da-4f8a-833c-5cefe8a3bb7f", "metadata": {}, "source": [ "Now we set up some physical parameters.\n", "\n", "We will be putting a `td.Box` in the center of a domain with a point source on one side and a diffraction monitor on the other.\n", "\n", "The objective will involve summing the power of the 0th order diffraction order over all frequencies defined above.\n", "\n", "The gradient of this objective will be computed with respect to the permittivity of the box." ] }, { "cell_type": "code", "execution_count": 3, "id": "6894b8a3-4889-431f-bb68-f3bd28b73369", "metadata": {}, "outputs": [], "source": [ "permittivity_val = 2.0\n", "\n", "lx = wavelength_max\n", "ly = wavelength_max\n", "lz = wavelength_max\n", "\n", "buffer = 2 * wavelength_max\n", "\n", "Lx = lx + 2 * buffer\n", "Ly = ly + 2 * buffer\n", "Lz = lz + 2 * buffer\n", "\n", "src_pos_x = -Lx / 2 + buffer / 2\n", "mnt_pos_x = +Lx / 2 - buffer / 2\n" ] }, { "cell_type": "code", "execution_count": 4, "id": "7257c894-0eb8-4813-bc86-8d5ee9b4d639", "metadata": {}, "outputs": [], "source": [ "def make_sim(permittivity: float, freq: float) -> tda.JaxSimulation:\n", " \"\"\"Make a simulation as a function of the box permittivity and the frequency.\"\"\"\n", "\n", " box = tda.JaxStructure(\n", " geometry=tda.JaxBox(center=(0.0, 0.0, 0.0), size=(lx, ly, lz)),\n", " medium=tda.JaxMedium(permittivity=permittivity),\n", " )\n", "\n", " src = td.PointDipole(\n", " center=(src_pos_x, 0, 0),\n", " polarization=\"Ey\",\n", " source_time=td.GaussianPulse(\n", " freq0=freq,\n", " fwidth=freq / 10,\n", " ),\n", " )\n", "\n", " mnt = td.DiffractionMonitor(\n", " center=(mnt_pos_x, 0, 0),\n", " size=(0, td.inf, td.inf),\n", " freqs=[freq],\n", " name=\"diffraction\",\n", " )\n", "\n", " return tda.JaxSimulation(\n", " size=(Lx, Ly, Lz),\n", " input_structures=[box],\n", " output_monitors=[mnt],\n", " sources=[src],\n", " grid_spec=td.GridSpec.auto(wavelength=td.C_0 / freq),\n", " boundary_spec=td.BoundarySpec(\n", " x=td.Boundary.pml(), y=td.Boundary.periodic(), z=td.Boundary.periodic()\n", " ),\n", " run_time=5000 / freq,\n", " )\n" ] }, { "cell_type": "markdown", "id": "e11b1338-e831-47f6-85d7-d3abe2aef5d5", "metadata": {}, "source": [ "Let's try it out and make a jax simulation to plot" ] }, { "cell_type": "code", "execution_count": 5, "id": "c03a39c5-83e4-4e0d-84a2-c8bf86446b60", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnYAAAHSCAYAAABhMYacAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy88F64QAAAACXBIWXMAAA9hAAAPYQGoP6dpAABo80lEQVR4nO3de5hT1b038G+G3GBuGYZBhwMiYL2iRUGpeEErr5dildZaa61Va1ERq1ZbK62vKD0Vq1Y9tVVr3xZ91FrFU7VH6wVBvEsVsccrVYvKHRInk5mB3Cbr/YOukGSS7Ev22pm99/fzPHl0MsnODvmF35e991rLJ4QQICIiIiLHa6j3DhARERGRNRjsiIiIiFyCwY6IiIjIJRjsiIiIiFyCwY6IiIjIJRjsiIiIiFyCwY6IiIjIJRjsiIiIiFyCwY6IiIjIJRjsiIhKLF++HD6fD8uXL6/3rhARGcJgR0Sedfvtt+Puu++u926Y8qc//Qm33nprvXcDAJDL5XDDDTdg3LhxCIfDOOCAA/DAAw/ofn48Hsd5552Hjo4ONDY24uijj8abb75Z9rF//etfcdBBByEcDmO33XbD/Pnzkc1mrXorRI7n41qxRORVEydOxIgRIwYcmcvlckin0wgGg2hoGJz//j3xxBPxzjvv4JNPPqn3rmDevHm4/vrrMXv2bBx88MF47LHH8MQTT+CBBx7At771rarPzeVyOOKII/CPf/wDP/7xjzFixAjcfvvtWLt2LVauXIkvfOEL+cc++eSTmDlzJo466iicfvrpePvtt/Hb3/4W5513Hu644w7Vb5PIERjsiDyur68PjY2N9d6NuqgU7JxgsAS79evXY9y4cTjvvPPwm9/8BgAghMD06dOxZs0afPLJJxgyZEjF5z/00EM47bTTsHjxYnzjG98AAGzduhV77rknTjjhBPzpT3/KP3a//fZDIBDAG2+8Ab/fDwC46qqrcN111+G9997D3nvvrfCdEjnD4PynKBGZsn79epx77rkYNWoUQqEQxo0bhzlz5iCdTgMA7r77bvh8Pjz//PO48MILMXLkSIwePTr//Ntvvx377bcfQqEQRo0ahblz5yIejxe9xocffohTTjkFu+66K8LhMEaPHo1vfetb6O7uzj9myZIlOPzwwxGJRNDU1IS99toLP/3pTzX3X8/zUqkU5s+fjz322AOhUAhjxozBFVdcgVQqNWB79913Hw455BAMGzYMbW1tOPLII/HMM88AAHbffXe8++67eP755+Hz+eDz+XDUUUcBqHyN3eLFizF58mQMHToUI0aMwHe+8x2sX7++6DFnn302mpqasH79esyaNQtNTU3o6OjAj370I/T392v+GTz22GOYOXNm/jOcMGECfv7znxc996ijjsITTzyBTz/9NL/vu+++e8Vtnn322fnHld6uueYazX3S2t9MJoMLL7wwf5/P58OcOXOwbt06vPrqq1Wf//DDD2OXXXbB17/+9fx9HR0d+OY3v4nHHnss/7m+9957eO+993DeeeflQx0AXHjhhRBC4OGHH67pfRC5hV/7IUTkBBs2bMAhhxySv15p7733xvr16/Hwww9j27ZtCAaD+cdeeOGF6OjowNVXX42+vj4AwDXXXINrr70WM2bMwJw5c7B69WrccccdeP311/Hyyy8jEAggnU7juOOOQyqVwg9+8APsuuuuWL9+PR5//HHE43G0trbi3XffxYknnogDDjgACxYsQCgUwkcffYSXX3656v7reV4ul8NJJ52El156Ceeddx722WcfvP3227jlllvwz3/+E48++mj+sddeey2uueYaTJs2DQsWLEAwGMSKFSuwbNkyHHvssbj11lvxgx/8AE1NTfjZz34GANhll10q7t/dd9+Nc845BwcffDAWLlyIzZs347/+67/w8ssvY9WqVYhEIvnH9vf347jjjsPUqVNx00034dlnn8WvfvUrTJgwAXPmzKn653D33XejqakJl112GZqamrBs2TJcffXVSCQSuPHGGwEAP/vZz9Dd3Y1169bhlltuAQA0NTVV3Ob555+PGTNmFN331FNP4f7778fIkSPz90Wj0ar7JjU3NyMUCgEAVq1ahcbGRuyzzz5FjznkkEPyvz/88MMrbmvVqlU46KCDBpzyPuSQQ3DXXXfhn//8J/bff3+sWrUKADBlypSix40aNQqjR4/O/57I8wQRucJ3v/td0dDQIF5//fUBv8vlckIIIRYtWiQAiMMPP1xks9n877ds2SKCwaA49thjRX9/f/7+3/zmNwKA+OMf/yiEEGLVqlUCgFi8eHHF/bjlllsEALF161ZD+6/neffee69oaGgQL774YtH9d955pwAgXn75ZSGEEB9++KFoaGgQX/va14rejxA7/yyEEGK//fYT06dPH/A6zz33nAAgnnvuOSGEEOl0WowcOVJMnDhRbN++Pf+4xx9/XAAQV199df6+s846SwAQCxYsKNrmgQceKCZPnlz9D0EIsW3btgH3nX/++WLYsGEimUzm75s5c6YYO3as5vbK+fDDD0Vra6v4P//n/xTVAQBdt0WLFhXtx/jx4we8Rl9fnwAgrrzyyqr70tjYKL73ve8NuP+JJ54QAMRTTz0lhBDixhtvFADEZ599NuCxBx98sPjSl76k9+0TuRpPxRK5QC6Xw6OPPoqvfvWrA45oADtOjRWaPXt20XVPzz77LNLpNC699NKiIyezZ89GS0sLnnjiCQBAa2srAODpp5/Gtm3byu6LPHL12GOPIZfL6X4Pep63ePFi7LPPPth7770RjUbzty9/+csAgOeeew4A8OijjyKXy+Hqq68ecCSo9M9CjzfeeANbtmzBhRdeiHA4nL9/5syZ2HvvvfN/PoUuuOCCop+POOII/Otf/9J8raFDh+b/v6enB9FoFEcccQS2bduGDz74wPC+l+rr68PXvvY1tLW14YEHHiiqgyVLlui6HXfccfnnbN++PX/0rpD8c9q+fXvV/dH7fPnfSo/Veh0ir+CpWCIX2Lp1KxKJBCZOnKjr8ePGjSv6+dNPPwUA7LXXXkX3B4NBjB8/Pv/7cePG4bLLLsPNN9+M+++/H0cccQROOukkfOc738mHvtNOOw3/7//9P3z/+9/HlVdeiWOOOQZf//rX8Y1vfKPqCFM9z/vwww/x/vvvo6Ojo+w2tmzZAgD4+OOP0dDQgH333VfXn4eWSn8+ALD33nvjpZdeKrovHA4P2Me2tjZ0dXVpvta7776Lq666CsuWLUMikSj6XeF1jGbNnj0bH3/8MV555RW0t7cX/a70dK0eQ4cOLXt9YzKZzP/eiufL/1Z6rNbrEHkFgx2RB9XSBH/1q1/h7LPPxmOPPYZnnnkGF198MRYuXIjXXnsNo0ePxtChQ/HCCy/gueeewxNPPIGnnnoKDz74IL785S/jmWeeqThCUs/zcrkc9t9/f9x8881ltzFmzBjT78tK1UaBVhOPxzF9+nS0tLRgwYIFmDBhAsLhMN5880385Cc/MXQEtJz/+q//wgMPPID77rsPkyZNGvD7TZs26dpOa2trvoY6Ozvx3HPPQQhRdDR048aNAHZcA1dNZ2dn/rGFSp/f2dmZv7/0c964cWP+mj4ir+OpWCIX6OjoQEtLC9555x1Tzx87diwAYPXq1UX3p9NprFmzJv97af/998dVV12FF154AS+++CLWr1+PO++8M//7hoYGHHPMMbj55pvx3nvv4Re/+AWWLVuWP1VaidbzJkyYgM8//xzHHHMMZsyYMeAmj6hNmDABuVwO7733XtXX03tattKfj7yv9M/HrOXLlyMWi+Huu+/GJZdcghNPPBEzZsxAW1vbgMcaPaX84osv4kc/+hEuvfRSnHHGGWUf09nZqev24IMP5p8zadIkbNu2De+//37RtlasWJH/fTWTJk3Cm2++OSC0rlixAsOGDcOee+5ZtJ033nij6HEbNmzAunXrNF+HyCsY7IhcoKGhAbNmzcL//M//DGh8wI55xaqZMWMGgsEgfv3rXxc99g9/+AO6u7sxc+ZMAEAikRgwy//++++PhoaG/Cmyzz//fMD2ZdMtdxpN0vO8b37zm1i/fj1+//vfD3js9u3b8yN8Z82ahYaGBixYsGBAYCh8f42NjQOmcylnypQpGDlyJO68886i9/Dkk0/i/fffz//51Eoe6Svcx3Q6jdtvv33AYxsbG3Wfmt24cSO++c1v4vDDD8+PrC3HzDV2J598MgKBQNE+CiFw55134j/+4z8wbdq0ov344IMPkMlk8vd94xvfwObNm/GXv/wlf180GsXixYvx1a9+NX9N3X777Ye9994bd911V9HUL3fccQd8Pl9+Djwir+OpWCKXuO666/DMM89g+vTp+alANm7ciMWLF+Oll14qmo6jVEdHB+bNm4drr70Wxx9/PE466SSsXr0at99+Ow4++GB85zvfAQAsW7YMF110EU499VTsueeeyGazuPfeezFkyBCccsopAIAFCxbghRdewMyZMzF27Fhs2bIFt99+O0aPHl112gs9zzvzzDPx0EMP4YILLsBzzz2Hww47DP39/fjggw/w0EMP4emnn8aUKVOwxx574Gc/+xl+/vOf44gjjsDXv/51hEIhvP766xg1ahQWLlwIAJg8eTLuuOMO/Od//if22GMPjBw5Mj8Qo1AgEMAvf/lLnHPOOZg+fTpOP/30/HQnu+++O374wx+a/diKTJs2DW1tbTjrrLNw8cUXw+fz4d577y0bzCdPnowHH3wQl112GQ4++GA0NTXhq1/9atntXnzxxdi6dSuuuOIK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L18On89X9vb6669XfN5RRx014PEXXHCBjXtund13333Ae7n++uurPieZTGLu3Llob29HU1MTTjnlFGzevNmmPbbGJ598gnPPPRfjxo3D0KFDMWHCBMyfP19zMW0nf/a//e1vsfvuuyMcDmPq1Kn4+9//XvXxixcvxt57741wOIz9998ff/vb32zaU+ssXLgQBx98MJqbmzFy5EjMmjULq1evrvqcu+++e8BnHA6Hbdpja11zzTUD3svee+9d9Tlu+Nylcn+/+Xw+zJ07t+zjnfzZv/DCC/jqV7+KUaNGwefz4dFHHy36vRACV199NTo7OzF06FDMmDEDH374oeZ2jf69USsGOxPS6TROPfVUzJkzp+zv+/v7MXPmTKTTabzyyiu45557cPfdd+Pqq6+uut0zzjgD7777LpYsWYLHH38cL7zwAs477zwVb8Ey06ZNw8aNG4tu3//+9zFu3DhMmTKl6nNnz55d9LwbbrjBpr223oIFC4reyw9+8IOqj//hD3+I//mf/8HixYvx/PPPY8OGDfj6179u095a44MPPkAul8Pvfvc7vPvuu7jllltw55134qc//anmc5342T/44IO47LLLMH/+fLz55pv44he/iOOOOw5btmwp+/hXXnkFp59+Os4991ysWrUKs2bNwqxZs/DOO+/YvOe1ef755zF37ly89tprWLJkCTKZDI499lj09fVVfV5LS0vRZ/zpp5/atMfW22+//Yrey0svvVTxsW753KXXX3+96L0vWbIEAHDqqadWfI5TP/u+vj588YtfxG9/+9uyv7/hhhvw61//GnfeeSdWrFiBxsZGHHfccUgmkxW3afTvDUsIMm3RokWitbV1wP1/+9vfRENDg9i0aVP+vjvuuEO0tLSIVCpVdlvvvfeeACBef/31/H1PPvmk8Pl8Yv369ZbvuyrpdFp0dHSIBQsWVH3c9OnTxSWXXGLPTik2duxYccstt+h+fDweF4FAQCxevDh/3/vvvy8AiFdffVXBHtrnhhtuEOPGjav6GKd+9occcoiYO3du/uf+/n4xatQosXDhwrKP/+Y3vylmzpxZdN/UqVPF+eefr3Q/VduyZYsAIJ5//vmKj6n0d6MTzZ8/X3zxi1/U/Xi3fu7SJZdcIiZMmCByuVzZ37vlswcgHnnkkfzPuVxO7LrrruLGG2/M3xePx0UoFBIPPPBAxe0Y/XvDCjxip8Crr76K/fffH7vsskv+vuOOOw6JRALvvvtuxedEIpGio1wzZsxAQ0MDVqxYoXyfrfLXv/4VsVgM55xzjuZj77//fowYMQITJ07EvHnzsG3bNhv2UI3rr78e7e3tOPDAA3HjjTdWPe2+cuVKZDIZzJgxI3/f3nvvjd122w2vvvqqHburTHd3N4YPH675OKd99ul0GitXriz6zBoaGjBjxoyKn9mrr75a9Hhgx98DbviMAWh+zr29vRg7dizGjBmDk08+ueLffU7w4YcfYtSoURg/fjzOOOMMfPbZZxUf69bPHdjxPbjvvvvwve99Dz6fr+Lj3PTZS2vWrMGmTZuKPtvW1lZMnTq14mdr5u8NK/iVbdnDNm3aVBTqAOR/3rRpU8XnjBw5sug+v9+P4cOHV3zOYPSHP/wBxx13HEaPHl31cd/+9rcxduxYjBo1Cv/7v/+Ln/zkJ1i9ejX+8pe/2LSn1rn44otx0EEHYfjw4XjllVcwb948bNy4ETfffHPZx2/atAnBYHDA9Zm77LKLoz7rUh999BFuu+023HTTTVUf58TPPhqNor+/v+z3+oMPPij7nEp/Dzj5M87lcrj00ktx2GGHYeLEiRUft9dee+GPf/wjDjjgAHR3d+Omm27CtGnT8O6772r+3TDYTJ06FXfffTf22msvbNy4Eddeey2OOOIIvPPOO2hubh7weDd+7tKjjz6KeDyOs88+u+Jj3PTZF5Kfn5HP1szfG1ZgsPu3K6+8Er/85S+rPub999/XvGjWLcz8eaxbtw5PP/00HnroIc3tF147uP/++6OzsxPHHHMMPv74Y0yYMMH8jlvEyPu/7LLL8vcdcMABCAaDOP/887Fw4cJBtcyMXmY++/Xr1+P444/HqaeeitmzZ1d97mD/7KmyuXPn4p133ql6jRkAHHrooTj00EPzP0+bNg377LMPfve73+HnP/+56t201AknnJD//wMOOABTp07F2LFj8dBDD+Hcc8+t457Z7w9/+ANOOOEEjBo1quJj3PTZOxWD3b9dfvnlVf8VAgDjx4/Xta1dd911wKgXOeJx1113rfic0osps9ksPv/884rPUcnMn8eiRYvQ3t6Ok046yfDrTZ06FcCOoz6DobnXUg9Tp05FNpvFJ598gr322mvA73fddVek02nE4/Gio3abN2+uy2ddyuh737BhA44++mhMmzYNd911l+HXG2yffTkjRozAkCFDBoxcrvaZ7brrroYeP9hddNFF+UFdRo+8BAIBHHjggfjoo48U7Z19IpEI9txzz4rvxW2fu/Tpp5/i2WefNXxk3S2fvfz8Nm/ejM7Ozvz9mzdvxqRJk8o+x8zfG1ZgsPu3jo4OdHR0WLKtQw89FL/4xS+wZcuW/OnVJUuWoKWlBfvuu2/F58TjcaxcuRKTJ08GACxbtgy5XC7f+Oxk9M9DCIFFixbhu9/9LgKBgOHXe+uttwCg6AtTT7XUw1tvvYWGhoYBp9alyZMnIxAIYOnSpTjllFMAAKtXr8Znn31W9C/dejHy3tevX4+jjz4akydPxqJFi9DQYPyy3cH22ZcTDAYxefJkLF26FLNmzQKw47Tk0qVLcdFFF5V9zqGHHoqlS5fi0ksvzd+3ZMmSQfEZGyGEwA9+8AM88sgjWL58OcaNG2d4G/39/Xj77bfxla98RcEe2qu3txcff/wxzjzzzLK/d8vnXmrRokUYOXIkZs6caeh5bvnsx40bh1133RVLly7NB7lEIoEVK1ZUnCHDzN8bllA2LMPFPv30U7Fq1Spx7bXXiqamJrFq1SqxatUq0dPTI4QQIpvNiokTJ4pjjz1WvPXWW+Kpp54SHR0dYt68efltrFixQuy1115i3bp1+fuOP/54ceCBB4oVK1aIl156SXzhC18Qp59+uu3vz4xnn31WABDvv//+gN+tW7dO7LXXXmLFihVCCCE++ugjsWDBAvHGG2+INWvWiMcee0yMHz9eHHnkkXbvds1eeeUVccstt4i33npLfPzxx+K+++4THR0d4rvf/W7+MaXvXwghLrjgArHbbruJZcuWiTfeeEMceuih4tBDD63HWzBt3bp1Yo899hDHHHOMWLdundi4cWP+VvgYt3z2f/7zn0UoFBJ33323eO+998R5550nIpFIfvT7mWeeKa688sr8419++WXh9/vFTTfdJN5//30xf/58EQgExNtvv12vt2DKnDlzRGtrq1i+fHnRZ7xt27b8Y0rf+7XXXiuefvpp8fHHH4uVK1eKb33rWyIcDot33323Hm+hJpdffrlYvny5WLNmjXj55ZfFjBkzxIgRI8SWLVuEEO793Av19/eL3XbbTfzkJz8Z8Ds3ffY9PT35fg5A3HzzzWLVqlXi008/FUIIcf3114tIJCIee+wx8b//+7/i5JNPFuPGjRPbt2/Pb+PLX/6yuO222/I/a/29oQKDnQlnnXWWADDg9txzz+Uf88knn4gTTjhBDB06VIwYMUJcfvnlIpPJ5H//3HPPCQBizZo1+ftisZg4/fTTRVNTk2hpaRHnnHNOPiwOdqeffrqYNm1a2d+tWbOm6M/ns88+E0ceeaQYPny4CIVCYo899hA//vGPRXd3t417bI2VK1eKqVOnitbWVhEOh8U+++wjrrvuOpFMJvOPKX3/Qgixfft2ceGFF4q2tjYxbNgw8bWvfa0oEDnBokWLyn4PCv+96LbP/rbbbhO77babCAaD4pBDDhGvvfZa/nfTp08XZ511VtHjH3roIbHnnnuKYDAo9ttvP/HEE0/YvMe1q/QZL1q0KP+Y0vd+6aWX5v+cdtllF/GVr3xFvPnmm/bvvAVOO+000dnZKYLBoPiP//gPcdppp4mPPvoo/3u3fu6Fnn76aQFArF69esDv3PTZy75cepPvL5fLif/7f/+v2GWXXUQoFBLHHHPMgD+TsWPHivnz5xfdV+3vDRV8Qgih7nggEREREdmF89gRERERuQSDHREREZFLMNgRERERuQSDHREREZFLMNgRERERuQSDHREREZFLMNgRERERuQSDHREREZFLMNgRERERuQSDHREREZFLMNgRERERuQSDHRGRSVu3bsWuu+6K6667Ln/fK6+8gmAwiKVLl9Zxz4jIq3xCCFHvnSAicqq//e1vmDVrFl555RXstddemDRpEk4++WTcfPPN9d41IvIgBjsiohrNnTsXzz77LKZMmYK3334br7/+OkKhUL13i4g8iMGOiKhG27dvx8SJE7F27VqsXLkS+++/f713iYg8itfYERHV6OOPP8aGDRuQy+XwySef1Ht3iMjDeMSOiKgG6XQahxxyCCZNmoS99toLt956K95++22MHDmy3rtGRB7EYEdEVIMf//jHePjhh/GPf/wDTU1NmD59OlpbW/H444/Xe9eIyIN4KpaIyKTly5fj1ltvxb333ouWlhY0NDTg3nvvxYsvvog77rij3rtHRB7EI3ZERERELsEjdkREREQuwWBHRERE5BIMdkREREQuwWBHRERE5BIMdkREREQuwWBHRERE5BIMdkREREQuwWBHRERE5BIMdkREREQuwWBHRERE5BIMdkREREQu8f8Badr/1ZYsIp0AAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "jax_sim = make_sim(permittivity=permittivity_val, freq=freq_min)\n", "ax = jax_sim.plot(z=0)\n" ] }, { "cell_type": "markdown", "id": "2aa83e08-2983-4d8d-b85b-31584c96872d", "metadata": {}, "source": [ "### Define Objective\n", "\n", "Now let's define our objective function for a single simulation result." ] }, { "cell_type": "code", "execution_count": 6, "id": "e673c7d6-e44f-4086-bf98-d201739201fc", "metadata": {}, "outputs": [], "source": [ "def post_process(sim_data: tda.JaxSimulationData) -> float:\n", " \"\"\"O-th order diffracted power.\"\"\"\n", " amp = sim_data[\"diffraction\"].amps.isel(f=0).sel(orders_x=0, orders_y=0)\n", " return abs(amp.values) ** 2\n" ] }, { "cell_type": "markdown", "id": "56d3acce-0f8b-493d-9cf7-0568720827f5", "metadata": {}, "source": [ "And we can put everything together to define our full objective over all frequencies using the [plugins.adjoint.web.run_async](../_autosummary/tidy3d.plugins.adjoint.run_async.html) function." ] }, { "cell_type": "code", "execution_count": 7, "id": "86e4ec1c-89ca-474c-83d1-68c6c3bcbdb3", "metadata": {}, "outputs": [], "source": [ "def objective(permittivity: float) -> float:\n", " \"\"\"Average of O-th order diffracted power over all frequencies.\"\"\"\n", " sim_list = [make_sim(permittivity, freq) for freq in freqs]\n", " sim_data_list = tda.web.run_async(sim_list, path_dir=\"data\", verbose=True)\n", " power = [post_process(sim_data) for sim_data in sim_data_list]\n", " return jnp.sum(jnp.array(power)) / len(freqs)\n" ] }, { "cell_type": "markdown", "id": "ee8b0422-5718-4e19-9171-c60941326388", "metadata": {}, "source": [ "Let's now run this function as is to make sure it works properly for only computing the objective." ] }, { "cell_type": "code", "execution_count": 8, "id": "2dbed5ae-f0d5-413b-a42b-a1fc47b08ae5", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "9ac91e49cb7c4b418a0c25d97ad09ffa", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Output()" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "
\n",
       "
\n" ], "text/plain": [ "\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "894f1637aea0474ab6309b16b7554881", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Output()" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "
\n",
       "
\n" ], "text/plain": [ "\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
[14:33:32] loading SimulationData from data/fdve-b62f8de1-c777-4e30-8d10-8470d2d48355v1.hdf5          webapi.py:512\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m[14:33:32]\u001b[0m\u001b[2;36m \u001b[0mloading SimulationData from data/fdve-\u001b[93mb62f8de1-c777-4e30-8d10-8470d2d48355\u001b[0mv1.hdf5 \u001b]8;id=786014;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=730455;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#512\u001b\\\u001b[2m512\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "338ba71af3c349c5bf9a6c63b657d3bc", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Output()" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "
\n",
       "
\n" ], "text/plain": [ "\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
[14:33:33] loading SimulationData from data/fdve-e6a82480-ac08-4a3a-ac7a-17a3995c7afev1.hdf5          webapi.py:512\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m[14:33:33]\u001b[0m\u001b[2;36m \u001b[0mloading SimulationData from data/fdve-\u001b[93me6a82480-ac08-4a3a-ac7a-17a3995c7afe\u001b[0mv1.hdf5 \u001b]8;id=336589;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=412825;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#512\u001b\\\u001b[2m512\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "average power (freq) = 7.64e-01\n" ] } ], "source": [ "power_average = objective(permittivity=permittivity_val)\n", "print(f\"average power (freq) = {power_average:.2e}\")\n" ] }, { "cell_type": "markdown", "id": "318b2a19-5536-4332-9903-8f63ce8ae502", "metadata": {}, "source": [ "### Multi-Frequency Gradient Calculation\n", "\n", "Finally, we are ready to use `jax.grad` to differentiate this function." ] }, { "cell_type": "code", "execution_count": 9, "id": "15546df4-05b5-480f-8a10-32a69f434088", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "0405b9afbb1141bfb59ffba2d68f8f5e", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Output()" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "
\n",
       "
\n" ], "text/plain": [ "\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "981fc6e56d6f4d3f83c065c167796fae", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Output()" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "
\n",
       "
\n" ], "text/plain": [ "\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
[14:34:08] loading SimulationData from data/fdve-e21fb23f-b291-4996-8d8b-ddf3ff439b07v1.hdf5          webapi.py:512\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m[14:34:08]\u001b[0m\u001b[2;36m \u001b[0mloading SimulationData from data/fdve-\u001b[93me21fb23f-b291-4996-8d8b-ddf3ff439b07\u001b[0mv1.hdf5 \u001b]8;id=696180;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=547674;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#512\u001b\\\u001b[2m512\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "96cc1b0ca8b54aae899f3f735b83831f", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Output()" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "
\n",
       "
\n" ], "text/plain": [ "\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
[14:34:10] loading SimulationData from data/fdve-a51abc4a-f53f-4486-9434-4d62cac117c3v1.hdf5          webapi.py:512\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m[14:34:10]\u001b[0m\u001b[2;36m \u001b[0mloading SimulationData from data/fdve-\u001b[93ma51abc4a-f53f-4486-9434-4d62cac117c3\u001b[0mv1.hdf5 \u001b]8;id=7228;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=53725;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#512\u001b\\\u001b[2m512\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "7052293a1f6c43b5a10f9715c95df35c", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Output()" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "
\n",
       "
\n" ], "text/plain": [ "\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "ba5fe3cbb7504526a22b4f78203a172b", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Output()" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "
\n",
       "
\n" ], "text/plain": [ "\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
[14:34:45] loading SimulationData from data/fdve-8665fc82-4c7d-4f9a-b487-02e456044bb9v1.hdf5          webapi.py:512\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m[14:34:45]\u001b[0m\u001b[2;36m \u001b[0mloading SimulationData from data/fdve-\u001b[93m8665fc82-4c7d-4f9a-b487-02e456044bb9\u001b[0mv1.hdf5 \u001b]8;id=717410;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=231229;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#512\u001b\\\u001b[2m512\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "022bace90d1a4ae7a950b87f73d984bc", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Output()" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n"
      ],
      "text/plain": []
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "
\n",
       "
\n" ], "text/plain": [ "\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
[14:34:53] loading SimulationData from data/fdve-2833c5f4-8c2c-41ae-a4a5-35d26af96bd8v1.hdf5          webapi.py:512\n",
       "
\n" ], "text/plain": [ "\u001b[2;36m[14:34:53]\u001b[0m\u001b[2;36m \u001b[0mloading SimulationData from data/fdve-\u001b[93m2833c5f4-8c2c-41ae-a4a5-35d26af96bd8\u001b[0mv1.hdf5 \u001b]8;id=376464;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py\u001b\\\u001b[2mwebapi.py\u001b[0m\u001b]8;;\u001b\\\u001b[2m:\u001b[0m\u001b]8;id=769733;file:///Users/twhughes/Documents/Flexcompute/tidy3d-docs/tidy3d/tidy3d/web/webapi.py#512\u001b\\\u001b[2m512\u001b[0m\u001b]8;;\u001b\\\n" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "derivative of average power wrt permittivity = -1.82e+00\n" ] } ], "source": [ "grad_objective = jax.grad(objective)\n", "\n", "grad_power_average = grad_objective(permittivity_val)\n", "print(f\"derivative of average power wrt permittivity = {grad_power_average:.2e}\")\n" ] }, { "cell_type": "markdown", "id": "cbb1fa38-7212-48d2-bd3c-6538f39d378a", "metadata": {}, "source": [ "### Sanity Checking: Manual Loop over Frequency\n", "\n", "Now we will implement the brute force approach to computing the multi-frequency gradient through looping over frequency and adding the individual gradient contributions." ] }, { "cell_type": "code", "execution_count": 10, "id": "722f8199-6316-49d0-a53d-2e39c3f649cd", "metadata": {}, "outputs": [], "source": [ "def grad_manual(permittivity: float) -> float:\n", " \"\"\"Average of O-th order diffracted power over all frequencies.\"\"\"\n", "\n", " def objective(permittivity, freq):\n", " sim = make_sim(permittivity, freq)\n", " sim_data = tda.web.run(sim, task_name=f\"f={freq:.2e}\", verbose=False)\n", " return jnp.sum(post_process(sim_data))\n", "\n", " total_grad = 0.0\n", " for freq in freqs:\n", " print(f\"working on freq = {freq:.2e} (Hz)\")\n", " obj_fn = lambda x: objective(x, freq=freq)\n", " grad_fn = jax.grad(obj_fn)\n", " gradient = grad_fn(permittivity)\n", " total_grad += gradient\n", "\n", " return total_grad / len(freqs)\n" ] }, { "cell_type": "code", "execution_count": 11, "id": "4662f3ea-ec95-4d40-8ac9-255ca3228b18", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "working on freq = 1.00e+14 (Hz)\n", "working on freq = 2.00e+14 (Hz)\n" ] } ], "source": [ "grad_man = grad_manual(permittivity_val)\n" ] }, { "cell_type": "markdown", "id": "274b87fc-b3d4-4d33-a782-d0338b694220", "metadata": {}, "source": [ "Finally, we can ensure that they match." ] }, { "cell_type": "code", "execution_count": 12, "id": "24aa18da-fa10-4307-acde-ca0ac24bf98e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "gradient (batched) = -1.8176e+00\n", "gradient (looped) = -1.8176e+00\n" ] } ], "source": [ "print(f\"gradient (batched) = {grad_power_average:.4e}\")\n", "print(f\"gradient (looped) = {grad_man:.4e}\")\n" ] }, { "cell_type": "markdown", "id": "2386142b-fe8e-4fa2-b80d-942db85b4d0c", "metadata": {}, "source": [ "## Takeaways\n", "\n", "The main thing to note here is that, using [plugins.adjoint.web.run_async](../_autosummary/tidy3d.plugins.adjoint.run_async.html), all of the individual simulations were uploaded at roughly the same time.\n", "\n", "This means that the server is able to work on them concurrently rather than needing to wait for the previously uploaded one to finish. The time savings for applications with several simulations can be enormous.\n", "\n", "While we focused this example on a multi-frequency objective, this basic strategy can be broadly applied to other multi-objective problems. \n", "\n", "For example, if the objective depends on the results from slightly different simulations, for example dilated or contracted structures, random variation, or other instances, this general approach can be very useful." ] }, { "cell_type": "code", "execution_count": null, "id": "5c5b15c3-d6ec-4258-8de5-d8cf1b4a36df", "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" }, "widgets": { "application/vnd.jupyter.widget-state+json": { "state": { "06a8b9625ba946478ecae714b1cfb30c": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": 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, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "0d05245cb0364f078157af49b455c0bc": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": 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, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "10b09c02a2044c75b724ce6d6f9364ed": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": 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, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "1daa7ff24fb243b3881d89b7aebcee2f": { "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_ab1c2cdc26a04d6591313ccf372ee903", "msg_id": "", "outputs": [ { "data": { "text/html": "
\u2193 monitor_data.hdf5 \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 100.0% \u2022 62.5/62.5 kB \u2022 ? \u2022 0:00:00\n
\n", "text/plain": "\u001b[1;32m\u2193\u001b[0m \u001b[1;34mmonitor_data.hdf5\u001b[0m \u001b[38;2;114;156;31m\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u001b[0m \u001b[35m100.0%\u001b[0m \u2022 \u001b[32m62.5/62.5 kB\u001b[0m \u2022 \u001b[31m?\u001b[0m \u2022 \u001b[36m0:00:00\u001b[0m\n" }, "metadata": {}, "output_type": "display_data" } ] } }, "217097a59e8f4efba02bee60630d8e23": { "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_0d05245cb0364f078157af49b455c0bc", "msg_id": "", "outputs": [ { "data": { "text/html": "
\u2193 monitor_data.hdf5 \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 100.0% \u2022 320.4/320.4 kB \u2022 28.6 MB/s \u2022 0:00:00\n
\n", "text/plain": "\u001b[1;32m\u2193\u001b[0m \u001b[1;34mmonitor_data.hdf5\u001b[0m \u001b[38;2;114;156;31m\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u001b[0m \u001b[35m100.0%\u001b[0m \u2022 \u001b[32m320.4/320.4 kB\u001b[0m \u2022 \u001b[31m28.6 MB/s\u001b[0m \u2022 \u001b[36m0:00:00\u001b[0m\n" }, "metadata": {}, "output_type": "display_data" } ] } }, "3ffadd95e2634ee98324d0d774683c7d": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": 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, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "4639947fe40a431db4d515f45166a61b": { "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_3ffadd95e2634ee98324d0d774683c7d", "msg_id": "", "outputs": [ { "data": { "text/html": "
done w/ \"0_fwd\" \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 100% 0:00:00\ndone w/ \"1_fwd\" \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 100% 0:00:00\n
\n", "text/plain": "done w/ \"0_fwd\" \u001b[38;2;114;156;31m\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u001b[0m \u001b[35m100%\u001b[0m \u001b[36m0:00:00\u001b[0m\ndone w/ \"1_fwd\" \u001b[38;2;114;156;31m\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u001b[0m \u001b[35m100%\u001b[0m \u001b[36m0:00:00\u001b[0m\n" }, "metadata": {}, "output_type": "display_data" } ] } }, "4f27a8139c0149f3968cdd4f110d5b8e": { "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_06a8b9625ba946478ecae714b1cfb30c", "msg_id": "", "outputs": [ { "data": { "text/html": "
done w/ \"0\" \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 100% 0:00:00\ndone w/ \"1\" \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 100% 0:00:00\n
\n", "text/plain": "done w/ \"0\" \u001b[38;2;114;156;31m\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u001b[0m \u001b[35m100%\u001b[0m \u001b[36m0:00:00\u001b[0m\ndone w/ \"1\" \u001b[38;2;114;156;31m\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u001b[0m \u001b[35m100%\u001b[0m \u001b[36m0:00:00\u001b[0m\n" }, "metadata": {}, "output_type": "display_data" } ] } }, "6649946958cc45febf7c5de3bef90427": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": 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, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "7af3cc63c91845feabf3fe9a8c7cdda5": { "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_10b09c02a2044c75b724ce6d6f9364ed", "msg_id": "", "outputs": [ { "data": { "text/html": "
\u2193 monitor_data.hdf5 \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 100.0% \u2022 37.9/37.9 kB \u2022 ? \u2022 0:00:00\n
\n", "text/plain": "\u001b[1;32m\u2193\u001b[0m \u001b[1;34mmonitor_data.hdf5\u001b[0m \u001b[38;2;114;156;31m\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u001b[0m \u001b[35m100.0%\u001b[0m \u2022 \u001b[32m37.9/37.9 kB\u001b[0m \u2022 \u001b[31m?\u001b[0m \u2022 \u001b[36m0:00:00\u001b[0m\n" }, "metadata": {}, "output_type": "display_data" } ] } }, "7bdb175ab2bf4c57ac35affb30876f8f": { "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_e908ea5edd544f5793a0e5156cae1629", "msg_id": "", "outputs": [ { "data": { "text/html": "
\u2193 monitor_data.hdf5 \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 100.0% \u2022 343.9/343.9 kB \u2022 3.2 MB/s \u2022 0:00:00\n
\n", "text/plain": "\u001b[1;32m\u2193\u001b[0m \u001b[1;34mmonitor_data.hdf5\u001b[0m \u001b[38;2;114;156;31m\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u001b[0m \u001b[35m100.0%\u001b[0m \u2022 \u001b[32m343.9/343.9 kB\u001b[0m \u2022 \u001b[31m3.2 MB/s\u001b[0m \u2022 \u001b[36m0:00:00\u001b[0m\n" }, "metadata": {}, "output_type": "display_data" } ] } }, "8c34888c3a2f426c842f56cf12597610": { "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_91dc4d4effa24f04ac65291500df4048", "msg_id": "", "outputs": [ { "data": { "text/html": "
done w/ \"0_adj\" \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 100% 0:00:00\ndone w/ \"1_adj\" \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 100% 0:00:00\n
\n", "text/plain": "done w/ \"0_adj\" \u001b[38;2;114;156;31m\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u001b[0m \u001b[35m100%\u001b[0m \u001b[36m0:00:00\u001b[0m\ndone w/ \"1_adj\" \u001b[38;2;114;156;31m\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u001b[0m \u001b[35m100%\u001b[0m \u001b[36m0:00:00\u001b[0m\n" }, "metadata": {}, "output_type": "display_data" } ] } }, "91dc4d4effa24f04ac65291500df4048": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": 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, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "ab1c2cdc26a04d6591313ccf372ee903": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": 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, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "b6deb292ecde4f568a79164cdf2e14f6": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": 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, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "dc2d249e705b4feba13c7da38b2cf40c": { "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_6649946958cc45febf7c5de3bef90427", "msg_id": "", "outputs": [ { "data": { "text/html": "
\u2193 monitor_data.hdf5 \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 100.0% \u2022 1.6/1.6 MB \u2022 19.7 MB/s \u2022 0:00:00\n
\n", "text/plain": "\u001b[1;32m\u2193\u001b[0m \u001b[1;34mmonitor_data.hdf5\u001b[0m \u001b[38;2;114;156;31m\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u001b[0m \u001b[35m100.0%\u001b[0m \u2022 \u001b[32m1.6/1.6 MB\u001b[0m \u2022 \u001b[31m19.7 MB/s\u001b[0m \u2022 \u001b[36m0:00:00\u001b[0m\n" }, "metadata": {}, "output_type": "display_data" } ] } }, "e908ea5edd544f5793a0e5156cae1629": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": 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, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "ec16033b33724e628e507def40faf99d": { "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_b6deb292ecde4f568a79164cdf2e14f6", "msg_id": "", "outputs": [ { "data": { "text/html": "
\u2193 monitor_data.hdf5 \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 100.0% \u2022 1.7/1.7 MB \u2022 13.6 MB/s \u2022 0:00:00\n
\n", "text/plain": "\u001b[1;32m\u2193\u001b[0m \u001b[1;34mmonitor_data.hdf5\u001b[0m \u001b[38;2;114;156;31m\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u001b[0m \u001b[35m100.0%\u001b[0m \u2022 \u001b[32m1.7/1.7 MB\u001b[0m \u2022 \u001b[31m13.6 MB/s\u001b[0m \u2022 \u001b[36m0:00:00\u001b[0m\n" }, "metadata": {}, "output_type": "display_data" } ] } } }, "version_major": 2, "version_minor": 0 } } }, "nbformat": 4, "nbformat_minor": 5 }