components¶
Each Component is generally defined by several key attributes defining the behavior of the component in a network.
num_ports: The number of ports of the components.
S: The scattering matrix of the component.
C: The connection matrix for the component (usually all zero for base components)
sources_at: The location of the sources in the component (usually all zero for base components)
detectors_at: The location of the detectors in the component (usually all zero for base components)
actions_at: The location of the active nodes in the component (usually all zero for passive components)
delays: delays introduced by the nodes of the component.
Defining your own Component comes down to subclassing Component and redefining the relevant setters set_* for these attributes. For example:
class Waveguide(pt.Component):
num_ports = 2
def __init__(self, length=1e-5, neff=2.34, ng=3.40, name=None):
super(Waveguide, self).__init__(self, name=name)
self.neff = float(neff)
self.wl0 = float(wl0)
self.ng = float(ng)
self.length = float(length)
def set_delays(self, delays):
delays[:] = self.ng * self.length / self.env.c
def set_S(self, S):
wls = torch.tensor(self.env.wl, dtype=torch.float64, device=self.device)
phase = (2 * np.pi * neff * self.length / wls) % (2 * np.pi)
S[0, :, 0, 1] = S[0, :, 1, 0] = torch.cos(phase).to(torch.float32) # real part
S[1, :, 0, 1] = S[1, :, 1, 0] = torch.sin(phase).to(torch.float32) # imag part
component¶
The base component is a parent class meant for subclassing.
It should not be used directly.
-
class
photontorch.components.component.
Component
(name=None)¶ Bases:
photontorch.nn.nn.Module
Generic base component.
The base component is a parent class meant for subclassing; it should not be used directly.
To define your own component, subclass Component and overwrite the __init__ and the set_* methods.
-
__init__
(name=None)¶ Component
- Parameters
name (optional, str) – the name of the component
-
action
(t, x_in, x_out)¶ Nonlinear action of the component on its active nodes
- Parameters
t (float) – the current time in the simulation
x_in (torch.Tensor[#active nodes, 2, #wavelengths, #batches]) – the input tensor used to define the action
x_out (torch.Tensor[#active nodes, 2, #wavelengths, #batches]) – the output tensor. The result of the action should be stored in the elements of this tensor.
-
property
env
¶ Get the environment object for which the component is initialized
-
initialize
()¶ initialize the component with the current simulation environment.
Before a component can be used for simulation, it should be initialized with a simulation environment.
-
num_ports
= 0¶ Number of ports of the component.
-
set_C
(C)¶ Set the connection matrix of the component.
- Parameters
C (Tensor[2, #ports, #ports]) – the empty connection matrix for the component to set the elements for. The first dimension of size two denotes the stacked real and imaginary part.
Note
For most base components the connection matrix should stay empty. Only for composite components, like
Network
, the connection matrix will be non-empty.
-
set_S
(S)¶ Set the elements of the scattering matrix.
- Parameters
S (Tensor[2, #wavelengths, #ports, #ports]) – the empty scattering matrix of the component to set the elements for (defined for each wavelength of the simulation). The first dimension of size two denotes the stacked real and imaginary part.
-
set_actions_at
(actions_at)¶ Set the locations of the active ports in the component.
- Parameters
actions_at (Tensor[#ports]) – the empty boolean tensor for the component to set the elements for. The
actions_at
tensor signifies which ports of the component act actively.
-
set_delays
(delays)¶ Set the delays introduced by the component.
- Parameters
delays (Tensor[#ports]) – the empty delay tensor for the component to set the elements for. The delay tensor signifies the delay each port of the component introduces.
-
set_detectors_at
(detectors_at)¶ Set the locations of the detector ports in the component.
- Parameters
detectors_at (Tensor[#ports]) – the empty boolean tensor for the component to set the elements for. The
detectors_at
tensor signifies which ports of the component act as a detector.
-
set_port_order
(port_order)¶ Set the port ordering
- Parameters
port_order (Tensor[#ports]) – the indices denoting the port order.
Note
The port order will NOT be reflected in the S-matrix of the component. It will however be used when components are connected together into a network.
-
set_sources_at
(sources_at)¶ Set the locations of the source ports in the component.
- Parameters
sources_at (Tensor[#ports]) – the empty boolean tensor for the component to set the elements for. The
sources_at
tensor signifies which ports of the component act as a source.
-
training
¶
-
connection¶
A Connection connects two ports without reflection.
It is generally recommended to make direct connections in a network. But if for some reason, you’re unable to do so, a Connection object can be used.
-
class
photontorch.components.connection.
Connection
(name=None)¶ Bases:
photontorch.components.component.Component
A connection connects two ports without delays and without reflection.
Terms:
0---1
Note
It is generally recommended to make direct connections in a network. But if for some reason, you’re unable to do so, a Connection object can be used.
-
num_ports
= 2¶
-
set_S
(S)¶ Set the elements of the scattering matrix.
- Parameters
S (Tensor[2, #wavelengths, #ports, #ports]) – the empty scattering matrix of the component to set the elements for (defined for each wavelength of the simulation). The first dimension of size two denotes the stacked real and imaginary part.
-
training
¶
-
directionalcouplers¶
Directional Couplers are 4-port components coupling two waveguides together.
-
class
photontorch.components.directionalcouplers.
DirectionalCoupler
(coupling=0.5, trainable=True, name=None)¶ Bases:
photontorch.components.component.Component
A directional coupler is a memory-less component with 4 ports.
A directional coupler has one trainable parameter: the squared coupling coupling.
Terms:
3 2 \______/ /------\ 0 1
-
__init__
(coupling=0.5, trainable=True, name=None)¶ - Parameters
coupling (float) – power coupling of the directional coupler (between 0 and 1)
trainable (bool) – makes the coupling trainable
name (optional, str) – the name of the component (default: lowercase classname)
-
num_ports
= 4¶
-
set_S
(S)¶ Set the elements of the scattering matrix.
- Parameters
S (Tensor[2, #wavelengths, #ports, #ports]) – the empty scattering matrix of the component to set the elements for (defined for each wavelength of the simulation). The first dimension of size two denotes the stacked real and imaginary part.
-
training
¶
-
-
class
photontorch.components.directionalcouplers.
DirectionalCouplerWithLength
(length=1e-05, coupling=0.5, loss=0, neff=2.34, wl0=1.55e-06, ng=3.4, phase=0, trainable_phase=True, trainable_coupling=True, name=None)¶ Bases:
photontorch.components.component.Component
A directional coupler with length is a memory-containing component with 4 ports.
Terms:
3 2 \______/ /------\ 0 1
Note
This version of a directional coupler is prefered over a wg-wg-wg-wg-dc network becuase it only has 4 ports in stead of 12.
-
__init__
(length=1e-05, coupling=0.5, loss=0, neff=2.34, wl0=1.55e-06, ng=3.4, phase=0, trainable_phase=True, trainable_coupling=True, name=None)¶ - Parameters
length (float) – length of the waveguide in meter.
coupling (float) – power coupling of the directional coupler (between 0 and 1)
loss (float) – loss in the waveguide [dB/m]
neff (float) – effective index of the waveguide
ng (float) – group index of the waveguide
wl0 (float) – the center wavelength for which neff is defined.
phase (float) – additional phase correction added to the phase introduced by the length of the waveguide. Adding this can be useful for training purposes.
trainable_phase (bool) – makes the phase parameter trainable
trainable_coupling (bool) – makes the coupling parameter trainable
name (optional, str) – the name of the component (default: lowercase classname)
-
num_ports
= 4¶
-
set_S
(S)¶ Set the elements of the scattering matrix.
- Parameters
S (Tensor[2, #wavelengths, #ports, #ports]) – the empty scattering matrix of the component to set the elements for (defined for each wavelength of the simulation). The first dimension of size two denotes the stacked real and imaginary part.
-
set_delays
(delays)¶ Set the delays introduced by the component.
- Parameters
delays (Tensor[#ports]) – the empty delay tensor for the component to set the elements for. The delay tensor signifies the delay each port of the component introduces.
-
training
¶
-
-
class
photontorch.components.directionalcouplers.
RealisticDirectionalCoupler
(length=1.28e-05, k0=0.2332, n0=0.0208, de1_k0=1.2435, de1_n0=0.1169, de2_k0=5.3022, de2_n0=0.4821, wl0=1.55e-06, name=None)¶ Bases:
photontorch.components.component.Component
A directional coupler is a memory-less component with 4 ports.
Terms:
3 2 \______/ /------\ 0 1
Notes
This directional coupler introduces no delays (for now)
This directional coupler is not trainable (for now)
-
__init__
(length=1.28e-05, k0=0.2332, n0=0.0208, de1_k0=1.2435, de1_n0=0.1169, de2_k0=5.3022, de2_n0=0.4821, wl0=1.55e-06, name=None)¶ - Parameters
length (float) – the length
k0 (float) – the bend coupling
n0 (float) – effective index difference between even and odd mode
de1_k0 (float) – first derivative of k0 w.r.t. wavelength
de1_n0 (float) – first derivative of n0 w.r.t. wavelength
de2_k0 (float) – second derivative of k0 w.r.t. wavelength
de2_n0 (float) – second derivative of n0 w.r.t. wavelength
wl0 (float) – the center wavelength for which the parameters are defined
name (optional, str) – the name of the component (default: lowercase classname)
Note
- The default parameters are based on a directional coupler with
bend radius : 5um
adiabatic angle : 10 degrees
gap distance : 250 nm
-
num_ports
= 4¶
-
set_S
(S)¶ Set the elements of the scattering matrix.
- Parameters
S (Tensor[2, #wavelengths, #ports, #ports]) – the empty scattering matrix of the component to set the elements for (defined for each wavelength of the simulation). The first dimension of size two denotes the stacked real and imaginary part.
-
training
¶
gratingcouplers¶
Grating Couplers
Grating couplers are a special kind of 2-port component that simulate the behavior of coupling light from a fiber onto the chip.
-
class
photontorch.components.gratingcouplers.
GratingCoupler
(R=0.0, R_in=0.0, Tmax=1.0, bandwidth=6e-08, wl0=1.55e-06, name=None)¶ Bases:
photontorch.components.component.Component
Grating couplers are partly reflecting and partly transmitting connections.
Terms:
0 \ \ _|-|_|-|_|-|___ 1
Note
A Grating Coupler is not trainable (for now).
-
__init__
(R=0.0, R_in=0.0, Tmax=1.0, bandwidth=6e-08, wl0=1.55e-06, name=None)¶ - Parameters
R (float) – reflection of the grating coupler (between 0 and 1)
R_in (float) – incoupling reflection for the grating coupler
Tmax (float) – maximum transmission at center wavelength
bandwidth (float) – 3dB Bandwidth of the grating coupler
wl0 (float) – Center wavelength of the grating coupler
name (optional, str) – the name of the component (default: lowercase classname)
-
num_ports
= 2¶
-
set_S
(S)¶ Set the elements of the scattering matrix.
- Parameters
S (Tensor[2, #wavelengths, #ports, #ports]) – the empty scattering matrix of the component to set the elements for (defined for each wavelength of the simulation). The first dimension of size two denotes the stacked real and imaginary part.
-
training
¶
-
mirrors¶
Mirrors are partly reflecting and partly transmitting connections.
-
class
photontorch.components.mirrors.
Mirror
(R=0.5, trainable=True, name=None)¶ Bases:
photontorch.components.component.Component
Mirrors are partly reflecting and partly transmitting connections.
A mirror has one trainable parameter: the reflectivity R.
Terms:
| 0 --|-- 1 |
-
__init__
(R=0.5, trainable=True, name=None)¶ - Parameters
R (float) – reflectivity of the mirror (between 0 and 1)
trainable (bool) – makes the reflection trainable
name (optional, str) – the name of the component (default: lowercase classname)
-
num_ports
= 2¶
-
set_S
(S)¶ Set the elements of the scattering matrix.
- Parameters
S (Tensor[2, #wavelengths, #ports, #ports]) – the empty scattering matrix of the component to set the elements for (defined for each wavelength of the simulation). The first dimension of size two denotes the stacked real and imaginary part.
-
training
¶
-
mmis¶
An MMI performs a weighted transition from m waveguides to n waveguides
The MMI implemented in this module performs an arbitrary splitting operation specified by a weight matrix
-
class
photontorch.components.mmis.
Mmi
(weights=None, trainable=True, name=None)¶ Bases:
photontorch.components.component.Component
An MMI performs a weighted transition from m waveguides to n waveguides
Terms:
m+1 0___/ m+2 1____/ : : m____ \ m+n
-
__init__
(weights=None, trainable=True, name=None)¶ Mmi initialization
- Parameters
weights (np.ndarray) – interconnection weights between input wageguides and output waveguides. If no weights are specified, the component defaults to a 1x2 splitter.
trainable (bool) – makes the interconnection weights trainable
name (optional, str) – the name of the component (default: lowercase classname)
-
num_ports
= None¶
-
set_S
(S)¶ Set the elements of the scattering matrix.
- Parameters
S (Tensor[2, #wavelengths, #ports, #ports]) – the empty scattering matrix of the component to set the elements for (defined for each wavelength of the simulation). The first dimension of size two denotes the stacked real and imaginary part.
-
training
¶
-
mzis¶
MZIs are 4-port components coupling two waveguides together.
-
class
photontorch.components.mzis.
Mzi
(phi=0, theta=0.7853981633974483, neff=2.34, ng=3.4, wl0=1.55e-06, length=1e-05, loss=0, trainable=True, name=None)¶ Bases:
photontorch.components.component.Component
An MZI is a component with 4 ports.
An MZI has two trainable parameters: the input phase phi and the phase difference between the arms theta. .
Terms:
_[2*theta]_ 3 ______ / \ ___2 \/ \/ 0__[phi]_/\_____________/\___1
Note
This MZI implementation assumes the armlength difference is too small to have a noticable delay difference between the arms, i.e. only the phase difference matters
-
__init__
(phi=0, theta=0.7853981633974483, neff=2.34, ng=3.4, wl0=1.55e-06, length=1e-05, loss=0, trainable=True, name=None)¶ - Parameters
phi (float) – input phase
theta (float) – phase difference between the arms
neff (float) – effective index of the waveguide
ng (float) – group index of the waveguide
wl0 (float) – the center wavelength for which neff is defined.
length (float) – length of the waveguide in meter.
loss (float) – loss in the waveguide [dB/m]
trainable (bool) – whether phi and theta are trainable
name (optional, str) – name of this specific MZI
-
num_ports
= 4¶
-
set_S
(S)¶ Set the elements of the scattering matrix.
- Parameters
S (Tensor[2, #wavelengths, #ports, #ports]) – the empty scattering matrix of the component to set the elements for (defined for each wavelength of the simulation). The first dimension of size two denotes the stacked real and imaginary part.
-
set_delays
(delays)¶ Set the delays introduced by the component.
- Parameters
delays (Tensor[#ports]) – the empty delay tensor for the component to set the elements for. The delay tensor signifies the delay each port of the component introduces.
-
training
¶
-
soas¶
Semiconductor Optical Amplifiers
SOAs amplify your signal.
-
class
photontorch.components.soas.
AgrawalSoa
(L=0.0005, W=2e-06, H=2e-07, N0=1e+24, a=2.7e-20, I=0.18666666666666668, tc=3e-10, gamma=0.3, alpha=5.0, neff=2.34, ng=3.75, wl=1.55e-06, name=None)¶ Bases:
photontorch.components.soas.BaseSoa
The AgrawalSoa is a memory-containing component with one input and one output.
It amplifies a signal according to its internal state, which in turn is modified by its rate equation defined by Agrawal et. al.
Terms:
0 ---- 1
- Reference:
Agrawal, G.P. and Olsson, N.A., 1989. Self-phase modulation and spectral broadening of optical pulses in semiconductor laser amplifiers. IEEE Journal of Quantum Electronics, 25(11), pp.2297-2306.
-
__init__
(L=0.0005, W=2e-06, H=2e-07, N0=1e+24, a=2.7e-20, I=0.18666666666666668, tc=3e-10, gamma=0.3, alpha=5.0, neff=2.34, ng=3.75, wl=1.55e-06, name=None)¶ - Parameters
L (float) – length of soa
W (float) – width of soa
H (float) – height of soa
N0 (float) – transparency carrier density
a (float) – differenctial gain coefficient
I (float) – current through soa
tc (float) – lifetime of the carriers
gamma (float) – confinement factor
alpha (float) – linewidth enhancement
neff (float) – effective index used to calculate phase offset
ng (float) – group index used to calculate delay of soa
wl (float) – wavelength of the simulation
name (optional, str) – the name of the component (default: lowercase classname)
-
dhdt
(t, h, a)¶ Derivative of the internal state h with respect to time
- Parameters
t (float) – the current time in the simulation
h (Tensor[2, #wavelengths, #batches]) – the current internal state of the SOA
a (Tensor[2, #wavelengths, #batches]) – the current input amplitude of the SOA
- Returns
the rate of change of the internal state
- Return type
Tensor[2, #wavelengths, #batches]
-
initialize
()¶ initialize the component with the current simulation environment.
Before a component can be used for simulation, it should be initialized with a simulation environment.
-
set_delays
(delays)¶ Set the delays introduced by the component.
- Parameters
delays (Tensor[#ports]) – the empty delay tensor for the component to set the elements for. The delay tensor signifies the delay each port of the component introduces.
-
training
¶
-
class
photontorch.components.soas.
BaseSoa
(name=None)¶ Bases:
photontorch.components.component.Component
The BaseSoa is a memory-containing component with one input and one output.
It amplifies a signal according to its internal state, which in turn is modified by its rate equation.
Terms:
0 ---- 1
-
action
(t, x_in, x_out)¶ Nonlinear action of the component on its active nodes
- Parameters
t (float) – the current time in the simulation
x_in (torch.Tensor[#active nodes, 2, #wavelengths, #batches]) – the input tensor used to define the action
x_out (torch.Tensor[#active nodes, 2, #wavelengths, #batches]) – the output tensor. The result of the action should be stored in the elements of this tensor.
-
dhdt
(t, h, a)¶ Derivative of the internal state h with respect to time
- Parameters
t (float) – the current time in the simulation
h (Tensor[2, #wavelengths, #batches]) – the current internal state of the SOA
a (Tensor[2, #wavelengths, #batches]) – the current input amplitude of the SOA
- Returns
the rate of change of the internal state
- Return type
Tensor[2, #wavelengths, #batches]
-
num_ports
= 3¶
-
set_C
(C)¶ Set the connection matrix of the component.
- Parameters
C (Tensor[2, #ports, #ports]) – the empty connection matrix for the component to set the elements for. The first dimension of size two denotes the stacked real and imaginary part.
Note
For most base components the connection matrix should stay empty. Only for composite components, like
Network
, the connection matrix will be non-empty.
-
set_S
(S)¶ Set the elements of the scattering matrix.
- Parameters
S (Tensor[2, #wavelengths, #ports, #ports]) – the empty scattering matrix of the component to set the elements for (defined for each wavelength of the simulation). The first dimension of size two denotes the stacked real and imaginary part.
-
set_actions_at
(actions_at)¶ Set the locations of the active ports in the component.
- Parameters
actions_at (Tensor[#ports]) – the empty boolean tensor for the component to set the elements for. The
actions_at
tensor signifies which ports of the component act actively.
-
training
¶
-
-
class
photontorch.components.soas.
LinearSoa
(amplification=2, trainable=True, name=None)¶ Bases:
photontorch.components.component.Component
A Linear SOA is a memory-less component with one input and one output.
It amplifies a signal instantaneously and linearly with the specified amplification factor
A simple SOA has one trainable parameter: the amplification.
Terms:
0 ---- 1
-
__init__
(amplification=2, trainable=True, name=None)¶ - Parameters
amplification (float) – Amplification of the soa
trainable (bool) – makes the amplification trainable
name (optional, str) – the name of the component (default: lowercase classname)
-
num_ports
= 2¶
-
set_S
(S)¶ Set the elements of the scattering matrix.
- Parameters
S (Tensor[2, #wavelengths, #ports, #ports]) – the empty scattering matrix of the component to set the elements for (defined for each wavelength of the simulation). The first dimension of size two denotes the stacked real and imaginary part.
-
training
¶
-
-
class
photontorch.components.soas.
Soa
(amplification=1.0, startup_time=1e-10, trainable=True, name=None)¶ Bases:
photontorch.components.soas.BaseSoa
The Soa is a memory-containing component with one input and one output.
It amplifies a signal according to its internal state, which in turn is modified by its rate equation.
Terms:
0 ---- 1
-
__init__
(amplification=1.0, startup_time=1e-10, trainable=True, name=None)¶ - Parameters
amplification (float) – the maximum amplification of the soa
startup_time (float) – how long it takes before the soa reaches max amplification
trainable (bool) – makes the amplification trainable
name (optional, str) – the name of the component (default: lowercase classname)
-
dhdt
(t, h, a)¶ Derivative of the internal state h with respect to time
- Parameters
t (float) – the current time in the simulation
h (Tensor[2, #wavelengths, #batches]) – the current internal state of the SOA
a (Tensor[2, #wavelengths, #batches]) – the current input amplitude of the SOA
- Returns
the rate of change of the internal state
- Return type
Tensor[2, #wavelengths, #batches]
-
training
¶
-
terms¶
Terminations
In order to be able to simulate a Network, the connection matrix should be fully connected.
Ports that are not connected to other components, should be connected to a Term.
Network terminations can be absorbing (Term), injecting (Source) or absorbing and detecting (Detector)
-
class
photontorch.components.terms.
Detector
(name=None)¶ Bases:
photontorch.components.terms.Term
A detector is a Term where the power is saved
- Terms::
–0
-
set_detectors_at
(detectors_at)¶ Set the locations of the detector ports in the component.
- Parameters
detectors_at (Tensor[#ports]) – the empty boolean tensor for the component to set the elements for. The
detectors_at
tensor signifies which ports of the component act as a detector.
-
training
¶
-
class
photontorch.components.terms.
Source
(name=None)¶ Bases:
photontorch.components.terms.Term
A source is a special kind of Term where power is injected in the system
Terms:
--0
-
set_sources_at
(sources_at)¶ Set the locations of the source ports in the component.
- Parameters
sources_at (Tensor[#ports]) – the empty boolean tensor for the component to set the elements for. The
sources_at
tensor signifies which ports of the component act as a source.
-
training
¶
-
-
class
photontorch.components.terms.
Term
(name=None)¶ Bases:
photontorch.components.component.Component
A term is a memory-less component with a single input.
It terminates an unconnected node.
Terms:
--0
-
num_ports
= 1¶
-
training
¶
-
waveguides¶
Waveguides connect two ports with a delay and a phase.
-
class
photontorch.components.waveguides.
Waveguide
(length=1e-05, loss=0, neff=2.34, wl0=1.55e-06, ng=3.4, phase=0, trainable=True, name=None)¶ Bases:
photontorch.components.connection.Connection
Waveguides connect two ports with a delay and a phase.
A waveguide is a Component where each of the two nodes introduces a delay corresponding to the length of the waveguide.
Terms:
0 ---- 1
-
__init__
(length=1e-05, loss=0, neff=2.34, wl0=1.55e-06, ng=3.4, phase=0, trainable=True, name=None)¶ - Parameters
length (float) – length of the waveguide in meter.
loss (float) – loss in the waveguide [dB/m]
neff (float) – effective index of the waveguide
ng (float) – group index of the waveguide
wl0 (float) – the center wavelength for which neff is defined.
phase (float) – additional phase correction added to the phase introduced by the length of the waveguide. Adding this can be useful for training purposes.
trainable (bool) – makes the phase parameter trainable
name (optional, str) – the name of the component (default: lowercase classname)
-
set_S
(S)¶ Set the elements of the scattering matrix.
- Parameters
S (Tensor[2, #wavelengths, #ports, #ports]) – the empty scattering matrix of the component to set the elements for (defined for each wavelength of the simulation). The first dimension of size two denotes the stacked real and imaginary part.
-
set_delays
(delays)¶ Set the delays introduced by the component.
- Parameters
delays (Tensor[#ports]) – the empty delay tensor for the component to set the elements for. The delay tensor signifies the delay each port of the component introduces.
-
training
¶
-