{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Orthogonal Descent Optimization" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "\n", "from optiland import optic, optimization" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Define a starting lens:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "image/png": "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Rb9+/Sz3aJm7dVedWlRXV+thVdO1Zs0aWbJkib5JUXWSce6558q1117rQcoBAAAA5IqsCrKmTZvmOO2oo46SdevWRYc7deok8+bNS1PKAAAAACALmwsCAAAAQKYjyAIAAACAXG0u6OUzEZJ98BjS/DDimhrdzT5dqcKMvAE35A84IW/ADfkD5pjAiBGcEGQ1IRQK6feZM2d6nRQAAAAAGRIjFBcXO04PRJoKw3JcOByWiooK/YBirlpkFvW9qGem/elPf9JPXwcM5A24IX/ACXkDbsgfUFTopAIslQeCQec7r6jJaoI6eOXl5V4nAzZqa2t11/1FRUX6BRjIG3BD/oAT8gbckD9gcKvBMtDxBQAAAACkEEEWAAAAAKQQQRaylrpP7j/+4z/0O2BG3oAb8geckDfghvyB5qDjCwAAAABIIWqyAAAAACCFCLIAAAAAIIUIsgAAAAAghQiyAAAAACCFeBgxstIjjzwib731lmzatEkKCgpk1apVCfPs2LFDpk+fLuvWrZNWrVrJkCFDZNy4cZKfT7b3u6VLl8oTTzwhu3fvlp49e8pNN90kffr08TpZSKN3331X54GNGzfKrl275N5775VzzjknOl31+fTwww/Lc889JxUVFdK/f3/53e9+Jz/4wQ88TTda3sKFC+X111+XLVu26AfK9uvXTyZMmCDdunWLzlNTUyOzZs2SV155RUKhkJx22mk6f7Rr187TtKPlLVu2TL+2b9+uh7t37y6jR4+WM844Qw+TN5AsarKQldQT18877zy59NJLbafX19fLf/3Xf+mnsz/66KMydepUWbFihS5Uwd/UD9/MmTN1N7uLFy+WY489Vheg9uzZ43XSkEZVVVU6wL755pttpy9atEieeuopueWWW+Sxxx6T4uJinU9UAQr+D8CHDx+ug625c+fq35Px48frPGO4//775c0335S7775b5s2bpwN1dbEG/nfEEUfo/KAu0jz++ONy0kknycSJE2Xz5s16OnkDSVNduAPZ6oUXXogMHDgwYfzq1asjJ598cmTXrl3Rcc8880zk7LPPjoRCoTSnEul09dVXR+6+++7ocH19fWTQoEGRhQsXepoueOfEE0+MvP7669HhcDgcueCCCyKPP/54dNyBAwciAwYMiKxcudKjVMIre/bs0Xlk/fr10bxw6qmnRl599dXoPF988YWeZ8OGDR6mFF75yU9+EnnuuefIG2gWarLgSx9++KH06NHDUn0/YMAAqaysjF6Ngv+omsu///3vcuqpp0bHBYNBOeWUU2TDhg2epg2Z4+uvv9ZNSVW+MJSVlekmpercgdyimosq5eXl+l01MVW1W+bziGpK2KlTJ84jOUa1ivnzn/+sazlVs1LyBpqDm1PgS6oA1bZtW8s4I+BS0+BPe/fu1T+K8d+9Glb3XwDmc0D8PRQqn3B+yC3hcFjuu+8+fU+eujCnqDyg7vU97LDDLPOSP3LH559/LqNGjdL3XJWUlMiMGTP0vVmffvopeQNJI8hCxpg9e7a+T8KNuhnVfHMyAACH6ve//71u3bBgwQKvk4IM0rVrV/nDH/6gazn/8pe/6Pu61f1XQHMQZCFjXHnllTJ06FDXeTp37pzUutQV6o8//jipq9fwj8MPP1zy8vISOrlQw3zvsKvVbt++vSWfqI5SkDsB1urVq3XhuWPHjpb8oZoeHzhwwFJjwXkkd6jaqqOPPlp//tGPfiSffPKJLFmyRC644ALyBpLGPVnIGG3atNG1VG4vdeJLRt++fXV1v7mw/c4770hpaamu8oc/qfzRq1cvWbNmjaU50Nq1a3V7esC4WKMKRCpfGNQV648++kifO+Bvqvt+FWCpR388+OCDCRfvVKFaPerDfB5RzY3VY0E4j+Qm9TuigivyBpqDmixkJXVC27dvn35XJz/1vCxFXXlSz8RSz6344Q9/KJMnT5Zf/epX+oq1+jEdMWKEFBYWep18tKCRI0fqph29e/eW448/Xjf5UDctN1VLCn85ePCgbN261dLZhTpPtG7dWt+k/otf/EI/b0+dM1QhW50fOnToYHmWFvxJBVgrV67U92Kp3wvVBbfR+Ynqyl+9X3TRRfpRECq/qItz6p4cVYgmCPe/OXPmyOmnn67PE+o8ovLK+vXr9S0N5A00R0B1MdisJYAMoArRL774YsL4hx56SD/TQlEPElQPI1YnR3XjqnoYsXr2BQ8j9r+nn346+jBi1fyLhxHnHvUQ8jFjxiSMV+cBdf4wP4xYNf358Y9/rJ+ppe7FgL8ZvxHxpkyZEr0YYzxwVvUspzo/UL3Tqvxhbl4Kf7rjjjt0LbcKvlVQpZ63d/XVV+uLtwp5A8kiyAIAAACAFOKeLAAAAABIIYIsAAAAAEghgiwAAAAASCGCLAAAAABIIYIsAAAAAEghgiwAAAAASCGCLAAAAABIIYIsAAAAAEghgiwAQM4aOnSonHTSSfp14MCBtG9/3bp10e1PnDgx7dsHALSM/BZaLwAAaQtUxowZ4zj9xBNPlIcffthxulp22LBhUlZWJunWv39/Wblypdx3330SCoXSvn0AQMsgyAIAZDUjUIn35ptvyvTp02X48OGuy7dq1Urat28vXigoKNDbLioqIsgCAB+huSAAIKsZgYr5pZr+/c///I+MGjVKzj///Gatb8WKFXLOOefIX//6V7n44ovljDPOkN/+9rdSXV0tL774om5i+JOf/ERmzJgh9fX10eXU+AULFsjkyZPlrLPOkiFDhsgbb7wh3333ndxwww163OWXXy6ffPJJCxwFAEAmIcgCAPiKCrDU/U0nnHCCjB079pDWoQKqp556Su666y6ZPXu2rF+/Xm688UZ56623dPB2xx13yLPPPit/+ctfLMstWbJE16w9+eSTcuaZZ+qAa8qUKfLTn/5UFi9eLF26dNHDkUgkRXsLAMhEBFkAAN8Ih8Ny6623Sl5entx5550SCAQOaT11dXVyyy23SK9evXSwdt5558n7778vt912m3Tv3l3XSqnOKtT9YGann366XHLJJfKDH/xARo8eLZWVldK7d29dm9a1a1f593//d/niiy9k9+7dKdpjAEAmIsgCAPjG3Llz5cMPP9QdSZSWlh7yeoqLi3Wtk6Fdu3Zy1FFH6fu3DG3bttVNAc169uxpWUbp0aOHZRklfjkAgL/Q8QUAwBf+/Oc/6yZ5s2bN0jVJ30d+fn6T41Qtmao5c5rHqEWzGxe/HADAX6jJAgBkvU2bNsl///d/y/jx42XAgAFeJwcAkOOoyQIAZLW9e/fqTinU87AGDx4su3btskxX92e1adPGs/QBAHIPQRYAIKutXr1atm/frl+DBg1KmH7kkUfqbtkBAEiXQIR+ZAEAOUo92+oXv/iFXHHFFZ6mY+rUqbrredVhBwAg+3FPFgAgp6nnYKku2SsqKtK+7ffee09v++WXX077tgEALYeaLABAzlJNDNUzsZTOnTtLMJjea4/qocc7d+7Un0tKSqR9+/Zp3T4AoGUQZAEAAABACtFcEAAAAABSiCALAAAAAFKIIAsAAAAAUoggCwAAAABSiCALAAAAAFKIIAsAAAAAUoggCwAAAABSiCALAAAAACR1/h+dRZHME65i/gAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "lens = optic.Optic()\n", "\n", "# add surfaces\n", "lens.surfaces.add(index=0, thickness=np.inf)\n", "lens.surfaces.add(index=1, thickness=7, radius=1000, material=\"N-SF11\", is_stop=True)\n", "lens.surfaces.add(index=2, thickness=30, radius=-1000)\n", "lens.surfaces.add(index=3)\n", "\n", "# set aperture\n", "lens.set_aperture(aperture_type=\"EPD\", value=15)\n", "\n", "# add field\n", "lens.fields.set_type(field_type=\"angle\")\n", "lens.fields.add(y=0)\n", "\n", "# add wavelength\n", "lens.wavelengths.add(value=0.55, is_primary=True)\n", "\n", "# draw lens\n", "_ = lens.draw(num_rays=5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Define optimization problem:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "problem = optimization.OptimizationProblem()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Add operands (targets for optimization):" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "\"\"\"\n", "Define RMS spot size properties for the optimization:\n", " 1. Surface number = -1, implying last surface (image surface)\n", " 2. Normalized field coordinates (Hx, Hy) = (0, 0)\n", " 3. Number of rays = 5, corresponds to number of rings in hexapolar distribution\n", " (see distribution documentation)\n", " 4. Wavelength = 0.55 µm\n", " 5. Pupil distribution = hexapolar\n", "\"\"\"\n", "\n", "input_data = {\n", " \"optic\": lens,\n", " \"surface_number\": -1,\n", " \"Hx\": 0,\n", " \"Hy\": 0,\n", " \"num_rays\": 5,\n", " \"wavelength\": 0.55,\n", " \"distribution\": \"hexapolar\",\n", "}\n", "\n", "# add RMS spot size operand\n", "problem.add_operand(\n", " operand_type=\"rms_spot_size\",\n", " target=0,\n", " weight=1,\n", " input_data=input_data,\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Define variables - let radius of curvature vary for both surfaces, at surface index 1 and 2:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "problem.add_variable(lens, \"radius\", surface_number=1)\n", "problem.add_variable(lens, \"radius\", surface_number=2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Check initial merit function value and system properties:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "╒════╤════════════════════════╤═══════════════════╕\n", "│ │ Merit Function Value │ Improvement (%) │\n", "╞════╪════════════════════════╪═══════════════════╡\n", "│ 0 │ 30.0924 │ 0 │\n", "╘════╧════════════════════════╧═══════════════════╛\n", "╒════╤════════════════╤══════════╤══════════════╤══════════════╤══════════╤═════════╤═════════╤════════════════╕\n", "│ │ Operand Type │ Target │ Min. Bound │ Max. Bound │ Weight │ Value │ Delta │ Contrib. [%] │\n", "╞════╪════════════════╪══════════╪══════════════╪══════════════╪══════════╪═════════╪═════════╪════════════════╡\n", "│ 0 │ rms spot size │ 0 │ │ │ 1 │ 5.486 │ 5.486 │ 100 │\n", "╘════╧════════════════╧══════════╧══════════════╧══════════════╧══════════╧═════════╧═════════╧════════════════╛\n", "╒════╤═════════════════╤═══════════╤═════════╤══════════════╤══════════════╕\n", "│ │ Variable Type │ Surface │ Value │ Min. Bound │ Max. Bound │\n", "╞════╪═════════════════╪═══════════╪═════════╪══════════════╪══════════════╡\n", "│ 0 │ radius │ 1 │ 1000 │ │ │\n", "│ 1 │ radius │ 2 │ -1000 │ │ │\n", "╘════╧═════════════════╧═══════════╧═════════╧══════════════╧══════════════╛\n" ] } ], "source": [ "problem.info()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Define optimizer (Orthogonal Descent):" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "optimizer = optimization.OrthogonalDescent(problem)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Run optimization:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "optimizer.optimize(max_iter=100, tol=1e-3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Print merit function value and system properties after optimization:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "╒════╤════════════════════════╤═══════════════════╕\n", "│ │ Merit Function Value │ Improvement (%) │\n", "╞════╪════════════════════════╪═══════════════════╡\n", "│ 0 │ 0.00188088 │ 99.9657 │\n", "╘════╧════════════════════════╧═══════════════════╛\n", "╒════╤════════════════╤══════════╤══════════════╤══════════════╤══════════╤═════════╤═════════╤════════════════╕\n", "│ │ Operand Type │ Target │ Min. Bound │ Max. Bound │ Weight │ Value │ Delta │ Contrib. [%] │\n", "╞════╪════════════════╪══════════╪══════════════╪══════════════╪══════════╪═════════╪═════════╪════════════════╡\n", "│ 0 │ rms spot size │ 0 │ │ │ 1 │ 0.043 │ 0.043 │ 100 │\n", "╘════╧════════════════╧══════════╧══════════════╧══════════════╧══════════╧═════════╧═════════╧════════════════╛\n", "╒════╤═════════════════╤═══════════╤════════════╤══════════════╤══════════════╕\n", "│ │ Variable Type │ Surface │ Value │ Min. Bound │ Max. Bound │\n", "╞════╪═════════════════╪═══════════╪════════════╪══════════════╪══════════════╡\n", "│ 0 │ radius │ 1 │ 28.0266 │ │ │\n", "│ 1 │ radius │ 2 │ -1000 │ │ │\n", "╘════╧═════════════════╧═══════════╧════════════╧══════════════╧══════════════╛\n" ] } ], "source": [ "problem.info()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Draw final lens:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "_ = lens.draw(num_rays=5)" ] } ], "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 }