{ "cells": [ { "cell_type": "markdown", "id": "310e916d", "metadata": {}, "source": [ "# Tutorial 7a: Differentiable Ray Tracing Hello World\n" ] }, { "cell_type": "markdown", "id": "826af788", "metadata": {}, "source": [ "### May 2025" ] }, { "cell_type": "markdown", "id": "cf07e82f", "metadata": {}, "source": [ "As you may have noticed, Optiland now supports swappable backends (as of now the options are: Numpy and PyTorch) that allow you to customize your workflow. Do you want to quickly design a simple system using traditional methods of numerical optimization? Choose numpy as the backend. Do you want to learn about differentiable ray tracing and how to combine Optiland with your ML/DL pipeline? Choose torch as the backend.\n", "\n", "Throughout this notebook you will gain the necessary skills to learn how to swap backends, and how to use PyTorch for a simple optimization problem. Dial in :)" ] }, { "cell_type": "markdown", "id": "4420c229", "metadata": {}, "source": [ "### Differentiable Ray Tracing - Basics " ] }, { "cell_type": "markdown", "id": "2e4d719c", "metadata": {}, "source": [ "Differentiable ray tracing **(DRT)** offers some notable advantages over traditional methodologies - especially when it comes to optimization. Conventional approaches generally involve applying small perturbations to design parameters and running discrete ray-tracing simulations repeatedly to estimate gradients. In contrast, DRT integrates **automatic differentiation** to compute these gradients directly and more efficiently by constructing a computational graph of the ray tracing process and then applying backpropagation.\n", "\n", "Therefore, with a fully differentiable ray tracing pipeline, all the necessary steps (from ray intersections to refraction to image formation), are performed keeping in mind automatic differentiation. By enabling everything to be computed in an automatic differentiation framework like PyTorch, we allow the software to directly compute the gradient of our final merit function with respect to all the design parameters, which in turn opens the door to the usage of standard gradient-based algorithms like GD, SGD, Adam, etc (as opposed to relying on the finite difference approximations of the Jacobian, as in the standard DLS optimization algorithm)." ] }, { "cell_type": "markdown", "id": "7bd0cf64", "metadata": {}, "source": [ "That being said, let's get started with the practical application!" ] }, { "cell_type": "markdown", "id": "8143c18e", "metadata": {}, "source": [ "### 1. Changing the backend" ] }, { "cell_type": "code", "execution_count": 1, "id": "68cc0a7e", "metadata": { "execution": { "iopub.execute_input": "2026-03-24T10:13:30.854034Z", "iopub.status.busy": "2026-03-24T10:13:30.853224Z", "iopub.status.idle": "2026-03-24T10:13:33.127062Z", "shell.execute_reply": "2026-03-24T10:13:33.126510Z" } }, "outputs": [], "source": [ "# Begin by importing the backend module instead of numpy or torch directly\n", "import optiland.backend as be" ] }, { "cell_type": "markdown", "id": "546f7328", "metadata": {}, "source": [ "To switch to PyTorch:" ] }, { "cell_type": "code", "execution_count": 2, "id": "61a6d9c6", "metadata": { "execution": { "iopub.execute_input": "2026-03-24T10:13:33.129066Z", "iopub.status.busy": "2026-03-24T10:13:33.128815Z", "iopub.status.idle": "2026-03-24T10:13:33.132500Z", "shell.execute_reply": "2026-03-24T10:13:33.131955Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "32\n" ] } ], "source": [ "# set backend\n", "be.set_backend(\"torch\")\n", "be.set_device(\n", " \"cpu\"\n", ") # we will stick to cpu for now. \"cuda\" is also possible for GPU calculations.\n", "print(be.get_precision()) # check the precision\n", "\n", "# enable the gradient mode: to tell autograd to begin recording operations on a Tensor tensor\n", "be.grad_mode.enable()" ] }, { "cell_type": "markdown", "id": "977d22e0", "metadata": {}, "source": [ "### 2. Design Workflow - from task to final optimized design" ] }, { "cell_type": "markdown", "id": "d627a99e", "metadata": {}, "source": [ "In this simple example, we are concerned with optimizing a singlet lens radii for achieving the smallest RMS spot size at a distance of 70 mm from the second surface of the lens." ] }, { "cell_type": "code", "execution_count": 3, "id": "b704f229", "metadata": { "execution": { "iopub.execute_input": "2026-03-24T10:13:33.134013Z", "iopub.status.busy": "2026-03-24T10:13:33.133855Z", "iopub.status.idle": "2026-03-24T10:13:34.384121Z", "shell.execute_reply": "2026-03-24T10:13:34.383587Z" } }, "outputs": [], "source": [ "from optiland.optic import Optic\n", "from optiland.materials import Material\n", "from optiland.analysis import SpotDiagram\n", "\n", "\n", "class SingletConfigurable(Optic):\n", " \"\"\"A configurable singlet lens.\"\"\"\n", "\n", " def __init__(self, r1, r2, t2, material_name):\n", " super().__init__()\n", " ideal_material = Material(material_name)\n", "\n", " self.surfaces.add(index=0, radius=be.inf, thickness=be.inf)\n", " self.surfaces.add(\n", " index=1, thickness=7.0, radius=r1, is_stop=True, material=ideal_material\n", " )\n", " self.surfaces.add(index=2, radius=r2, thickness=t2)\n", " self.surfaces.add(index=3)\n", "\n", " self.set_aperture(aperture_type=\"EPD\", value=25)\n", "\n", " self.fields.set_type(field_type=\"angle\")\n", " self.fields.add(y=0.0)\n", "\n", " self.wavelengths.add(value=0.55, is_primary=True)" ] }, { "cell_type": "markdown", "id": "3b697d12", "metadata": {}, "source": [ "Notice how you can build your singlet in a Class. This allows easy reproducibility and customization and extra calls.\n", "\n", "Let's have a look what the lens look like at the moment." ] }, { "cell_type": "code", "execution_count": 4, "id": "92d6a90e", "metadata": { "execution": { "iopub.execute_input": "2026-03-24T10:13:34.386401Z", "iopub.status.busy": "2026-03-24T10:13:34.385955Z", "iopub.status.idle": "2026-03-24T10:13:34.891141Z", "shell.execute_reply": "2026-03-24T10:13:34.890593Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u2552\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n", "\u2502 \u2502 Type \u2502 Comment \u2502 Radius \u2502 Thickness \u2502 Material \u2502 Conic \u2502 Semi-aperture \u2502\n", "\u255e\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2561\n", "\u2502 0 \u2502 Planar \u2502 \u2502 inf \u2502 inf \u2502 Air \u2502 0 \u2502 12.5 \u2502\n", "\u2502 1 \u2502 Stop - Standard \u2502 \u2502 70 \u2502 7 \u2502 BK7 \u2502 0 \u2502 12.5 \u2502\n", "\u2502 2 \u2502 Standard \u2502 \u2502 -70 \u2502 70 \u2502 Air \u2502 0 \u2502 12.0732 \u2502\n", "\u2502 3 \u2502 Planar \u2502 \u2502 inf \u2502 nan \u2502 Air \u2502 0 \u2502 0.66857 \u2502\n", "\u2558\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255b\n", "\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "lens = SingletConfigurable(r1=70.0, r2=-70.0, t2=70.0, material_name=\"BK7\")\n", "lens.draw(num_rays=10)\n", "lens.info()" ] }, { "cell_type": "markdown", "id": "fc2b010d", "metadata": {}, "source": [ "It is clear that the image plane is far from the best focus. Recall that here we assume the \"best focus\" to be the smallest possible RMS spot size. And, speaking of, let's now check it's actual value:" ] }, { "cell_type": "code", "execution_count": 5, "id": "46ad84c2", "metadata": { "execution": { "iopub.execute_input": "2026-03-24T10:13:34.892891Z", "iopub.status.busy": "2026-03-24T10:13:34.892526Z", "iopub.status.idle": "2026-03-24T10:13:35.065536Z", "shell.execute_reply": "2026-03-24T10:13:35.064990Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Initial RMS Spot Radius: 0.9442 mm\n" ] }, { "data": { "text/plain": [ "(
,\n", " [])" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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l6lTZLCu8vlbL9xgeVFaVg4OS8ffa3p7vjfH87EtYyKoY3IcRQSWU9dWzUkJrH2sL/egx33XVd9q1qUaZNXxnWeKSynvXD6djww33CL2pE64jjVRxP/zP/8jFhNNSUkRa9PVnNCxfv16MjPTp08XfmgHbBGz+yM6Olq8WrAvsKDqNF0oUCi2SagI2g8ICBOLR9a3bpleJFUGU4mSSTkFCjVvEqKbfP7WCysGHmPgenZ0MH+v6e353hzPxwak9KO9hw9TSrMAyo+9igKqgmod68s96HHfddW3mnWpBkl1fGdgQBjFNo+WwjXhSZ0EB3umYr2+k0cffVRETHTq1ImaN28u/B+uH62IjY2loKAgys3NrVbO+4mJiXWew+XeHM+EhYUJhev6Yfih84cHZEZd05YoIJBO5l8SW97ncscxRn5S4iLolq6JusunRr2wYlDzmt6e783xXDb2+k4U0747VSV0ooDAoDqP9eUe9LrvmvWt9fNVo02N7NuWkkRiJOP7mqd1oslgXbNmzeidd94RVrERg3UcqsYha45f9TZt2og19NwN1l28eJE++ugjZ1n//v1FzmR/ButkjppwDMJcqAo1VdSEQ+66LB2ZoybYH8ivomwFmSlqor761lImNaImzks2s66+OvF4Zq7iJW3atFEOHTqkGME777yjhIWFKStWrFAOHjyojBs3TomKilJycnLE30eNGqVMmzbNefy3336rBAcHK/Pnzxcyz5o1SwkJCVH279/v8XcWFBTwD5XYmoHKykrl7NmzYmsmILe+QG598FR/eP2T8tRTT9GsWbOEpak3bOHOnz+fZs6cKULQ9u3bRxs3bnQOyGVmZlJ2dnY165djh1977TUx+WPdunX0/vvv+x1DDAAAauK1a4KTwvMKHXxa27Ztaw3W8WQJK4GkP/pgBrnregWtS25Z3VZmq28ryK1Z0h+emQaA3dB6hQ5gb7xWxOyWAMCsqL2enFordPgjH7CJInYsDAqAmdFiPTlXRazXunjAenjkZLnyyitFyBpPM66PX375hSZMmEAvvPCCWvIBUMti3J6RJ7benudqrfKW9z25juvKG1VVikcrdNR3nNryqVE/wAQWMcftPvHEE/TXv/6V/vCHP1Dv3r2pZcuWFB4eLqb+Hjx4kL755hs6cOCAiOllZQyA2vhjMfpjrda3QrJrLgF/VlL215pm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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# RMS Spot Size Analysis\n", "spot_diagram = SpotDiagram(lens)\n", "rms_value = spot_diagram.rms_spot_radius()\n", "print(f\"\\nInitial RMS Spot Radius: {rms_value[0][0]:.4f} mm\")\n", "\n", "# Spot Diagram visualization\n", "spot_diagram.view(add_airy_disk=True)" ] }, { "cell_type": "markdown", "id": "32e8df39", "metadata": {}, "source": [ "Now, we set up the optimization to minimize the RMS spot size using PyTorch's autograd.\n", "We need to:\n", "\n", "1. Identify the parameters to optimize (Lens radii R1, R2).\n", "2. Define a PyTorch optimizer (e.g., Adam).\n", "3. Define the loss function (RMS spot radius)." ] }, { "cell_type": "code", "execution_count": 6, "id": "03002054", "metadata": { "execution": { "iopub.execute_input": "2026-03-24T10:13:35.067427Z", "iopub.status.busy": "2026-03-24T10:13:35.067213Z", "iopub.status.idle": "2026-03-24T10:13:35.079041Z", "shell.execute_reply": "2026-03-24T10:13:35.078321Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[tensor(70., requires_grad=True), tensor(-70., requires_grad=True)]\n" ] } ], "source": [ "import torch.optim as optim\n", "\n", "# --- Parameter Handling ---\n", "\n", "# Get initial values\n", "radius1_param = lens.surfaces.surfaces[1].geometry.radius\n", "radius2_param = lens.surfaces.surfaces[2].geometry.radius\n", "params_to_optimize = [radius1_param, radius2_param]\n", "print(params_to_optimize)" ] }, { "cell_type": "markdown", "id": "09aa3ee2", "metadata": {}, "source": [ "**NOTE:** When using the PyTorch backend with gradient mode enabled, Optiland allows direct access to certain geometric parameters (like surface radii) as tensors that participate in the computation graph. This enables us to pass them directly to a PyTorch optimizer." ] }, { "cell_type": "code", "execution_count": 7, "id": "c2f2d816", "metadata": { "execution": { "iopub.execute_input": "2026-03-24T10:13:35.081867Z", "iopub.status.busy": "2026-03-24T10:13:35.081575Z", "iopub.status.idle": "2026-03-24T10:13:40.380545Z", "shell.execute_reply": "2026-03-24T10:13:40.380082Z" } }, "outputs": [], "source": [ "# --- Optimizer ---\n", "# We use the Adam optimizer, common for deep learning tasks.\n", "# We pass the tensors we want to optimize.\n", "learning_rate = 0.2 # Adjust as needed\n", "optimizer = optim.Adam(params_to_optimize, lr=learning_rate)" ] }, { "cell_type": "code", "execution_count": 8, "id": "7939a5da", "metadata": { "execution": { "iopub.execute_input": "2026-03-24T10:13:40.382793Z", "iopub.status.busy": "2026-03-24T10:13:40.382394Z", "iopub.status.idle": "2026-03-24T10:13:41.894274Z", "shell.execute_reply": "2026-03-24T10:13:41.893690Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Optimization setup complete.\n", "Optimizing: R1, R2\n", "Initial values: (R1=70.00, R2=-70.00)\n", "\n", "Starting optimization...\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration 25/100, Loss (RMS Spot Radius): 0.263034 mm\n", " R1: 74.9251, R2: -74.9241\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration 50/100, Loss (RMS Spot Radius): 0.127734 mm\n", " R1: 76.8283, R2: -76.8953\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration 75/100, Loss (RMS Spot Radius): 0.115021 mm\n", " R1: 76.3996, R2: -76.6142\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iteration 100/100, Loss (RMS Spot Radius): 0.114965 mm\n", " R1: 76.2613, R2: -76.6589\n", "Optimization finished.\n" ] } ], "source": [ "# --- Loss Function ---\n", "# The function to minimize is the RMS spot radius.\n", "# We need a way to calculate this within the loop using the current tensor values.\n", "\n", "\n", "def calculate_loss(lens):\n", " \"\"\"Calculates the RMS spot radius for the current lens state.\"\"\"\n", " rms_values_nested = SpotDiagram(lens).rms_spot_radius()\n", " rms_scalar = rms_values_nested[0][0]\n", " return rms_scalar\n", "\n", "\n", "print(\"\\nOptimization setup complete.\")\n", "print(f\"Optimizing: R1, R2\")\n", "print(f\"Initial values: (R1={radius1_param:.2f}, R2={radius2_param:.2f})\")\n", "\n", "\n", "# --- Optimization Loop ---\n", "# We run the standard PyTorch training loop.\n", "\n", "num_iterations = 100\n", "print(\"\\nStarting optimization...\")\n", "losses = []\n", "for i in range(num_iterations):\n", " optimizer.zero_grad()\n", "\n", " # --- Calculate Loss ---\n", " loss = calculate_loss(lens)\n", " losses.append(loss.item())\n", " # --- Backpropagation and Optimization Step ---\n", " loss.backward() # Calculate gradients\n", " optimizer.step() # Update tensors based on gradients\n", "\n", " # --- Print Progress ---\n", " if (i + 1) % 25 == 0:\n", " print(\n", " f\"Iteration {i + 1}/{num_iterations}, Loss (RMS Spot Radius): {loss.item():.6f} mm\"\n", " )\n", " print(f\" R1: {radius1_param.item():.4f}, R2: {radius2_param.item():.4f}\")\n", "\n", "print(\"Optimization finished.\")" ] }, { "cell_type": "code", "execution_count": 9, "id": "d26c8528", "metadata": { "execution": { "iopub.execute_input": "2026-03-24T10:13:41.896052Z", "iopub.status.busy": "2026-03-24T10:13:41.895855Z", "iopub.status.idle": "2026-03-24T10:13:41.951201Z", "shell.execute_reply": "2026-03-24T10:13:41.950863Z" } }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# --- Visualization of Loss per Epoch ---\n", "import matplotlib.pyplot as plt\n", "\n", "plt.figure()\n", "plt.plot(range(1, num_iterations + 1), losses)\n", "plt.xlabel(\"Iteration\")\n", "plt.ylabel(\"Loss (RMS Spot Radius) [mm]\")\n", "plt.title(\"Loss per Iteration\")\n", "plt.grid(True)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 10, "id": "c972826c", "metadata": { "execution": { "iopub.execute_input": "2026-03-24T10:13:41.952763Z", "iopub.status.busy": "2026-03-24T10:13:41.952566Z", "iopub.status.idle": "2026-03-24T10:13:42.207815Z", "shell.execute_reply": "2026-03-24T10:13:42.207399Z" } }, "outputs": [ { "data": { "text/plain": [ "(
,\n", " [])" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAWsAAAGWCAYAAAC+SqK/AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAARVxJREFUeJztnQl4FFW2x09n6yQkZCELWxYIiqhssgR4OqAwgjgzIjgKIgiPB4iAT8BRcBREHRmUURRxEJ6AKALqjKMwyBNZ9CmrKIpsSoY1kJBAErKRTrrrfefOdE8n6e50J13ddav+v+8rmrp1q3Lr1r2nTp177rkmRVEUAgAAoGlCgl0AAAAADQNhDQAAEgBhDQAAEgBhDQAAEgBhDQAAEgBhDQAAEgBhDQAAEgBhDQAAEgBhDQAAEgBhDQAAEgBhDeqxevVqMplM9M0337g8PmDAALrxxhsDUpZPPvmEbrrpJoqMjKT09HSaN28e1dTUeHWuzWajF198kdq1ayfO79KlC61bt85l3qNHj9KQIUMoJiaGEhMTacyYMVRQUNCka3rDqVOnRF0vWrTI5fFnnnlGHC8sLCQ10Xs96wKODQKAM6tWreJ4Mcr+/ftdHu/fv79yww03qF6OzZs3KyaTSbn11luV5cuXK9OnT1dCQkKUhx56yKvzZ8+eLe5j4sSJ4vw777xT7K9bt65WvrNnzypJSUlKVlaW8uqrryp/+MMflISEBKVr165KVVVVo67pLSdPnhTnv/TSSy6Pz5s3TxwvKChQ1MII9awHIKyBZoX19ddfLzpydXW1I+33v/+9ECxHjx71eO65c+eU8PBwZerUqY40m82m3HLLLUrbtm2VmpoaR/qUKVOUqKgo5fTp0460rVu3ijp48803G3VNmYS1EepZD8AMAprMqlWrxKf6ypUra6W/8MILIn3z5s2OtAsXLtCxY8eourra4zWPHDkitkmTJlFYWJgj/eGHH2YFgz788EOP53/88cfib3B+O1yWKVOm0Llz52j37t2O9L/85S/0q1/9Snz+2xk0aBBde+219P777zfqmmrB5onw8HCXpgOuq/j4eLp69SrqWYdAWAO3lJSUCFtp3a2uABg/frzohDNnzqSzZ8+KtEOHDtH8+fNpwoQJNHToUEfeOXPmUKdOnSg3N9fj3/7uu+/Eb8+ePWult27dmtq2bes47un8Zs2aib/lTO/evWtdn8tx8eLFen/Hntf573h7zcZQUVHhsq453Rm28bItecOGDbXSLRaLEKwjRowQNl7Us/6AsAZuYa0nOTm53rZr1656eVesWEGhoaFCOLPgePDBB6lly5b08ssvN+pvs2bItGrVqt4xTjt//nyD56empgqNrO65jP38hv7O5cuXqaqqyqdrNlZjdlXXL730Uq18HTp0oL59+9K7775bK/3vf/87FRUVCWHuC0arZ5n593cPAHVYunSp+ESty6xZs8hqtdZKY8HM+UeNGkW33HILHTx4kLZu3UrNmzev52nCW0NUVlaKX7PZXO8Ya45Xrlxp8Hx35zpfv6G/43wtb6/ZGNgM8dvf/rZe+po1a+idd96plTZ27FhhEsjJyaGsrCyRtnbtWkpLS6P+/fuLfdSz/oCwBm7hz05Xn60JCQkuXclGjhwpND7W8lj4DBw4sNF/OyoqSvzatS1n2CZrP+7pfHfnOl+/ob9TN683+RrDNddcI75k6vLVV1/VS7vvvvvo0UcfFQJ67ty5wly1adMmmjFjRj1ttCGMVs8yAzMI8BuXLl1y+GbzoBX7yjYW+yev/fPZGU5jm2pD5+fl5YlBsrrnMvbzG/o77Ats1/K8vaba8MuSxwhYWDNsq2bh9sADD/h8LdSzPEBYA78xdepUKi0tpQULFgiNcPHixY2+Vrdu3cRv3Yk5bK9kjwD7cU/n8+AcT8JwZu/evbWu36ZNG2EbdjUBaN++fbX+jrfXDARsCvnpp59o//79Qmh3796dbrjhBp+vg3qWiGD7DgJ9+Fl/8MEH4pzXXntN7I8cOVL41B4/frxWvvPnzwvfXYvF0mA5rrvuOuH/6+xX+9RTTwn/3yNHjjjSiouLxTX513kChjtf3TZt2tS6Jk/+4LKeOXPGkfb555+L+/nzn//cqGuq7WfN9ccTTEaMGCEmsPzpT3+qdRz1rD8grEGThXV+fr4QHDwDjjsVU1hYqKSmpip9+/ZVrFarI++DDz4ors1CqiE2btwoBMZtt90mZrE98sgjQjDxrDZX5eVfZ373u9+J9EmTJikrVqxwzIJbu3ZtrXwsPFq0aCFm1vHL5oUXXhAz6zp37qxcvXq1Udd0VyZ/ToqZNm2aOBYaGiqEszNGqWcjAWENmiyshw8frsTGxiqnTp2qle/jjz8W11m4cGGjhAjz0UcfKd26dVPMZrOYvcYaX11t0Z0Q4ZcEC4SMjAwlIiJClPndd991+Xd+/PFH5fbbb1eio6OV+Ph4ZfTo0UpeXl69fN5ec8mSJaJMW7ZsUU1Y79u3TxzjctfFKPVsJEz8T7BNMQDojXvvvVcEaWJ7rFp8//33wn7L7n2++lcD+YDrHgB+hvWfnTt31pu44m94IhJHrxs+fLiqfwdoAwhrAPwM+zrz1Gq12Lhxo3CNXL58OU2bNk1MzQb6B2YQACQjMzOT8vPzafDgwWJ2Y2xsbLCLBAIAhDUAAEgAJsUAAIAEQFgDAIAEYIDRD3AMDJ6ey7ZDXwPpAACMjaIoIkwDxzwJCfGgPyuS8frrrwtHeXbe7927t7J37163edkBnydscH6+1VdeecXtpAPnrWPHjj6ViafH1r0GNmzYsJEPG8sRT0ilWfPqGLwaybJlyyg7O1sECuIR8ePHj1NKSkq9/BwMpn379iJOMIePdAcHwPn8888d+87LG3mDfTSeV0mpG79Zhq8CDlrPkdw8vtVBo0Edq4tN8vrlmOEci7whrx6phDWvOjJx4kSxjBTDQptjJ/Paf7Nnz66Xv1evXmJjXB13Fs4cPL+x2E0fLKhlFNa8TBSXW8aGLgOoY3Wx6aR+GzKhSiOseamoAwcOiLXl7PCD4YDtTV1A8+effxb2Il6JgpdM4hCfzot61oVjBzsHR7evpsGNpikxnIMBl5dtZrKVWyZQx+pik7x+vS23NMKaVybhpaR4bTZneJ9XcW4sbE7h5Y86duwogpvzIq+8LNWPP/7o9rOEhTnnqwt/ivEbXraGwoMb3Nhl1kq0DOpYXWyS1y+XXVfCWi3uuOMOx/+7dOkihHdGRga9//77YvFXV7B2z7bzujYntpnJaAbhzy9Z7X3+4h+FZZR/pYpSm5upfVKMFHWsZpllwiZ5G/Z2jEwaYZ2UlCRWz+Zpts7wflPszXWJj48Xi8SeOHHCbR5efsjVgp7cUGRsLNzQZS27P/jwm7O0Zs9pKq+qoWbmMBrbJ4Pu6Zmm6ToORJllwiRxG/a2zNLcWUREBPXo0YO2bdtW643K+2xn9hdlZWVi1Wj7mnFA3+QUlAmhx5/Q6QnR4pf3OV2ryFhm0HSkEdYMmx44LOTbb78t1mebMmUKlZeXO7xDeF065wFIHpQ8ePCg2Pj/ubm54v/OWvNjjz1GX3zxhYg9vGvXLrr77ruFBj9q1Kig3CMILPlXrgrtNKmZmUJCTOKX9zldq8hYZtB0pDGDMPfddx8VFBTQ3LlzxerHHHh9y5YtjkHHM2fO1Pqk4FmFvJConUWLFomtf//+It4ww4uCsmDmlbl5Qc+bb76Z9uzZI/4P9E9q80hhRigsrxJCj395n9O1ioxlBk0HUff8AA8wxsXFUUlJiZQDjJcvX6bExEQp7X0y2H/VqGPYrPXThr2VH1Jp1gCoAQu57hkJwozA2mlWsvY9K2QsM2gaENYAEAlhJ5vAk7HMoPHI980AgGSwP/SPuSXiF4DGAs0aABVh2/I7e05RXEgVldjO05g+mYa1LYOmAc0aACfYV3lXTqFffJad/aFTY8x+84f2ZxmBPECzBkAlDwu7P3RGQhSZQqopqVkEnS6qFOmNtTXDC8S4QLMGQKVZgc7+0IpNabI/NGYuGhsIawBUmhXI2jNrvhy3Ir+sSvzyfmO1asxcNDYwgwCg4qxANlF0S4+jcxcKqG2rZOqQ0vhJU5i5aGygWQNQRws+U1TRZC3YGQ5femObuCaHMVWzjED7QLMGqsL2VDVn2fnz+jLMClSrjGo+J7XbgFGAsAaqobbnghrXl2FWoL/LqOZzgveK/4AZBKiC2p4LMnlGaHkGo5r1KNMzkgEIa6AKansuyOIZwZrlrPe/p5VfnxS/vK8l1KxHWZ6RLEBYA1Vw9lyw+cHHONDX9wd2zfJqtZWiIkLFr9Y0SzXrUYZnJBMQ1kAV1PZckMEzgjXIvJKrdKG4ks5drhS/vK8lzVLNepThGckEBhiBaqjtXdGY6wfSM8FSY6PSq9VkIoUiQk1UY1PEPqeria/3qOZzksHDRhYgrIGqqO1d4cv1A+2ZEBEWQjHmMLJUW8litVF4SAhFhIeKdLVo7D2q+Zxk8LCRAZhBQMAJRtS4YHgmsCbZKj6KWsaZKS3hn7+8r5bNVgveF4gIqB7QrEFACZbfrd0zgYWY3TOB7ahNiYDnrc2W41lXVFdRZISZxqhosw3GPToDn2p1gbAGAaOu5sfeAbzPNk21hUmw4mr4MzaIlmOHBPPZGgWYQUDACKbfbTA9E/wVG0TL9wifavWBZg0CRrCjxhnBMyFY9xjsZ2sEoFmDgKEFv1v+W/2yknQpqIN5j1p4tnoHmjUIKEbQbo0Knq26QFiDgAO/W/2CZ6seMIMAAIAEQLMGmgAB6uUEzy1wQFiDoGOfTFFUYRFTsu/p0YYevvWaYBcLNMAbO36mDw/kUrXNRgnREZgEozIQ1iCo2CdTXCqropLKarJYFVqy/YQ4BoGtbUHNz8mqkAhSxSFQMQlGXWCzBkGN/cCf0KxRs6Bmd6+YiFCyKSQ0NsSX0Cb8XPj58HPi58XPjZ8fP0d/TYJBjJH6QLMGQY39wLZONn2wRh0TEULVVg4nyr+2gMW0AL7Bz4Wfzz+fk0LhoSYqs/wzqqA/JsEgxohroFmDoEZ0Y2HMNupQE1G5xSrSmkeFUUKzCMx+0yj8XPj58HNi+Lnx8+Pn2NSXqxYiB2oV6YT10qVLKTMzkyIjIyk7O5v27dvnNu/hw4dpxIgRIj9/qi1evLjJ1zQqasZ+YNv09Ns6UJv4KIqPDqcWMWbMftMw9tmK/Jz4efFz4+fnjzEGxBjRiRlkw4YNNHPmTFq2bJkQqix8Bw8eTMePH6eUlJR6+SsqKqh9+/b029/+lmbMmOGXaxoVtWM/cEcffGMruIEZfLYiYoy4x6Twd4YksDDt1asXvf7662LfZrNRWloaTZ8+nWbPnu3xXNacH330UbH565p2rly5QnFxcVRSUkLNm6sXAlMN+H4vX75MiYmJFBLi+UMLtkT16xj43s5sktevt/JDGs3aYrHQgQMHaM6cOY40fjCDBg2i3bt3B/SaVVVVYnOubHuj4U0muLz8vvam3MNvaiNiM+dfqaLU5mYR8lO2+9V6HQPf25lN8vr1ttzSCOvCwkKyWq2UmppaK533jx07FtBrLliwgObPn18vvaioiGpqaki2hlJaWioauzdaSXwIUXy8iV91QpsB/q9j4Fs7s0lev1x2XQlrLcGaONu5nTVrNp0kJCRIaQbhwVcuu4wNXQZQx+pik7x+w8LC9CWsk5KSKDQ0lPLz82ul837Lli0Dek2z2Sy2unBD0UJj8TVeAzd0rZRdr6COtVG/ORqMZeJtm5Cm5URERFCPHj1o27Zttd6ovN+3b1/NXFMLgzMzNhykp//2o/jlfQAASd83pBHWDJseVqxYQW+//TYdPXqUpkyZQuXl5TR+/HhxfOzYsbUGC3kA8eDBg2Lj/+fm5or/nzhxwutrygQmFACg374hjRmEue+++6igoIDmzp1LeXl51K1bN9qyZYtjgPDMmTO1PinOnz9P3bt3d+wvWrRIbP3796edO3d6dU2ZsE8o4MZon1DASyxh2jYwOvk66BtSCWtm2rRpYnOFXQA7+1Z740bu6ZoygQkFAOi3b0hlBgHBXbQUkdBAIPFne8vSwYK+0mnWoOnTgJ1HxNu1iPbqupi9CAJJY9tbjgdvD9kX9IWwNtiipfU6QXY6DWgX7dPgDH9CItA8UIvGtre/HjhHa/ae8SjgZV7QF2YQg4+Iv7P3NOUWV3o8D5HQQCBpTHvLLa4UbVlmb4+GgLA2EO46QVG5xevBGV6+ScbBGSAPjWlvReUW3SsUENYGwl0n4EDyeh+cAfLQmPaW0CxC9woFbNYG7AT8ecidgBvzmOx0ETy+IWQfnAFy4Wt7axMfRWOyM4TN2t629aZQSBXPWqvIFs+6rjeIzLGAZUD2eMsy1e/JSxXSKRS6i2cN/IfziLisMYABcIXM3h4Ngdc8AABIAIQ1AABIAIQ1AABIAIQ1AABIAIQ1AABIAIQ1AABIAIQ1AABIAIQ1AABIAIQ1AABIAGYw6gBPAdcBAProOxDWkoMVXAAwRt+BGURniwnoLeA6AGqQI2HfgbCWGKzgAoBx+g6EtcRgBRcAjNN3IKwNsKIGf9rtyinU9CceAGqQ46bty7j6EQYYdb6ihvMgSliIiQZ0TKZ7e6VrulEC0FRyCsro/f1naOfxAqqxKS4HEGVb/QjCWscB150HUcJCTXT6UgWt3nWadhwvoEm3tNf0yDcAjeXDb87S8v/7h2jvJhNRRot/DyCycHbuKzItVgAziAEGUaIiQul88VWhWYeaTFRttWl+5NvfGNEUZNR7XrPntGjj3Na5zXPb5z6g9QHEhoBmbYBBlILSKqrhxhsSQqGhRCkxZiost4iGy2sw6h3Z/Gn9gRHv2VlBEW28zEK8wiy3fe4DsZHhmh5AbAho1jrGPogSERpCNoXIarNRm7hIqqi2an7k28j+tE3FiPdcV0HhNs5tnds8t33uA1ofQGwICGudw9rUGw/0oPH9MiktMZqqbYoUI99G9qdtKka8Z1deHtzWuc1z2+c+IPuXBcwgBoAb8Oyhnei3vdKkGflWw5+WhZYM/rRNxYj37IxsXh7eAs3aQHCj7ZeVpJvG6w0y+tM2FSPesxHaOjRroHv0qml5woj3rHek06yXLl1KmZmZFBkZSdnZ2bRv3z6P+T/44AO67rrrRP7OnTvT5s2bax0fN26c0DyctyFDhqh8FyDQ6FHTaggj3rOekUpYb9iwgWbOnEnz5s2jb7/9lrp27UqDBw+mixcvusy/a9cuGjVqFE2YMIG+++47GjZsmNh+/PHHWvlYOF+4cMGxrVu3LiD3Y0Q/WAD0SE4A+rJJYb8eSWBNulevXvT666+LfZvNRmlpaTR9+nSaPXt2vfz33XcflZeX06ZNmxxpffr0oW7dutGyZcscmnVxcTH97W9/a3S5rly5QnFxcVRSUkLNmzeXyg+W6/Dy5cuUmJhIISFSvbulAXWs7/r9sIl92Vv5IY3N2mKx0IEDB2jOnDmONH4wgwYNot27d7s8h9NZE3eGNfG6gnnnzp2UkpJCCQkJdNttt9Hzzz9PLVq0cFuWqqoqsTlXtr3R8NYQ/ygso3f2nCL22M9IiBKj9bzfLT2O2icF9pOVy8vva2/KDRoH6li/9fsPP/Rlb8stjbAuLCwkq9VKqamptdJ5/9ixYy7PycvLc5mf051NIMOHD6d27dpRTk4OPfnkk3THHXcIQR/K0/1csGDBApo/f3699KKiIqqpqWnwXs5dKKG4kCpKjTGTKaSaWoSZKL+sis5dKKD4EEutvLnFlVRUbqGEZhHUJj6K/A03lNLSUtHYofWpA+pY7vrN9dAHfenL7uCy60pYq8XIkSMd/+cByC5dulBWVpbQtgcOHOjyHNbunTV21qzZHMOauTdmkLa2CCqxnafiEoWSmkWIt7HJZKa2rZIpMfHfb+O/HjhH7+z99+fVmOwMGt6jLfm7ofOgKpcdgkQdUMfy1u9fG+iD3vZlT4SFhelLWCclJQlNNz8/v1Y677ds2dLlOZzuS36mffv24m+dOHHCrbA2m81iqws3FG8aS4eU5jSmT6awc50uqvxnI+iTIdJrTRnee0bENkhLaCYaAe93z0z0++g+N3Rvyw4aB+pYvvrN8aIPetOXG8LbMksjrCMiIqhHjx60bds24dFhf6Py/rRp01ye07dvX3H80UcfdaRt3bpVpLvj3LlzdOnSJWrVqhUF0w/WPmWYYzvYpwzzBAdOhysWAOrjbR8MlE+7NMKaYdPDgw8+SD179qTevXvT4sWLhbfH+PHjxfGxY8dSmzZthE2Z+e///m/q378//elPf6I777yT1q9fT9988w0tX75cHC8rKxO25xEjRghtm23Wjz/+OHXo0EEMRKqNp1i6Rp8yDECwSfWhDwYiLrZU32Tsirdo0SKaO3eucL87ePAgbdmyxTGIeObMGeEnbadfv3703nvvCeHMPtkffvih8AS58cYbxXE2q/zwww/0m9/8hq699lrhj83a+//93/+5NHMEEkwZBiC4ZGmsD0rlZ61VGuNn7YvdTM3Pq2D7qBoB1LHc9Zujch/UnZ+1UZFp2SEA9EiWRvoghDUAAdTE1NbSgH6BsAagEbgTuq6mHg+/qY3DZ5ddv9xNS4YgB56AsAbAT7Eg6i6nJfxy95wWU4/Lr1SKyRU8QuR8zL7atlZixQDtgtEOAPy0vqH75bSqxHRld0ttGXnNROA9ENaSgvCqwalnT+sbOvvl2myKk1+uWcSVcH0sssE1E/GsA4PW6xlmEAnBJ3Pw6pnNFu4mStj9cvkc9su1n8PR1y6HWERcCbZZOx+z26bdXRPPOjB8KEE9Q1hLhju7qN32CdSvZ1cC2V73rqYe20NgcgAgjitRdxDRnZBn8KzVJ0eSPgVhLRmIGRL8em4oFoQnv1x3x1xdkz/J8azVJ1+SPgVhLRmIGaIOdd3mGqpnNSZK1L1mQ2WAq5+x+hQGGCVDa/EK9GKvnLHhID39tx/FL+9roZ49lcFVmUHj0MKz9gZo1hISqJCMRrdXaqGeXZVBFhurTNyjgWfdEBDWkqKVeAV6t1dqoZ7rlkEWG6tsZGngWXsCZhANoXU/Tz3i3jdaW/ZK2cusN3KC0Fd91qx5Ve+9e/fS6dOnqaKigpKTk6l79+5iwVmgbz9PvVB3YM6TK54W8VRmDDrqt696Lay//vprevXVV2njxo1UXV0t4q9GRUWJOLIswHntwkmTJtFDDz1EsbGx6pZaZ8AGGfyOpnV7ZV1clRkvfH33Va/MILySCq/SkpmZSZ999plYOp3XKeT1Clm7/vnnn+mpp54S6x3yiiu8ziHwnoamGwP/4CkGB3e0fllJUghqO85lRnwR/fdVrzRrXr/wL3/5C4WHh7s8zlo1b7w+4pEjR2otrQX04+cpO3oemNPzvWmJ1CD2Va8068mTJ7sV1HW5/vrraeDAgU0tl6GQxc9TdvQ8MKfne9MSWUHsq01y3ePVwe1xD+z4ew1CoyCj3VQ2ZBxM9BY935vWuCdIfdVnYX3y5EmaNm0a7dy5k65e/bedhm1k/JaxWq3+LqNh0Lqfp8zYvSS4k+n1pVhXiDDsXqa3+zRqX/VZWD/wwANCMK9cuZJSU1OFgAZAyxjJS8IuRIx0z0bBZ2H9/fff04EDB6hjx47qlAgAP2JEt0gj3rMR8HkGY69evejsWQSNAXJgRLdII96zEfBZs/6f//kfMfElNzeXbrzxxnpeIl26dPFn+QBoEkZ0izTiPRsBn4V1QUEB5eTk0Pjx4x1pbLfGACPQIkb0kjDiPRsBn4X1f/7nf4pYIOvWrcMAI5ACI7pFGvGe9Y7PwpoDOH3yySfUoUMHdUoEgB9xDmzEU7ONhN0zxB4hDkLbYML6tttuEx4hENZA68B9DXVgaGH961//mmbMmEGHDh2izp071xtg5KBPAAQbuK+hDsjowpo9QZhnn3223jEMMAKtgMBGqAMyup81xwJxt0FQA62AwEaoA72BZb2ALkEkQ9SB3mhU1L39+/fTjh076OLFi/Wi7r388sukJkuXLqWXXnqJ8vLyqGvXrrRkyRLq3bu32/wffPABPf3003Tq1Cm65ppraOHChTR06FDHcbbnzZs3j1asWEHFxcX0H//xH/TnP/9Z5AVyowX3tcrKSjpz5owY20lMTDRkHYAgCesXXnhBrArDsUHq+lmr7XO9YcMGmjlzJi1btoyys7Np8eLFNHjwYDp+/DilpKTUy79r1y4aNWoULViwgH71q1/Re++9R8OGDaNvv/1WzL5kXnzxRXrttdfo7bffFutIsmDna/IiCpGRTftc9HY9PG/yOedhZO18gVwjMNjrEW7atIlGjx4tQglznPd+AwbRstdeDvjcBPu926eb673e/VV+S42NIsJCvO6XTe3jDWFSWLX0ARbQrJ2OGzeOAg0LaI5N8vrrr4t91urT0tJo+vTpNHv27Hr5eSmy8vJy0Wns9OnTh7p16yYEPt9669atadasWfTYY4+J4yUlJeIeV69eTSNHjvSqXFeuXBFrUvK59nje3rpMeZPPOQ83IC63OTzUL65YXIe8jiZrfSEhIbpxIwu2y9qxY8fE5DEOI8z1ysKaFYBxs56ht158mgKJ3uvd5sc2bC//heJKKquqodjIcGoZF9lgv2xKH3clP1zh851xZbCpINBYLBYR7W/QoEG1ysL7u3fvdnkOpzvnZ1hrtufn2NxsTnHOw5XGLwV312R4gWCuYOeNsQ+0nrh4hd7Zc4pIsVFGQpT45X1Odx6Q9Safc56kmHC6VHaVisqrKLlZuNvr+rqx8G/K+d5s3taJbH/L3bZ9+3bRZrmNmmMTxC9vf9/894CWwyj1rvihDdvLX2WpJku1lUyk0FVLNVVV13jsl03t47ypYgZhH2u2G7MJIpAUFhYKbxPWep3hfdZiXMGC2FV+Trcft6e5y+MKNqvMnz+/XnpRURHV1NTQuQslFBdSRakxZjKFVFOLMBPll1XRuQsFFB9iceT3Jp9znjKLhdrF8oeQiRLCLJQWHebyur7ADYUXQObGrqZm7W2dyPa33BEVFSW0aablNd0oqqZE1HFsWnpAy2GEerf5qQ3by98qNpTC2AQSaiKLVaG2sQpVWtz3y6b2cS67KsKazQW8gG5WVpZojHUnxfz1r38lvTNnzhxhO7fDmjWbYxISEsRnTFtbBJXYzlNxiUJJzSKEy5TJZKa2rZIpMfHf9ipv8jnniYqIoJOllcQWz9jmEZRbaXV5XV8bOttQuexqCmtv60S2v+WOW2+9lWbOeoyuXCmh8M5DyHr4Bzp69Ch1uWlYQMthhHq3+akN28ufX1pDeeUhVG2zUViIiWrCTRQZ7r5fNrWPh4V5J4Z9vrNHHnlEeIJce+211KJFC2E2cN7UIikpiUJDQyk/P79WOu+3bNnS5Tmc7im//deXazJms1kIZeeNsX/qdkhpTmP6ZBKZQuh0UaX45X1Ot+fxNp9znsKyamoRE0kJzcxUUF7t9rq+btzQm3K+N5u3dSLb33K3ZWZm0pZPN9N1XXtRdGomUUgYdRo2jeZMmxjQchil3k1+aMP28psjwikiPJQUMlFkRDiZw8M89sum9nHeVBlgjI2NpfXr1wvtOtCwLZnd9Nhdz/5GTU9PF2tCuhtgrKiooI0bNzrS+vXrJ2JuOw8w8tcCDzLatWT2LGnqAKMs3iCBHGA0mjeInZ/yiik3v5DSWqWIThoM9FzvNj+34UB7g3g7wMgCyyfS09OVo0ePKsFg/fr1itlsVlavXq0cOXJEmTRpkhIfH6/k5eWJ42PGjFFmz57tyP/1118rYWFhyqJFi0SZ582bp4SHhyuHDh1y5PnjH/8orvHxxx8rP/zwg3LXXXcp7dq1UyorK70uV0lJCb/wxK9sWK1WpaCgQPzqkRMXS5WvTxSIX6PWsRbqQM/121S8lR8+26yfeeYZMYlk1apVFB0dTYGENWVe/GDu3LliAJBd8LZs2eIYIOTJB85vVtai2bea/cKffPJJMdHlb3/7m8PHmnn88ceFe9+kSZPEpJibb75ZXLOpPtYg+ATbfU8LoA70g89mEPYd5ZVi+DS2y9UdYOQJJ0bD688YDRJoM0ig4M/OGRsOinZqX9qK7Zqv3Nct4CaRYNWxlupATWySt2Fv5YfPmjXPAARA6yDiHOpAb/gsrNkEAoDWwaKxqAO94dU3g4+WEgCCDiLOoQ4MqVnfcMMNYlBv+PDhFBER4Tbfzz//LKLuZWRkuHSlAyCQIOIc6sBwwpr9mp944gl6+OGH6Ze//CX17NlT+CezxwRPseYANV999RUdPnxY+DxPmTJF/ZID4AVGXjTWyIsFG1ZYDxw4kL755hshkDlM6dq1a8Uq5xyrl2cWsofI2LFjRThInvIJgJYwovuaEe9Z7/g0wMg+yLwBIAtGXDTWiPdsBORzSgSgEe5r7A1hd1/jfXsgfj1ixHs2AhDWQNcYcdFYI96zEYCwBrrGiO5rRrxnI+C1zfr8+fPCAwQA2d3XGL16htg9QPh+4bJnUGHNvta8Qsz999+vbokMjFZCeurZhU/PXhJ6vjetEYy+6rWw/sMf/kCTJ0+mjz76iN58800RNAX4D3Q09dGzl4Se701rfBikvuq1zZonxPzwww906dIlsZyXc0B/4N+Oxr+8z+nAf+jZS0LP96YlcoLYV33ys27Xrp1Ytfn1118XU887depUb/0wI4ZIbSqIjhYY9BzYSM/3piXyg9hXfY66xzMXeVFcnql41113eb3YI3APOlpgvSRYE+IOZv+EtU9Hl228oG6Z3d0b0Edf9UnSrlixQqxVOGjQIBEHJDk5Wb2SGQh0tOAGNpJxvMBdmeEBot++6rWwHjJkCO3bt0+YQDgOCPAv6GiB9wyRdWCuoTJrtdx64Z4g9VWvhbXVahUDjG3btlW3RAbGl44m42e7FpFxvEDGMstAjg99KhgvRa+F9datW9UtCfAaGT/bZbVBauGlWLcMGOMwZp/C6KBkyPjZLqsNUgsd2F0ZMMZhvD4FYS0Z+AQOjA1SCx3YUxkwxmG8PoVATpKBiGrqwJ2SV1Oxd86GJpnYV57x52SIutdsqAx1ywz03aegWUsG3PwCgye7cEPmEU92bnfHXF2TNWfYptUnS5I+BWEtIfgEDl4HZjyZR1wJ3eE3tRHn/fXAOVqz90w9Ie/J3CGDENED90jQpyCsJQX+tMHpwGymcGffZFwJ3W7pcVR+pZLe2cvHqJ5A9mQzlUGI6IUsjfcpCGsAfOjAnswj7oVuFVWXW8SxtIRm9QRyQ654WhciIDBggBEAP63C4n6gykwJzSLcDmJhZRfgDdCsAfARd6YJd3bu9kkxdDnEQmOyM4TN2pX9GeYO0BAQ1gA0AnemCVdC12aziWPDe7Sl7pmJbgUyzB3AExDWAPgZT0IXAhk0FghrjaOF2BQAGJkcjfRBCGsNo4XYFAAYmQ811Ael8Qa5fPkyjR49mpo3b07x8fE0YcIEKivzPNX36tWrNHXqVGrRogXFxMTQiBEjKD8/v1YeHnmvu61fv56CDdZlBCC45GisD0ojrFlQ8+o0HKp106ZN9OWXX9KkSZM8njNjxgyxsO8HH3xAX3zxBZ0/f16sHVmXVatW0YULFxzbsGHDKBB4ii+BBVABCC75PvRBNWLFSGkGOXr0KG3ZsoX2799PPXv2FGlLliyhoUOH0qJFi6h169b1zikpKaG33nqL3nvvPbrtttscQpkX+d2zZw/16dPHkZc19ZYtW2rq8woxiwEILqle9sFAmUqk0Kx3794tBKpdUDO8DmRISAjt3bvX5TkHDhyg6upqkc/OddddR+np6eJ6zrCpJCkpiXr37k0rV64UnzueqKqqoitXrtTaGHbR8mY7cfEKvbPnFJFio4yEKPHL+5xuz9OuRTSNzU6nEBPR2aJy8cv7nO7t3/F24/v19zWxoY5lr992XvRBb/qyN5tuNOu8vDxKSUmplcarqicmJopj7s6JiIgQQt6Z1NTUWuc8++yzQvOOjo6mzz77jB5++GFhC3/kkUfclmfBggU0f/78eulFRUVUU1PT4P2cu1BCcSFVlBpjJlNINbUIM1F+WRWdu1BA8SEWR74B7aLpmoRMKiq3iBlwbeKjhO3en3BDKS0tFY2dX37A/6CO5a3fAQ30QW/7sie47JoX1rNnz6aFCxc2aAJRk6efftrx/+7du1N5eTm99NJLHoX1nDlzaObMmY591qzT0tIoISFBDIA2RFtbBJXYzlNxiUJJzSLE55XJZKa2rZIpMbG2a1BiIqne0HlQlcsOQaIOqGO56zcx0T992R2seHqVj4LIrFmzaNy4cR7ztG/fXtiTL168WCudNVh+w7mzNXO6xWKh4uLiWto1e4N4sk9nZ2fTc889J0wdZrPZZR5Od3WMG4o3jaVDSnMa0ydT2LlOF1UKO9eYPhkiPRhwQ/e27KBxoI71Wb8d/NCXvS1zUIV1cnKy2Bqib9++QuiyHbpHjx4ibfv27eKNysLVFZwvPDyctm3bJlz2mOPHj9OZM2fE9dxx8OBB8YZ2J6j9BWJBAKAP7glQX5bCZs0eHEOGDKGJEyfSsmXLxMDhtGnTaOTIkQ5PkNzcXBo4cCCtWbNGDBTGxcUJX2w2V7Btm80T06dPF4La7gnCbn2safN+ZGSkcAt84YUX6LHHHgvIfWHqMQD6ICsAfVkKYc2sXbtWCGgWyPzZwNrya6+95jjOApw154qKCkfaK6+84sjLZo3BgwfTG2+84TjOmvfSpUuFPzYPTnTo0IFefvll8VIA+kIrU4YDiRHvWc+YlIb81ECD8AAja/Ls2+3NAKOWYFMS2/7560Ov9tRgTxkORh0H+54DiU3yNuyt/JDvzkCjCcQsK62htSnDgcCI92yEti6NGQQ0Hm6wH+w/S9uPXySrTdG9puWMp/UN9WoaMOI9u/uqCA0x0W0dU+i3vdKkv3do1gZouA+/e4BW7TpFZy9XUHiIyVCalvultvQ7bd+I9+zqq4LbOrd5bvvcB7gvyAyEtQEarsVqE1NlQ0NCKLfkKkWHhxomKJQR1zc04j3X/argNs5tnds8t33uA7IrKDCDGKDhJseaqbDMIrQNq5XoYlkVxUaGG0LTMqpPuxHv2fmrgtu41crTz4nCQkNEH7hUZpHaFATN2gANt9JipdbxkVRjU8jKn4ehIYbRtOzwvfbLSsI965ysf31VcBvnts5tnts+9wHZTUHQrHXsT+u82naNVaGMxGga0DGZ7u2VbqgODIzFPf/6qnh//xnaebxAtH1zmGtTkEy+6BDWktOQP61RP4eBsclKjqE5Q6+ne3u5F8ay+aLDDGIAf1ojfg4D4Knty+iLDmEtMVj6CwDj9B0Ia4kxsj8tAEbrOxDWEmNkf1oAjNZ3MMAoORhABMAYfQfCWgcgLjYA+u87MIMAAIAEQFgDAIAEQFgDAIAEQFgDAIAEQFgDAIAEQFgDAIAEQFgDAIAEQFgDAIAEQFgDAIAEYAajAXEOuN6uRXSwiwOA38iRaDEBX4GwNhj1Aq5np9OAdt4JbD13BKA9fG1vfz1wjtbsPSPNYgK+AmFtIOoGXOewkO/sPU3XJGRSYqLnc2VbVQPIja/tLbe4UrRlRSFH2+bzOVCTXhQL2KwNhLuA60XlFo/nybiqBpCXxrS3onKLdIsJ+AqEtYFwF3A9oVmE7lbVAPLSmPaW0CxCusUEfAXC2uAB18dkZ1Cb+CjdraoB5KUx7a1NfJRoyzItJuArsFkbbGCmbsB19ga5fPmyV0KeP0W5I9htiHrqCEA7NLa9De/RlrpnJnoclJR5kBzC2oADM84B1202my5X1QBy09j2luVhMQHZB8lhBtERag8Ecifol5UEQQ0Cgj/bW44OBskhrHUEBgIB0G/fkEZYs1119OjR1Lx5c4qPj6cJEyZQWZnnt+Ly5ctpwIAB4hwecCguLvbLdbUKBgIB0G/fkEZYs0A9fPgwbd26lTZt2kRffvklTZo0yeM5FRUVNGTIEHryySf9el2ZvD0wEAgA6aNvKBJw5MgRhYu6f/9+R9qnn36qmEwmJTc3t8Hzd+zYIc4vKiry63XtlJSUiOvwrxY4cbFU+fpEgfhtCKvVqhQUFIhfoA6oY+3U7wkf+kag8FZ+SOENsnv3bmGi6NmzpyNt0KBBFBISQnv37qW77747oNetqqoSm50rV644PCu89a5QE3bHswdoaqg8fJwHW7RQbr2COtZO/bbzoW8ECm/LIYWwzsvLo5SUlFppYWFhlJiYKI4F+roLFiyg+fPn10svKiqimpoakgluKKWlpaKx80sK+B/UsbrYJK9fLrvmhfXs2bNp4cKFHvMcPXqUtMacOXNo5syZtTTrtLQ0SkhIEAOVsjV0tt9x2b1p6P8o5EkFVZTa3EztkySy90lUx8C3dmaTvH5ZQfQqHwWRWbNm0bhx4zzmad++PbVs2ZIuXrxYK501WPbk4GONpbHXNZvNYqsLNxQZGws3dG/KLvukAhnqGDSunZkkrl9vyxxUYZ2cnCy2hujbt69wuztw4AD16NFDpG3fvl28UbOzsxv999W6rlHCq/o7BKXMU4GNiBrPKxDtTFaksFl36tRJuOBNnDiRli1bRtXV1TRt2jQaOXIktW7dWuTJzc2lgQMH0po1a6h3794ije3OvJ04cULsHzp0iGJjYyk9PV3Ypb25Lqg9qYA7kH1SAbtAcbo/OtEbO36mDw/kUrXVJiKoQWuXQ/vl0KThoSF0T4829PCt12i+ncmMNN8Ma9eupeuuu04I5KFDh9LNN98sJr3YYUF7/Phx4VtthwVw9+7dhTBmfvGLX4j9Tz75xOvrAvUnFbCgXrL9hAggX1xRTZfKqqSbCmwk7NovPyd+Xvzc+Pnxc2wqepi8ohYm9t9T7eoGgQcY4+LiqKSkRMoBRrbR85dGMGzW3PEnvv0NnSuupJiIUKq2/rM5xkeH08J7uojYELLjSx3LwK6cQnriwx+EoGbCQ01UZrFS2/goWvFgzyZrwL62M5vk9eut/JDCDAK0gRqR9/ha1TYbRYSaqNqmiI5fbrGKT2toU9qEnws/H4vVRs34BWtT/vX8bH4xVyDCo2sgrIFPeApB2Ri4MyZER4hP3pLKaiqz2CjURMIGik6qTfi58PNh0wdr1Cyo46LCxXP01wvW3+1MD0BYA80EmucBpfAQ/w1WAfWwPx8xKGyzCUEtXawNyYCwBkEHn73yCuzBN7bCcwsQENZAE+CzV07w3AKHfEOnAABgQKBZg4CDmYr6Bc9WPSCsQUBBfBH9gmerLjCDgIChhUVL+W/xpA49z44Mxj1q4dnqHWjWIGAEO+6DETS/YN1jsJ+tEYBmDQJGMOM+BFPz49jMP+aWiF+93iNieqgPhDUwxKKlds2PNT675sf7nK62pjvr/e9p5dcnxS/v6+0edbMgrcaBGQQYYgKMs+bHQiwQmp9d062y1FCr2FDKL61RNTZzMO7RGUxuUhdo1iDgcCfmaHqB7MzB0PxYaF0orqS8kio6W/TPX95XS9PVgnYbjGdrFKBZA6n9bn25fqA1P0uNjcqqashE/45KZ6lSRLpaNPYe1XxO8L32DxDWQFrPhMZcP5DToyPCQig2MpyuWqrJYlUoLMREkRHhIl1NfL1HNZ+TETxwAgXMIEBKzwQZ/HpZk2wZF0mt4qOobWKU+OV9LXlIqFmPMjwjmYCwBlJ6JgTT88FXG3JkeChVWqziV2seEmrWowzPSCZgBgGqoLZnQrA9H7yFP/m7pcfRuQsF1LZVMnVI0dayb2rWoyzPSBagWQMpPRO04PngLe2TYujGNnHiV2uoWY8yPSMZwIK5fsAoC+bK7g0SjOupUcdqlFFmbxAbFswFoOmo7X3hz+vL4LmgVhnVfE5YoMA/yPcaAkAF1PRc8FdsEHhXGBto1gCoGDWONeF39pyiuJAqKrGdpzF9MhutCSOynbGBZg2ASlHjnDXh1BhzkzVhRLYzNhDWAKjkueDsZ2zyg58xvCuMDcwgAKgUO8RZE24RZvKLJozIdsYFwhoAlTwX7Jow26zzy6rIZDLTGD9owvCuMCYQ1gAYeAYjkAcIawBUnrjBMxfjQyyUmCjXZBOgLSCsgeGRYTKMHsoMmga8QYChkXGiiYxlBk0HwhoYGhnDeMpYZmAgYc2BWkaPHi0CncTHx9OECROorMyzJrF8+XIaMGCAOId9UouLi+vlyczMFMectz/+8Y8q3gnQEjJONJGxzMBAwpoF9eHDh2nr1q20adMm+vLLL2nSpEkez6moqKAhQ4bQk08+6THfs88+SxcuXHBs06dP93PpgVaRcaKJjGUGBhlgPHr0KG3ZsoX2799PPXv2FGlLliyhoUOH0qJFi6h169Yuz3v00UfF786dOz1ePzY2llq2bKlCyYEMyDjRRMYyAwMI6927dwvTh11QM4MGDRKxa/fu3Ut33313k67PZo/nnnuO0tPT6f7776cZM2ZQWJj7qqmqqhKbczxae1xd3mSCy8sDVLKV29+0axEtNsbfdaFWHatZZpmwSd6GvS23FMI6Ly+PUlJSaqWxMOVg43ysKTzyyCN00003iWvt2rWL5syZI0whL7/8sttzFixYQPPnz6+XXlRURDU1NSRbQyktLRWNXcbA7TKAOlYXm+T1y2XXvLCePXs2LVy4sEETiJrMnDnT8f8uXbpQREQETZ48WQhks9ns8hwW6M7nsWadlpZGCQkJUq4UwzZPLruMDV0GUMfqYpO8fj19xdfKR0Fk1qxZNG7cOI952rdvL+zJFy9erJXOGix7iPjb1pydnS2uferUKerYsaPLPCzEXQlybigyNhZu6LKWXRZQx+pikrh+vS1zUIV1cnKy2Bqib9++wu3uwIED1KNHD5G2fft28UZl4epPDh48KCqvrtnFE/ZlLO22axk/IfntLmNDlwHUsbrYJK9fu9xocDlcRRKGDBmidO/eXdm7d6/y1VdfKddcc40yatQox/Fz584pHTt2FMftXLhwQfnuu++UFStWcC0oX375pdi/dOmSOL5r1y7llVdeUQ4ePKjk5OQo7777rpKcnKyMHTvWp7KdPXtWXB8bNmzYqJEbyxFPSLO6OZs8pk2bRhs3bhRvzxEjRtBrr71GMTH/dFlis0W7du1ox44dYiIM88wzz7gcCFy1apUwv3z77bf08MMP07Fjx4R3B58/ZswYYY92Z69292Y/f/68cAHkzzGZsNvbz549K529XRZQx+pyRfL6ZRHMXwbsguzpy0AaYQ3Ua+hxcXFUUlIiZUOXAdSxulwxSP3KZ+ABAAADAmENAAASAGFtcNg2P2/ePJ9s9MA3UMfqYjZI/cJmDQAAEgDNGgAAJADCGgAAJADCGgAAJADCGgAAJADC2oCotUSakVm6dKlYIi4yMlLEq9m3b5/H/B988AFdd911In/nzp1p8+bNASur3uv38OHDYoazfcm+xYsXkx6AsDYgai6RZkQ2bNggQhSw+xiHMOjatSsNHjy4XqRIOxw3fdSoUeIl+d1339GwYcPE9uOPPwa87Hqs34qKChGtkxcV0dUKUL6FUwKyc+TIERE0Zv/+/Y60Tz/9VDGZTEpubm6D5+/YsUOcX1RUpHJJ5aF3797K1KlTHftWq1Vp3bq1smDBApf57733XuXOO++slZadna1MnjxZ9bIaoX6dycjIEMHa9AA0a4PR0BJpwDcsFosI3ct1aIfrkve5rl3B6c75GdYU3eU3Mo2pX70CYW0w1FwizYgUFhaS1Wql1NTUWum8764+Od2X/EamMfWrVyCsdQIvkcaDKZ42DgULAJATKRbMBXIukWYEkpKSKDQ0lPLz82ul8767+uR0X/IbmcbUr16BZq0TeHk0dgXztPFiwM5LpNlRa4k0I8B1ykvNbdu2zZHGdcn7XNeu4HTn/Ax75rjLb2QaU7+6JdgjnEAfS6QZmfXr1ytms1lZvXq18LaZNGmSEh8fr+Tl5YnjY8aMUWbPnu3I//XXXythYWHKokWLlKNHjyrz5s1TwsPDlUOHDgXxLvRTv1VVVaJt8taqVSvlscceE///+eefFZmBsDYgLGBZOMfExCjNmzdXxo8fr5SWljqOnzx5UghkdtOzwwLF1bpxq1atCtJdaIslS5Yo6enpSkREhHA127Nnj+NY//79lQcffLBW/vfff1+59tprRf4bbrhB+fvf/x6EUuuzfk/+q/3W3TifzCBEKgAASABs1gAAIAEQ1gAAIAEQ1gAAIAEQ1gAAIAEQ1gAAIAEQ1gAAIAEQ1gAAIAEQ1gAAIAEQ1gA0gePHj4uAQqWlpQH/21u2bKFu3bqJWBlA/0BYA0PDsZL79etHw4cPr5VeUlJCaWlp9Pvf/97j+XPmzKHp06dTbGwsBRpeZi08PJzWrl0b8L8NAg+mmwPD89NPPwkNdcWKFWJ9Smbs2LH0/fff0/79+0XkN1ecOXOGOnToQCdPnqQ2bdpQsBaSXb16tSgn0DfQrIHhufbaa8XiqqwhX7hwgT7++GNav349rVmzxq2gZt5//32xeKuzoGbBycum8ULEHTt2pOjoaLrnnnvEIq5vv/22WHE7ISGBHnnkEaHV2+H0559/XrwkYmJiKCMjgz755BMqKCigu+66S6R16dKFvvnmm1pl+PWvfy3ScnJyVKodoBmCHUkKAC1gs9mUAQMGKAMHDlRSUlKU5557rsFzfvOb3ygPPfRQrTSOQsjhTn/5y18q3377rfLFF18oLVq0UG6//XaxUO7hw4eVjRs3iuhxHPrTeWHXxMREZdmyZcpPP/2kTJkyRURE5HC2HKHv+PHjyrBhw5ROnTqJsjqTmpqK6IcGAMIagH/BsaVZf+ncubNSXV3dYP6uXbsqzz77bK00Fpp8jRMnTjjSeNXy6OjoWmFoBw8eXGs1cxbWDzzwQK344Xydp59+2pG2e/dukcbHnOHY5M8880wj7hjIBMwgAPyLlStXCrMF26DPnTvXYP7KykqKjIysl87XyMrKqrW4K5s52JThnFZ3eTU2czgfZzp37lwvre55UVFRwswC9A2ENQBEtGvXLnrllVeErbl37940YcIE/upscH3AoqKieunsoeEML1bsKq2uy51zHj7uLq3uebx+Ji/rBvQNhDUwPKyV8mLDU6ZMoVtvvZXeeust2rdvHy1btszjed27d6cjR45QMLl69aoYXOSyAH0DYQ0MD/tKsxbNHiEMmywWLVpEjz/+OJ06dcrteYMHD6bdu3fX8uoINHv27CGz2Wy8xWMNCIQ1MDRffPGF8FVetWqVsDXbmTx5spgs48kccscdd1BYWBh9/vnnFCzWrVsnfMOdyw70CSbFANAEWNCzP/T//u//BvxvFxYWCl9u9rNu165dwP8+CCxhAf57AOgK1sCLi4tFbJBATzlnE80bb7wBQW0QoFkDAIAEwGYNAAASAGENAAASAGENAAASAGENAAASAGENAAASAGENAAASAGENAAASAGENAAASAGENAAASAGENAAASAGENAAASAGENAAASAGENAAASAGENAAASAGENAAASAGENAAASAGENAAASAGENAAASAGENAAASAGENAAASAGEN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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "SpotDiagram(lens).view(add_airy_disk=True)" ] }, { "cell_type": "markdown", "id": "10a71581", "metadata": {}, "source": [ "### Conclusion" ] }, { "cell_type": "markdown", "id": "a2141eac", "metadata": {}, "source": [ "Congratulations! You have successfully:\n", "\n", "- Switched Optiland's computational backend to PyTorch.\n", "- Defined a parameterized singlet lens model.\n", "- Set up and executed a gradient-based optimization loop using PyTorch's `optim.Adam`.\n", "- Leveraged Optiland's differentiable ray tracing capabilities to calculate the RMS spot size as the loss function.\n", "- Observed how the optimizer iteratively adjusted the lens radii (and potentially thickness) to significantly minimize the RMS spot size, improving the lens's focus quality.\n", "\n", "This tutorial demonstrates the power of combining automatic differentiation frameworks like PyTorch with optical simulations. By directly accessing gradients through the differentiable ray tracer, we can use efficient optimization algorithms standard in machine learning for optical design tasks.\n", "\n", "**Next Steps:**\n", "\n", "- Experiment with optimizing different parameters (e.g., conic constants, different thicknesses).\n", "- Try different PyTorch optimizers or learning rates.\n", "- Define a more complex merit function incorporating other aberrations or constraints.\n", "- Explore using the GPU (`be.set_device('cuda')`) for potentially faster optimization, especially with more complex systems or larger ray sets.\n", "- Check out the gallery examples for more educative design examples that leverage the DRT!" ] } ], "metadata": { "kernelspec": { "display_name": ".venv", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.13.2" } }, "nbformat": 4, "nbformat_minor": 5 }