Skip to content

Hello! I'm Victor, the author of this project.
I'm looking for funding to be able to keep working on it. If you can, please consider donating or sponsoring.
Thank you! ❤️

python
import torch
import torch.nn as nn
import torchlensmaker as tlm
import torch.optim as optim

# y = a*x^2
surface = tlm.Parabola(diameter=15, A=tlm.parameter(0.015))

lens = tlm.BiLens(surface, material="BK7", outer_thickness=1.0)

optics = nn.Sequential(
    tlm.PointSourceAtInfinity(beam_diameter=18.5),
    tlm.Wavelength(500, 800),
    tlm.Gap(10),
    lens,
    tlm.Gap(50),
    tlm.FocalPoint(),
)

print(optics)
Sequential(
  (0): PointSourceAtInfinity()
  (1): Wavelength()
  (2): Gap()
  (3): BiLens(
    (surface1): RefractiveSurface(
      (element): Sequential(
        (0): CollisionSurface()
        (1): RefractiveBoundary()
      )
    )
    (gap): Gap()
    (surface2): RefractiveSurface(
      (element): Sequential(
        (0): CollisionSurface()
        (1): RefractiveBoundary()
      )
    )
  )
  (4): Gap()
  (5): FocalPoint()
)
python
s1 = tlm.SphereR(diameter=15, R=7.5)

optics = tlm.Sequential(
    tlm.PointSource(beam_angular_size=20),
    tlm.Gap(15),
    tlm.KinematicSurface(nn.Sequential(
        tlm.CollisionSurface(s1),
        tlm.RefractiveBoundary("SF10-nd", "clamp"),
    ), s1, anchors=("origin", "extent")),

    tlm.KinematicSurface(nn.Sequential(
        
        tlm.CollisionSurface(s1),
        tlm.RefractiveBoundary("air", "clamp"),
        
    ), s1, scale=-1, anchors=("extent", "origin")),
)

tlm.show(optics, dim=2, end=20)
python
print(optics)
print()
print(optics[2].element[0])

      
# execute_tree = forward_tree(optics, tlm.default_input(2, torch.float64, sampling={"base": 5}))

# execute_tree[2].element[0].context
Sequential(
  (0): PointSource()
  (1): Gap()
  (2): KinematicSurface(
    (element): Sequential(
      (0): CollisionSurface()
      (1): RefractiveBoundary()
    )
  )
  (3): KinematicSurface(
    (element): Sequential(
      (0): CollisionSurface()
      (1): RefractiveBoundary()
    )
  )
)

CollisionSurface()
python
from typing import Any, Iterator
from dataclasses import dataclass

from torchlensmaker.core.full_forward import forward_tree

ins, outs = forward_tree(optics, tlm.default_input(sampling={"base": 5}, dim=2, dtype=torch.float64))
python
outs[optics]
OpticalData(dim=2, dtype=torch.float64, sampling={'base': DenseSampler(size=5)}, transforms=[[IdentityTransform 0x720e1d9169c0 dim=2 dtype=torch.float64], [TranslateTransform 0x720e1d8f3050 dim=2 dtype=torch.float64], [TranslateTransform 0x720f21658f50 dim=2 dtype=torch.float64], [TranslateTransform 0x720e1d916bd0 dim=2 dtype=torch.float64]], P=tensor([[29.8189, -1.6381],
        [29.9484, -0.8783],
        [30.0000,  0.0000],
        [29.9484,  0.8783],
        [29.8189,  1.6381]], dtype=torch.float64), V=tensor([[ 0.9468,  0.3219],
        [ 0.9892,  0.1466],
        [ 1.0000,  0.0000],
        [ 0.9892, -0.1466],
        [ 0.9468, -0.3219]], dtype=torch.float64), normals=None, rays_base=tensor([-0.1745, -0.0873,  0.0000,  0.0873,  0.1745], dtype=torch.float64), rays_object=None, rays_image=None, rays_wavelength=None, var_base=tensor([-0.1745, -0.0873,  0.0000,  0.0873,  0.1745], dtype=torch.float64), var_object=None, var_wavelength=None, material=<torchlensmaker.materials.NonDispersiveMaterial object at 0x720e465cffb0>, blocked=tensor([False, False, False, False, False]), loss=tensor(0., dtype=torch.float64))