{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Gradient-based Optimization\n", "\n", "Optimizing a lens using PyTorch optimizers." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import torch\n", "import torch.optim as optim\n", "\n", "import optiland.backend as be\n", "from optiland.optic import Optic\n", "from optiland.materials import IdealMaterial\n", "from optiland.analysis import SpotDiagram" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "be.set_backend(\"torch\") # all calculations will be done using torch\n", "be.set_precision(\"float32\") # or \"float64\" for double precision\n", "be.grad_mode.enable() # enable gradient calculation. Can also be set to \"disable\" to save memory if gradients are not needed.\n", "be.set_device(\"cuda\") # run on GPU if available, otherwise use \"cpu\" option" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "class Singlet(Optic):\n", " \"\"\"A simple singlet lens\"\"\"\n", "\n", " def __init__(self):\n", " super().__init__()\n", " ideal_material = IdealMaterial(n=1.5, k=0)\n", "\n", " self.surfaces.add(index=0, radius=be.inf, thickness=be.inf)\n", " self.surfaces.add(\n", " index=1, thickness=5.0, radius=100.0, is_stop=True, material=ideal_material\n", " )\n", " self.surfaces.add(index=2, radius=-50.0, thickness=65.0)\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)\n", "\n", " self.wavelengths.add(value=0.55, is_primary=True)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "optic = Singlet()\n", "optic.draw(num_rays=10)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "# Define parameters for optimization - radii of both surfaces\n", "params = [\n", " optic.surfaces.surfaces[1].geometry.radius,\n", " optic.surfaces.surfaces[2].geometry.radius,\n", "]" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "# Define torch optimizer - we use Adam\n", "optimizer = optim.Adam(params, lr=1.0)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Iteration 100/1000, Loss (RMS Spot Radius): 0.186711 mm\n", "Iteration 200/1000, Loss (RMS Spot Radius): 0.163222 mm\n", "Iteration 300/1000, Loss (RMS Spot Radius): 0.140186 mm\n", "Iteration 400/1000, Loss (RMS Spot Radius): 0.125758 mm\n", "Iteration 500/1000, Loss (RMS Spot Radius): 0.117216 mm\n", "Iteration 600/1000, Loss (RMS Spot Radius): 0.111742 mm\n", "Iteration 700/1000, Loss (RMS Spot Radius): 0.108024 mm\n", "Iteration 800/1000, Loss (RMS Spot Radius): 0.105290 mm\n", "Iteration 900/1000, Loss (RMS Spot Radius): 0.103213 mm\n", "Iteration 1000/1000, Loss (RMS Spot Radius): 0.101592 mm\n" ] } ], "source": [ "num_iterations = 1000\n", "\n", "loss_values = []\n", "\n", "for k in range(num_iterations):\n", " # == zero gradients ==\n", " optimizer.zero_grad()\n", "\n", " # == compute loss function ==\n", " spot = SpotDiagram(optic)\n", " # convert from 2D tensor to scalar\n", " loss = spot.rms_spot_radius()[0][0]\n", "\n", " # == compute gradients ==\n", " loss.backward()\n", "\n", " # == step optimizer ==\n", " optimizer.step()\n", "\n", " loss_values.append(loss.item())\n", "\n", " if (k + 1) % 100 == 0:\n", " print(\n", " f\"Iteration {k + 1}/{num_iterations}, Loss (RMS Spot Radius): {loss.item():.6f} mm\"\n", " )" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(range(num_iterations), loss_values)\n", "plt.xlabel(\"Iteration\")\n", "plt.ylabel(\"Loss (RMS Spot Radius) [mm]\")\n", "plt.grid(alpha=0.25)\n", "plt.show()" ] } ], "metadata": { "kernelspec": { "display_name": ".venv", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.13.2" } }, "nbformat": 4, "nbformat_minor": 2 }