Modes

Overview

The modes subsystem describes the structure of optical modes used throughout the simulation framework.

A central design principle is the separation between:

  • mode structure: how a field is distributed in time, frequency, polarization, and space

  • quantum state: photon number, amplitudes, and entanglement

The modes package models only the first.

In the library, an optical mode is described by two complementary layers:

Together, these define how modes overlap and interfere, while quantum states operate on top of this structure.

Physical motivation

A single photon in one optical channel can be described by

\[\mathcal{H}_1 = \mathcal{H}_{\mathrm{env}} \otimes \mathcal{H}_{\mathrm{pol}},\]

where

  • \(\mathcal{H}_{\mathrm{env}} = L^2(\mathbb{R}, \mathbb{C})\) describes temporal or spectral profiles,

  • \(\mathcal{H}_{\mathrm{pol}} = \mathbb{C}^2\) describes polarization.

In this library:

  • the envelope subsystem models \(\mathcal{H}_{\mathrm{env}}\),

  • polarization and path are represented as mode labels,

  • quantum states (Fock space, amplitudes, entanglement) are handled separately.

Multi-photon states are constructed from these single-photon modes, but the modes package itself defines only the basis structure.

Structure of a mode

An optical mode in the library is identified by a composite label

\[m = (p, \pi, \zeta),\]

where

The overlap between two modes factorizes as

\[\langle m_1, m_2 \rangle = \langle p_1, p_2 \rangle \langle \pi_1, \pi_2 \rangle \langle \zeta_1, \zeta_2 \rangle.\]

This factorization determines distinguishability and interference behavior.

Minimal example

from symop.modes.envelopes import GaussianEnvelope
from symop.modes.labels.mode import ModeLabel
from symop.modes.labels.path import Path
from symop.modes.labels.polarization import Polarization

mode = ModeLabel(
    path=Path("A"),
    polarization=Polarization.H(),
    envelope=GaussianEnvelope(omega0=10.0, sigma=1.0, tau=0.0, phi0=0.0),
)

print(mode.signature)
('mode_label', ('path', 'A'), ('pol', 1.0, 0.0, 0.0, 0.0), ('gauss', 10.0, 1.0, 0.0, 0.0))

Submodules