{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Custom Variable Scaling\n", "\n", "While default variable scaling is often sufficient for many applications, users may wish to customize this for their optimization problems. This entails explicitly specifying the scaling behavior of a variable during optimization. Recall that scaling is applied to variables during optimization in order to bring the variables into approximately common range in order to improve convergence and optimizer performance." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "\n", "from optiland import optic, optimization\n", "from optiland.optimization.scaling import LinearScaler, ReciprocalScaler" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Define a starting lens:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "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, surface_type='even_asphere') # Second lens surface is an even asphere\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 with Custom Scaling\n", "\n", "Here, we will define three variables for the optimizer. Instead of using the default scaling for all of them, we will specify custom scaling strategies for each variable. Note that the default scaling for each variable type will suffice for most problems, but customization may be helpful for certain problems.\n", "\n", "1. **Surface 1 - Reciprocal Radius**: We use the `radius` variable type with the `ReciprocalScaler` scaler. This is often superior to a standard radius for optimization because it handles the transition from a convex to a concave surface (passing through infinity, or a flat surface) smoothly. For the optimizer, the variable value simply passes through zero, which is much more stable. Note that the `reciprocal_radius` variable itself also implements this strategy, but we build it manually to demonstrate the functionality.\n", "\n", "2. **Surface 2 - Custom Linear Scaled Radius**: For the second surface, we'll still vary the radius, but we'll override the default `LinearScaler` with our own parameters. This demonstrates how you can tune the scaling to a specific range you expect the variable to occupy.\n", "\n", "3. **Surface 2 - Aspheric Coefficient**: Aspheric surfaces provide more degrees of freedom to correct aberrations. However, their coefficients are often tiny (e.g., `1e-3`). We will vary the 2nd-order coefficient (`A_2`), which uses the `PowerScaler` by default to bring its value into a range the optimizer can handle effectively." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "# 1. Add the radius of surface 1 as a reciprocal variable\n", "reciprocal_scaler = ReciprocalScaler() # Use the ReciprocalScaler for this variable\n", "problem.add_variable(lens, \"radius\", surface_number=1, scaler=reciprocal_scaler, min_val=50.0)\n", "\n", "# 2. Add the radius of surface 2, overriding the default linear scaling\n", "linear_scaler = LinearScaler(factor=1/200.0, offset=0) # Scale relative to 200mm\n", "problem.add_variable(optic=lens, variable_type=\"radius\", surface_number=2, scaler=linear_scaler)\n", "\n", "# 3. Add the aspheric coefficient on surface 2.\n", "# This will use its own default, a PowerScaler.\n", "problem.add_variable(\n", " optic=lens,\n", " variable_type=\"asphere_coeff\",\n", " surface_number=2,\n", " coeff_number=0,\n", ")" ] }, { "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 │ 50 │ │\n", "│ 1 │ radius │ 2 │ -1000 │ nan │ │\n", "│ 2 │ asphere_coeff │ 2 │ 0 │ nan │ │\n", "╘════╧═════════════════╧═══════════╧═════════╧══════════════╧══════════════╛\n" ] } ], "source": [ "problem.info()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Define optimizer:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "optimizer = optimization.OptimizerGeneric(problem)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Run optimization:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ " message: CONVERGENCE: RELATIVE REDUCTION OF F <= FACTR*EPSMCH\n", " success: True\n", " status: 0\n", " fun: 0.007266126782113237\n", " x: [ 2.000e-02 -2.786e-01 -4.714e+00]\n", " nit: 6\n", " jac: [-7.485e-01 3.044e-05 3.128e-05]\n", " nfev: 84\n", " njev: 21\n", " hess_inv: <3x3 LbfgsInvHessProduct with dtype=float64>" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "optimizer.optimize(tol=1e-9)" ] }, { "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.00726613 │ 99.9759 │\n", "╘════╧════════════════════════╧═══════════════════╛\n", "╒════╤════════════════╤══════════╤══════════════╤══════════════╤══════════╤═════════╤═════════╤════════════════╕\n", "│ │ Operand Type │ Target │ Min. Bound │ Max. Bound │ Weight │ Value │ Delta │ Contrib. [%] │\n", "╞════╪════════════════╪══════════╪══════════════╪══════════════╪══════════╪═════════╪═════════╪════════════════╡\n", "│ 0 │ rms spot size │ 0 │ │ │ 1 │ 0.085 │ 0.085 │ 100 │\n", "╘════╧════════════════╧══════════╧══════════════╧══════════════╧══════════╧═════════╧═════════╧════════════════╛\n", "╒════╤═════════════════╤═══════════╤═══════════════╤══════════════╤══════════════╕\n", "│ │ Variable Type │ Surface │ Value │ Min. Bound │ Max. Bound │\n", "╞════╪═════════════════╪═══════════╪═══════════════╪══════════════╪══════════════╡\n", "│ 0 │ radius │ 1 │ 50 │ 50 │ │\n", "│ 1 │ radius │ 2 │ -55.7112 │ nan │ │\n", "│ 2 │ asphere_coeff │ 2 │ -0.000471431 │ nan │ │\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=12)" ] } ], "metadata": { "kernelspec": { "display_name": "optiland (3.13.2)", "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 }