{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Optimize an optical readout based on ring resonators" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Imports" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import torch\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from tqdm.notebook import tqdm, trange\n", "from numpy.fft import fft, ifft, fftfreq\n", "from scipy.signal import butter, lfilter\n", "\n", "import photontorch as pt\n", "\n", "torch.manual_seed(33)\n", "np.random.seed(34)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Parameters" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
keyvaluedescription
nameenvname of the environment
t0.000e+00[s] full 1D time array.
t00.000e+00[s] starting time of the simulation.
t1None[s] ending time of the simulation.
num_t1number of timesteps in the simulation.
dtNone[s] timestep of the simulation
samplerateNone[1/s] samplerate of the simulation.
bitrateNone[1/s] bitrate of the signal.
bitlengthNone[s] bitlength of the signal.
wl[1.549e-06, 1.549e-06, ..., 1.551e-06][m] full 1D wavelength array.
wl01.549e-06[m] start of wavelength range.
wl11.551e-06[m] end of wavelength range.
num_wl10000number of independent wavelengths in the simulation
dwl2.000e-13[m] wavelength step sizebetween wl0 and wl1.
f[1.935e+14, 1.935e+14, ..., 1.933e+14][1/s] full 1D frequency array.
f01.935e+14[1/s] start of frequency range.
f11.933e+14[1/s] end of frequency range.
num_f10000number of independent frequencies in the simulation
df-2.499e+07[1/s] frequency step between f0 and f1.
c2.998e+08[m/s] speed of light used during simulations.
freqdomainTrueonly do frequency domain calculations.
gradFalsetrack gradients during the simulation
\n", "
" ], "text/plain": [ "Environment(name='env', t=array([0.000e+00]), t0=0.000e+00, t1=None, num_t=1, dt=None, samplerate=None, bitrate=None, bitlength=None, wl=array([1.549e-06, 1.549e-06, ..., 1.551e-06]), wl0=1.549e-06, wl1=1.551e-06, num_wl=10000, dwl=2.000e-13, f=array([1.935e+14, 1.935e+14, ..., 1.933e+14]), f0=1.935e+14, f1=1.933e+14, num_f=10000, df=-2.499e+07, c=2.998e+08, freqdomain=True, grad=False)" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cuda = torch.cuda.is_available()\n", "bitrate = 50e9 # bps\n", "dt = 1e-14 # new sampling timestep\n", "samplerate = 1/dt # new sampling rate\n", "angles = np.pi*np.array([0.5,0,-0.5,-0.5,-0.5,1,1]) # output angles of the output waveguides\n", "power = 1e-3 #[W]\n", "latencies = np.arange(0.01,2.5,0.1)\n", "num_bits = 500\n", "\n", "c = 299792458.0 #[m/s] speed of light\n", "neff = 2.86 # effective index\n", "ng = 3.0 # group index of waveguide\n", "wl0 = 1.55e-6\n", "\n", "# Set global environment\n", "environment = pt.Environment(\n", " wl=np.linspace(1.549e-6,1.551e-6,10000),\n", " freqdomain=True,\n", ")\n", "pt.set_environment(environment);\n", "pt.current_environment()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Single Weight (AllPass filter)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First we define a simple all pass filter as a network:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "class AllPass(pt.Network):\n", " def __init__(self, extra_ring_phase=0):\n", " super(AllPass, self).__init__()\n", " ring_length = 425.8734943010671*wl0/ng # on resonance\n", " self.dc = pt.DirectionalCoupler(coupling=0.1, trainable=False)\n", " self.wg = pt.Waveguide(length=ring_length, loss=1500, neff=neff, ng=ng, wl0=wl0, phase=extra_ring_phase, trainable=True)\n", " self.wg_out = pt.Waveguide(length=0, loss=0, neff=neff, ng=ng, wl0=wl0, phase=2*np.pi*np.random.rand(), trainable=False)\n", " self.link(0, '0:dc:2','0:wg:1','3:dc:1','0:wg_out:1', 1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We see that this allpass filter is on resonance:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "with pt.Network() as nw:\n", " nw.ap = AllPass()\n", " nw.s = pt.Source()\n", " nw.d = pt.Detector()\n", " nw.link('s:0','0:ap:1','0:d')\n", " \n", "\n", "detected = nw(source=1)\n", "nw.plot(detected)\n", " \n", "plt.xticks([1549,wl0*1e9,1551], [1549,'$\\lambda_0$',1551]); plt.yticks([0.1,1])\n", "plt.grid(True)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Train Network" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can train this all-pass filter to have a specific transmission." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "4818f8344798437d84454f66775fd03e", "version_major": 2, "version_minor": 0 }, "text/plain": [ "HBox(children=(FloatProgress(value=0.0, max=400.0), HTML(value='')))" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "target = torch.tensor(0.9)\n", "optimizer = torch.optim.Adam(nw.parameters(), lr=0.03)\n", "lossfunc = torch.nn.MSELoss()\n", "\n", "rng = trange(400)\n", "with pt.Environment(wl=wl0, freqdomain=True, grad=True):\n", " for i in rng:\n", " optimizer.zero_grad()\n", " result = nw(source=1)[-1,0,0,0] # last timestep, only wavelength, only detector, only batch\n", " loss = lossfunc(result, target)\n", " loss.backward()\n", " optimizer.step()\n", " rng.set_postfix(result='%.6f'%result.item())\n", "\n", "detected = nw(source=1)\n", "nw.plot(detected)\n", "plt.xticks([1549,wl0*1e9,1551], [1549,'$\\lambda_0$',1551]); plt.yticks([0.1,1])\n", "plt.grid(True)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Multiple Weights (Collection of AllPass Filters)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "class MultipleAllPasses(pt.Network):\n", " def __init__(self, num_allpasses):\n", " super(MultipleAllPasses, self).__init__()\n", " for i in range(num_allpasses):\n", " self.add_component('ap%i'%i, AllPass(extra_ring_phase=0.25*np.random.rand()))\n", " self.add_component('s%i'%i, pt.Source())\n", " self.add_component('d%i'%i, pt.Detector())\n", " self.link('s%i:0'%i, '0:ap%i:1'%i, '0:d%i'%i)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "All rings in the allpass collections are initialized close to resonance:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "nw = MultipleAllPasses(4)\n", "nw.plot(nw(source=1))\n", "plt.xticks([1549,wl0*1e9,1551], [1549,'$\\lambda_0$',1551]); plt.yticks([0.1,1])\n", "plt.grid(True)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Train Network" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can train this collection of allpasses to have any kind of weight:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "239448aaac0d43c9b08d63b39323016e", "version_major": 2, "version_minor": 0 }, "text/plain": [ "HBox(children=(FloatProgress(value=0.0, max=400.0), HTML(value='')))" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "weights:\n", "0.90 0.50 0.10 0.70\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "target = torch.tensor([0.9,0.5,0.1,0.7])\n", "optimizer = torch.optim.Adam(nw.parameters(), lr=0.03)\n", "lossfunc = torch.nn.MSELoss()\n", "\n", "rng = trange(400)\n", "with pt.Environment(wl=wl0, freqdomain=True, grad=True):\n", " for i in rng:\n", " optimizer.zero_grad()\n", " result = nw(source=1)[-1,0,:,0] # last timestep, only wavelength, all detectors, only batch\n", " loss = lossfunc(result, target)\n", " loss.backward()\n", " optimizer.step()\n", " rng.set_postfix(loss='%.10f'%loss.item())\n", "\n", "\n", " print('weights:')\n", " print(' '.join(['%.2f'%w for w in nw(source=1)[-1,0,:,0]]))\n", "\n", "\n", "nw.plot(nw(source=1))\n", "plt.xticks([1549,wl0*1e9,1551], [1549,'$\\lambda_0$',1551]); plt.yticks([0.1,1])\n", "plt.grid(True)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Combination of Multiple Weights (Readout)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "class Combiner(pt.Component):\n", " def __init__(self, num_inputs, name=None):\n", " self.num_inputs = num_inputs\n", " self.num_ports = num_inputs + 1\n", " pt.Component.__init__(self, name=name)\n", " def set_S(self, S):\n", " S[0, :, :self.num_inputs, -1] = 1\n", " S[0, :, -1, :self.num_inputs] = 1" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "class Readout(pt.Network):\n", " def __init__(self, num_weights):\n", " super(Readout, self).__init__()\n", " self.allpasses = MultipleAllPasses(num_allpasses=num_weights)\n", " self.det = pt.Detector()\n", " self.combiner = Combiner(num_weights)\n", " self.link('combiner:%i'%num_weights, '0:det')\n", " for i in range(num_weights):\n", " self.add_component('ap%i'%i, self.allpasses.components['ap%i'%i])\n", " self.add_component('s%i'%i, pt.Source())\n", " self.link('s%i:0'%i, '0:ap%i:1'%i, '%i:combiner'%i)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This ring combines multiple inputs with different weights:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "weights:\n", "0.56 0.76 0.73 0.84\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "nw = Readout(4)\n", "with pt.Environment(wl=wl0, freqdomain=True):\n", " print('weights:')\n", " print(' '.join(['%.2f'%w for w in nw.allpasses(source=1)[-1,0,:,0]]))\n", "\n", "nw.plot(nw(source=1))\n", "plt.xticks([1549,wl0*1e9,1551], [1549,'$\\lambda_0$',1551]); plt.yticks([0.1,1])\n", "plt.grid(True)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Train Readout" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "ff74e5ac214d49bba990a02aa089f649", "version_major": 2, "version_minor": 0 }, "text/plain": [ "HBox(children=(FloatProgress(value=0.0, max=400.0), HTML(value='')))" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "weights:\n", "0.95+0.10+0.66+0.712.42\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "src = torch.randn(4).rename(\"s\") + 0.3 # lower dimensional sources need to have named dimensions.\n", "target = torch.tensor(2.14325, dtype=torch.float32)\n", "optimizer = torch.optim.Adam(nw.allpasses.parameters(), lr=0.03)\n", "lossfunc = torch.nn.MSELoss()\n", "\n", "rng = trange(400)\n", "with pt.Environment(wl=wl0, freqdomain=True, grad=True):\n", " for i in rng:\n", " optimizer.zero_grad()\n", " result = nw(source=src)[-1,0,0,0] # last timestep, only wavelength, only detector, only batch\n", " loss = lossfunc(result, target)\n", " loss.backward()\n", " optimizer.step()\n", " rng.set_postfix(loss='%.10f'%loss.item())\n", "\n", "\n", " weights = nw.allpasses(source=1)[-1,0,:,0]\n", " print('weights:')\n", " print('+'.join(['%.2f'%w for w in weights])+'%.2f'%weights.sum().item())\n", "\n", "nw.plot(nw(source=src))\n", "plt.xticks([1549,wl0*1e9,1551], [1549,'$\\lambda_0$',1551]); plt.yticks([0.1,1, target.item()])\n", "plt.grid(True)\n", "plt.show()" ] } ], "metadata": { "kernelspec": { "display_name": "ptdev", "language": "python", "name": "ptdev" }, "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.7.7" } }, "nbformat": 4, "nbformat_minor": 4 }