{ "cells": [ { "attachments": {}, "cell_type": "markdown", "id": "262a5ec8-2553-4237-ab62-319b6ca22089", "metadata": {}, "source": [ "# Example-56: Trajectory" ] }, { "cell_type": "code", "execution_count": 1, "id": "601c2f09-bb6b-4819-97a4-445960bfb5f6", "metadata": {}, "outputs": [], "source": [ "# In this example usage of differentiable trajectory generators is illustrated\n", "# This generators can be defined to genetate parametic trajectories at one or several observation locations\n", "# Given initial condition, number of iterations and deviation variables, generators return corresponding orbit data \n", "# Generators are differentiable with respect to initial conditions and parametes" ] }, { "cell_type": "code", "execution_count": 2, "id": "ee722d5c-889a-4d7b-91b6-d8da0de8771b", "metadata": {}, "outputs": [], "source": [ "# Import\n", "\n", "import torch\n", "\n", "from pathlib import Path\n", "\n", "from matplotlib import pyplot as plt\n", "\n", "from model.library.line import Line\n", "from model.library.corrector import Corrector\n", "\n", "from model.command.external import load_lattice\n", "from model.command.build import build\n", "from model.command.wrapper import group\n", "from model.command.orbit import orbit\n", "from model.command.tune import tune\n", "from model.command.mapping import mapping\n", "from model.command.trajectory import trajectory\n", "\n", "torch.set_printoptions(linewidth=128)" ] }, { "cell_type": "code", "execution_count": 3, "id": "2f8dd87b-bbe6-418d-ae3e-8d58397d05ad", "metadata": {}, "outputs": [], "source": [ "# Build and setup lattice\n", "\n", "# Load ELEGANT table\n", "\n", "path = Path('ic.lte')\n", "data = load_lattice(path)\n", "\n", "# Build ELEGANT table\n", "\n", "ring:Line = build('RING', 'ELEGANT', data)\n", "ring.flatten()\n", "\n", "# Merge drifts\n", "\n", "ring.merge()\n", "\n", "# Turn off sextupoles and set linear dipoles\n", "\n", "for element in ring: \n", " if element.__class__.__name__ == 'Sextupole':\n", " element.ms = 0.0\n", " if element.__class__.__name__ == 'Dipole':\n", " element.linear = True \n", "\n", "# Add corrector\n", "\n", "corrector = Corrector('CXY')\n", "ring.append(corrector)\n", "\n", "# Split BPMs\n", "\n", "ring.split((None, ['BPM'], None, None))\n", "\n", "# Roll lattice start\n", "\n", "ring.roll(1)\n", "\n", "# Split lattice into lines by BPMs\n", "\n", "ring.splice()\n", "\n", "# Set number of elements of different kinds\n", "\n", "nb = ring.describe['BPM']\n", "nq = ring.describe['Quadrupole']\n", "ns = ring.describe['Sextupole']" ] }, { "cell_type": "code", "execution_count": 4, "id": "45371696-f7ab-4826-9d52-b8868bdf84fa", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "tensor([[ 0.0010, -0.0001, -0.0010, 0.0001],\n", " [-0.0042, 0.0085, -0.0041, -0.0059]], dtype=torch.float64)\n", "\n", "tensor([[ 0.0010, -0.0001, -0.0010, 0.0001],\n", " [-0.0042, 0.0085, -0.0041, -0.0059]], dtype=torch.float64)\n", "\n", "tensor([[ 0.0010, -0.0001, -0.0010, 0.0001],\n", " [-0.0042, 0.0085, -0.0041, -0.0059]], dtype=torch.float64)\n", "\n" ] } ], "source": [ "# One turn map transport\n", "\n", "corrector.cx = 0.0\n", "corrector.cy = 0.0\n", "\n", "state = torch.tensor([+1.0E-3, -1.0E-4, -1.0E-3, +1.0E-4], dtype=torch.float64)\n", "\n", "# Direct line tracking\n", "\n", "print(torch.stack([state, ring(state)]))\n", "print()\n", "\n", "# Mapping wrapper\n", "\n", "probe = 0\n", "other = len(ring) - 1\n", "transformation, *_ = mapping(ring, probe, other, matched=False)\n", "print(torch.stack([state, transformation(state)]))\n", "print()\n", "\n", "# Trajectory generator\n", "\n", "transformation = trajectory(ring, [probe], matched=False)\n", "print(transformation(1, state))\n", "print()" ] }, { "cell_type": "code", "execution_count": 5, "id": "11a49c92-aa55-439f-b250-c987fe547288", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "tensor([[ 0.0010, 0.0000, -0.0010, 0.0000],\n", " [-0.0045, 0.0090, -0.0039, -0.0056]], dtype=torch.float64)\n", "\n", "tensor([[ 0.0010, 0.0000, -0.0010, 0.0000],\n", " [-0.0045, 0.0090, -0.0039, -0.0056]], dtype=torch.float64)\n", "\n", "tensor([[ 0.0010, 0.0000, -0.0010, 0.0000],\n", " [-0.0045, 0.0090, -0.0039, -0.0056]], dtype=torch.float64)\n", "\n" ] } ], "source": [ "# One turn map transport (closed orbit)\n", "\n", "corrector.cx = +100.0E-6\n", "corrector.cy = -100.0E-6\n", "\n", "# Compute closed orbit\n", "\n", "guess = torch.tensor([0.0, 0.0, 0.0, 0.0], dtype=torch.float64)\n", "guess, *_ = orbit(ring, guess, [], limit=32, epsilon=1.0E-12, full=False)\n", "\n", "# Initial state around closed orbit\n", "\n", "state = torch.tensor([1.0E-3, 0.0, -1.0E-3, 0.0], dtype=torch.float64)\n", "\n", "# Direct line tracking\n", "\n", "print(torch.stack([state, ring(state + guess) - guess]))\n", "print()\n", "\n", "# Mapping wrapper (matched)\n", "# Note, mapping can be used to generate trajectory at a given location\n", "# But, for matched case, closed orbit will be computed on each invocation\n", "\n", "probe = 0\n", "other = len(ring) - 1\n", "transformation, *_ = mapping(ring, probe, other, matched=True, guess=guess, limit=32, epsilon=1.0E-12)\n", "print(torch.stack([state, transformation(state)]))\n", "print()\n", "\n", "# Trajectory generator (matched)\n", "\n", "transformation = trajectory(ring, [probe], matched=True, guess=guess, limit=32, epsilon=1.0E-12)\n", "print(transformation(1, state))\n", "print()" ] }, { "cell_type": "code", "execution_count": 6, "id": "2809c1b4-109e-4e2d-9581-10266f12cb17", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "tensor([[ 0.0010, 0.0000, -0.0010, 0.0000],\n", " [-0.0045, 0.0090, -0.0039, -0.0056]], dtype=torch.float64)\n", "tensor([[ 0.0010, 0.0000, -0.0010, 0.0000],\n", " [-0.0045, 0.0090, -0.0038, -0.0054]], dtype=torch.float64)\n", "\n", "tensor([[ 0.0010, 0.0000, -0.0010, 0.0000],\n", " [-0.0045, 0.0090, -0.0039, -0.0056]], dtype=torch.float64)\n", "tensor([[ 0.0010, 0.0000, -0.0010, 0.0000],\n", " [-0.0045, 0.0090, -0.0038, -0.0054]], dtype=torch.float64)\n", "\n" ] } ], "source": [ "# One turn map transport (closed orbit, parametric)\n", "\n", "corrector.cx = +100.0E-6\n", "corrector.cy = -100.0E-6\n", "\n", "# Compute closed orbit\n", "\n", "guess = torch.tensor([0.0, 0.0, 0.0, 0.0], dtype=torch.float64)\n", "guess, *_ = orbit(ring, guess, [], limit=32, epsilon=1.0E-12, full=False)\n", "\n", "# Initial state around closed orbit\n", "\n", "state = torch.tensor([1.0E-3, 0.0, -1.0E-3, 0.0], dtype=torch.float64)\n", "\n", "# Set random deviations parameters\n", "\n", "kn = 0.01*torch.randn(nq, dtype=torch.float64)\n", "ks = 0.01*torch.randn(nq, dtype=torch.float64)\n", "\n", "# Mapping wrapper (matched, parametric)\n", "\n", "probe = 0\n", "other = len(ring) - 1\n", "transformation, *_ = mapping(ring, probe, other, ('kn', ['Quadrupole'], None, None), ('ks', ['Quadrupole'], None, None), matched=True, guess=guess, limit=32, epsilon=1.0E-12)\n", "print(torch.stack([state, transformation(state, 0*kn, 0*ks)]))\n", "print(torch.stack([state, transformation(state, 1*kn, 1*ks)]))\n", "print()\n", "\n", "# Trajectory generator (matched, parametric)\n", "\n", "transformation = trajectory(ring, [probe], ('kn', ['Quadrupole'], None, None), ('ks', ['Quadrupole'], None, None), matched=True, guess=guess, limit=32, epsilon=1.0E-12)\n", "print(transformation(1, state, 0.0*kn, 0.0*ks))\n", "print(transformation(1, state, 1.0*kn, 1.0*ks))\n", "print()" ] }, { "cell_type": "code", "execution_count": 7, "id": "314838a2-1b2d-4213-8b54-65bc0c57046e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "tensor([[ 0.0010, 0.0000, -0.0010, 0.0000],\n", " [ 0.0034, -0.0066, 0.0020, 0.0045],\n", " [-0.0045, 0.0090, -0.0039, -0.0056]], dtype=torch.float64)\n", "tensor([[ 0.0010, 0.0000, -0.0010, 0.0000],\n", " [ 0.0034, -0.0066, 0.0020, 0.0045],\n", " [-0.0044, 0.0088, -0.0039, -0.0056]], dtype=torch.float64)\n", "\n", "tensor([[ 0.0010, 0.0000, -0.0010, 0.0000],\n", " [ 0.0034, -0.0066, 0.0020, 0.0045],\n", " [-0.0045, 0.0090, -0.0039, -0.0056]], dtype=torch.float64)\n", "tensor([[ 0.0010, 0.0000, -0.0010, 0.0000],\n", " [ 0.0034, -0.0066, 0.0020, 0.0045],\n", " [-0.0044, 0.0088, -0.0039, -0.0056]], dtype=torch.float64)\n", "\n" ] } ], "source": [ "# Several observation locations (closed orbit, parametric)\n", "\n", "corrector.cx = +100.0E-6\n", "corrector.cy = -100.0E-6\n", "\n", "# Initial state around closed orbit\n", "\n", "state = torch.tensor([1.0E-3, 0.0, -1.0E-3, 0.0], dtype=torch.float64)\n", "\n", "# Set random deviations parameters\n", "\n", "kn = 0.01*torch.randn(nq, dtype=torch.float64)\n", "ks = 0.01*torch.randn(nq, dtype=torch.float64)\n", "\n", "# Mapping wrapper for one turn (matched, parametric)\n", "\n", "t1, *_ = mapping(ring, 0, 0, ('kn', ['Quadrupole'], None, None), ('ks', ['Quadrupole'], None, None), matched=False, limit=32, epsilon=1.0E-12)\n", "t2, *_ = mapping(ring, 1, len(ring) - 1, ('kn', ['Quadrupole'], None, None), ('ks', ['Quadrupole'], None, None), matched=True, limit=32, epsilon=1.0E-12)\n", "\n", "print(torch.stack([state, local := t1(state, 0*kn, 0*ks), t2(local, 0*kn, 0*ks)]))\n", "print(torch.stack([state, local := t1(state, 1*kn, 1*ks), t2(local, 1*kn, 1*ks)]))\n", "print()\n", "\n", "# Trajectory generator (matched, parametric)\n", "\n", "transformation = trajectory(ring, [0, 1], ('kn', ['Quadrupole'], None, None), ('ks', ['Quadrupole'], None, None), matched=True, limit=32, epsilon=1.0E-12)\n", "\n", "print(transformation(1, state, 0.0*kn, 0.0*ks))\n", "print(transformation(1, state, 1.0*kn, 1.0*ks))\n", "print()" ] }, { "cell_type": "code", "execution_count": 8, "id": "9c3a8d28-5261-4fb8-acb1-4024b58e9d42", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Multi-turn trajectory generator (single location)\n", "\n", "corrector.cx = 0.0\n", "corrector.cy = 0.0\n", "\n", "transformation = trajectory(ring, [0])\n", "\n", "state = torch.tensor([1.0E-3, 0.0, -1.0E-3, 0.0], dtype=torch.float64)\n", "qx, px, qy, py = transformation(2**10, state).T\n", "\n", "plt.figure(figsize=(6, 6))\n", "plt.errorbar(qx, px, color='red', fmt=' ', marker='x', ms=1)\n", "plt.errorbar(qy, py, color='blue', fmt=' ', marker='x', ms=1)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 9, "id": "c1428093-b298-41eb-b8c8-bc96163baf8d", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "torch.Size([2048, 4])\n", "torch.Size([2, 1024, 4])\n" ] }, { "data": { "image/png": "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4pFHHgl8PTg4KK655poRE/p+8IMfhNxXXl5+SULfs88+G3jc5/MNmZg6mvfSzPQ4x0IIcfbsWTF79mxx5513ioGBgWi+JMPR4xyfOnUq5H9vTU2NACDefvttcebMmWi/xJhjEGJyy5YtE0VFRaK+vl588sknYvbs2SFLDs+ePSvy8/NFfX194L6HHnpITJ8+XezatUvs379flJeXi/Ly8sDjavloZWWlOHDggNi+fbuYNGnSkEt0lURdHSOEfuf49ddfFykpKeKFF14QX331VeDS3t4enxceQ1u2bBHp6enilVdeEc3NzWL16tUiJycnsFro7rvvFuvWrQscv3v3bpGSkiKeffZZcezYMbFx48Yhlzbm5OSId999Vxw6dEjceuutQy7RHem9TCR6nOOzZ8+KWbNmiaVLl4qzZ8+G/N4mIr1+j7VOnDhh6tUxDEJM7uuvvxYrVqwQEydOFHa7Xdx///3iwoULgcfVL+iHH34YuK+7u1s8/PDD4sorrxQ2m0386Ec/uuSfxMmTJ8Utt9wiMjMzhcPhEGvXrhX9/f3DtiORgxC9zvFNN90kAFxyuffee2P9kuPi+eefF9OnTxdpaWmitLRU7N27N/DYTTfddMnrfOutt8ScOXNEWlqauP7660V1dXXI436/X/zqV78Subm5Ij09XSxdulS43e6QYy73XiaaeJ/jl19+ecjf2UQedNfj91jL7EGIRQgh4jr/Q0RERASujiEiIiKdMAghIiIiXTAIISIiIl0wCCEiIiJdMAghIiIiXTAIISIiIl0wCCEiIiJdMAghIiIiXTAIISIiIl0wCCEiIiJdMAghIiIiXfz/rRdEcPvicI0AAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Multi-turn trajectory generator (several locations)\n", "\n", "corrector.cx = 0.0\n", "corrector.cy = 0.0\n", "\n", "# Set list of observation locations and trajectory generator\n", "\n", "locations = [0, 1]\n", "transformation = trajectory(ring, locations)\n", "\n", "# Define initial state\n", "\n", "state = torch.tensor([1.0E-3, 0.0, -1.0E-3, 0.0], dtype=torch.float64)\n", "\n", "# Generate orbit and drop the last value\n", "\n", "*out, _ = transformation(2**10, state)\n", "out = torch.stack(out)\n", "print(out.shape)\n", "\n", "# Group by observation point\n", "\n", "out = out.reshape(-1, len(locations), 4).swapaxes(0, 1)\n", "print(out.shape)\n", "\n", "# Plot trajectory at the second observation location\n", "\n", "_, out = out\n", "qx, px, qy, py = out.T\n", "\n", "plt.figure(figsize=(6, 6))\n", "plt.errorbar(qx, px, color='red', fmt=' ', marker='x', ms=1)\n", "plt.errorbar(qy, py, color='blue', fmt=' ', marker='x', ms=1)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 10, "id": "0689a09c-4695-4c38-ae33-38df574ba07c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "tensor([[0., 0., 0., 0.],\n", " [0., 0., 0., 0.],\n", " [0., 0., 0., 0.]], dtype=torch.float64)\n", "\n", "tensor([[[ 1.0000, 0.0000, 0.0000, 0.0000],\n", " [ 0.0000, 1.0000, 0.0000, 0.0000],\n", " [ 0.0000, 0.0000, 1.0000, 0.0000],\n", " [ 0.0000, 0.0000, 0.0000, 1.0000]],\n", "\n", " [[ 3.3740, 2.1497, 0.0000, 0.0000],\n", " [-6.6355, -3.9313, 0.0000, 0.0000],\n", " [ 0.0000, 0.0000, -1.9826, 1.4845],\n", " [ 0.0000, 0.0000, -4.5279, 2.8859]],\n", "\n", " [[-4.4769, -2.6375, 0.0000, 0.0000],\n", " [ 8.9592, 5.0549, 0.0000, 0.0000],\n", " [ 0.0000, 0.0000, 3.9054, -2.0383],\n", " [ 0.0000, 0.0000, 5.5965, -2.6648]]], dtype=torch.float64)\n", "\n" ] } ], "source": [ "# Compute derivative with respect to initial condition\n", "\n", "corrector.cx = +100.0E-6\n", "corrector.cy = -100.0E-6\n", "\n", "# Generate transformation\n", "\n", "locations = [0, 1]\n", "transformation = trajectory(ring, locations, ('kn', ['Quadrupole'], None, None), ('ks', ['Quadrupole'], None, None), matched=True, limit=32, epsilon=1.0E-12)\n", "\n", "# Set deviations parameters\n", "\n", "kn = torch.zeros(nq, dtype=torch.float64)\n", "ks = torch.zeros(nq, dtype=torch.float64)\n", "\n", "# Set initial condition\n", "\n", "state = torch.tensor([0.0, 0.0, 0.0, 0.0], dtype=torch.float64)\n", "\n", "# Compute value\n", "\n", "print(transformation(1, state, kn, ks))\n", "print()\n", "\n", "# Compute derivative\n", "\n", "print(torch.func.jacrev(lambda state: transformation(1, state, kn, ks))(state))\n", "print()" ] }, { "cell_type": "code", "execution_count": 11, "id": "3b16b921-d035-43cf-9ad4-148a8f8bfe75", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "tensor([[0., 0., 0., 0.],\n", " [0., 0., 0., 0.],\n", " [0., 0., 0., 0.]], dtype=torch.float64)\n", "\n", "tensor([[[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]],\n", "\n", " [[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]],\n", "\n", " [[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n", " [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]]],\n", " dtype=torch.float64)\n", "\n" ] } ], "source": [ "# Compute derivative with respect to parameters\n", "\n", "corrector.cx = +100.0E-6\n", "corrector.cy = -100.0E-6\n", "\n", "# Generate transformation\n", "\n", "locations = [0, 1]\n", "transformation = trajectory(ring, locations, ('kn', ['Quadrupole'], None, None), ('ks', ['Quadrupole'], None, None), matched=True, limit=32, epsilon=1.0E-12)\n", "\n", "# Set deviations parameters\n", "\n", "kn = torch.zeros(nq, dtype=torch.float64)\n", "ks = torch.zeros(nq, dtype=torch.float64)\n", "\n", "# Set initial condition\n", "\n", "state = torch.tensor([0.0, 0.0, 0.0, 0.0], dtype=torch.float64)\n", "\n", "# Compute value\n", "\n", "print(transformation(1, state, kn, ks))\n", "print()\n", "\n", "# Compute derivative\n", "\n", "print(torch.func.jacrev(lambda kn: transformation(1, state, kn, ks))(ks))\n", "print()" ] } ], "metadata": { "colab": { "collapsed_sections": [ "myt0_gMIOq7b", "5d97819c" ], "name": "03_frequency.ipynb", "provenance": [] }, "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.12.1" }, "latex_envs": { "LaTeX_envs_menu_present": true, "autoclose": false, "autocomplete": true, "bibliofile": "biblio.bib", "cite_by": "apalike", "current_citInitial": 1, "eqLabelWithNumbers": true, "eqNumInitial": 1, "hotkeys": { "equation": "Ctrl-E", "itemize": "Ctrl-I" }, "labels_anchors": false, "latex_user_defs": false, "report_style_numbering": false, "user_envs_cfg": false } }, "nbformat": 4, "nbformat_minor": 5 }