{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Optimize an MZI in the time domain to perform the XOR on two subsequent bits" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Imports" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import torch\n", "import numpy as np\n", "import photontorch as pt\n", "import matplotlib.pyplot as plt\n", "\n", "from ipywidgets import interact\n", "from tqdm.notebook import trange" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Parameters & Settings" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "c = 299792458.0 #[m/s] speed of light\n", "Rb = 20e9 #[1/s] bitrate\n", "Rs = 320e9 #[1/s] samplerate\n", "fc = 20e9 #[1/s] cutoff frequency for bit generation\n", "wl0 = 1550e-9 #[m] center wavelength\n", "neff = 2.34 #[1] effective index\n", "ng = 3.4 #[1] group index\n", "N = 100 #[1] number of bits per bit stream\n", "B = 10 #[1] number of bit streams in training batch\n", "Str, Sva, Ste = (1, 2, 3) #[1] train seed, validation seed, test seed\n", "Lr = (1/Rb) * (c/ng) #[m] reference length (distance the signal travels during one bit period)\n", "device = torch.device(\"cpu\") # default device used\n", "torch.set_default_dtype(torch.float32) # default dtype used\n", "torch.manual_seed(123) # pytorch seed\n", "np.random.seed(42) # numpy seed" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Bit generator" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "class BitGenerator(np.random.RandomState):\n", " def __call__(self, N, B=1):\n", " \"\"\" generate a bit sequence\n", " \n", " Args:\n", " N: number of bits per sequence\n", " B: number of sequences in batch\n", " \"\"\"\n", " bits = self.rand(N,B) > 0.5\n", " return bits" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Bit operations" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "def COPY(bits):\n", " return bits.copy()\n", "def XOR(bits):\n", " return (np.concatenate([bits, np.zeros_like(bits[-1:])], 0) ^ np.concatenate([np.zeros_like(bits[:1]), bits], 0))[:-1]\n", "def AND(bits):\n", " return (np.concatenate([bits, np.zeros_like(bits[-1:])], 0) & np.concatenate([np.zeros_like(bits[:1]), bits], 0))[:-1]\n", "\n", "TARGET = XOR" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Generate Streams" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "bits = BitGenerator(seed=23)(10)\n", "streamgen = pt.BitStreamGenerator(bitrate=Rb, samplerate=Rs, cutoff_frequency=fc, device=device)\n", "stream = streamgen(bits)\n", "target = streamgen(TARGET(bits))\n", "t = np.arange(stream.shape[0])*(1/Rs)\n", "plt.plot(1e9*t, stream.data.cpu().numpy())\n", "plt.plot(1e9*t, target.data.cpu().numpy())\n", "plt.xlabel(\"t [ns]\")\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "# train streams\n", "trbits = BitGenerator(seed=Str)(N, B) # N bits per train stream, B train streams per batch.\n", "trstream = streamgen(trbits)\n", "trtarget = streamgen(TARGET(trbits))**2\n", "t = np.arange(trstream.shape[0])*(1/Rs)\n", "\n", "# validation streams\n", "vabits = BitGenerator(seed=Sva)(N, 1) # N bits per validation stream, 1 validation stream per batch.\n", "vastream = streamgen(vabits)\n", "vatarget = streamgen(TARGET(vabits))**2\n", "\n", "# test streams\n", "tebits = BitGenerator(seed=Ste)(N*B, 1) # N*B bits per teststream\n", "testream = streamgen(tebits)\n", "tetarget = streamgen(TARGET(tebits))**2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Simple MZI Circuit" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "class Circuit(pt.Network):\n", " def __init__(self):\n", " super().__init__()\n", " self.src = pt.Source()\n", " self.det = pt.Detector()\n", " self.trm1 = self.trm2 = pt.Term()\n", " self.dc1 = pt.DirectionalCoupler(coupling=np.random.rand(), trainable=True)\n", " self.dc2 = pt.DirectionalCoupler(coupling=np.random.rand(), trainable=True)\n", " self.wg1 = pt.Waveguide(length=2*Lr, phase=2*np.pi*np.random.rand(), loss=0.0, trainable=True)\n", " self.wg2 = pt.Waveguide(length=1*Lr, phase=2*np.pi*np.random.rand(), loss=0.0, trainable=True)\n", " self.link(\"trm1:0\", \"3:dc1:2\", \"0:wg1:1\", \"3:dc2:2\", \"0:trm2\")\n", " self.link( \"src:0\", \"0:dc1:1\", \"0:wg2:1\", \"0:dc2:1\", \"0:det\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Training" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "initial plot (to find a good latency)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "953e047f73524d7287ddee8ef7b201bc", "version_major": 2, "version_minor": 0 }, "text/plain": [ "interactive(children=(FloatSlider(value=1.0, description='latency', max=3.0), Output()), _dom_classes=('widget…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "nw = Circuit()\n", "with pt.Environment(t=t):\n", " detected = nw(source=vastream.rename(\"t\", \"b\"))[:,0,0,:] # lower dimensional sources should have named dimensions\n", " \n", "mse = pt.MSELoss(latency=0.0, warmup=0.0, bitrate=Rb, samplerate=Rs)\n", "@interact(latency=(0,3,0.1))\n", "def _(latency=1.0):\n", " mse.plot(vastream, label=\"input\")\n", " mse.plot(vatarget, label=\"target\")\n", " mse.plot(detected, latency=latency, label=\"detected\")\n", " plt.legend()\n", " plt.xlim(0,1)\n", " plt.show()" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "mse = pt.MSELoss(latency=1.0, warmup=0.0, bitrate=Rb, samplerate=Rs)\n", "ber = pt.BERLoss(latency=1.0, threshold=0.5, warmup=0.0, bitrate=Rb, samplerate=Rs)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "9f66d42a188c4410856b7801e352bab9", "version_major": 2, "version_minor": 0 }, "text/plain": [ "HBox(children=(FloatProgress(value=0.0, max=40.0), HTML(value='')))" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "scale = torch.tensor(1.0, requires_grad=True)\n", "bias = torch.tensor(0.0, requires_grad=True)\n", "optim = torch.optim.Adam([scale, bias, *nw.parameters()], lr=0.1)\n", "range_ = trange(40)\n", "with pt.Environment(t=t, enable_grad=True):\n", " for i in range_:\n", " optim.zero_grad()\n", " trdet = nw(source=trstream.rename(\"t\", \"b\"))[:,0,0,:]*scale + bias\n", " loss = mse(trdet, trtarget)\n", " loss.backward()\n", " optim.step()\n", " range_.set_postfix(loss=loss.item(), ber=ber(trdet, trtarget))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's take a look at the final result:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ber:\t0.0\n", "mse:\t0.057594358921051025\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "with pt.Environment(t=t):\n", " vadet = nw(source=vastream.rename(\"t\", \"b\"))[:,0,0,:]\n", " ber_err = ber(vadet, vatarget, threshold=float((0.5-bias)/scale))\n", " mse_err = mse(scale*vadet+bias, vatarget)\n", "\n", " print(f\"ber:\\t{ber_err}\")\n", " print(f\"mse:\\t{mse_err.item()}\")\n", "\n", " mse.plot(vadet)\n", " mse.plot(vatarget, latency=0.0)\n", " plt.xlim(-0,1.15)\n", " plt.xlabel(\"t [ps]\")\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 }