ir
eigenkit.photonics.ir
The intermediate representation (IR) of photonic circuits, which use linear optics.
This module holds only data, and uses neither Perceval nor NumPy. It is the
photonic counterpart of core.ir.
A photonic circuit is a sequence of linear-optical components that act on
n_modes optical modes. They transform an input Fock state, which gives the
number of photons in each mode. This model of computation is very different from
the qubit-gate CircuitSpec. The states live in Fock space, the "gates" are beam
splitters and phase shifters that act on modes, and the readout is a distribution
of photon numbers, not the expectation value of a Pauli operator. This is why the
photonic circuits have their own IR, instead of an adapted CircuitSpec.
It deliberately reuses the Parameter expression tree of the qubit IR
(Constant, WeightRef, InputRef, Scale, Sum and Multiply). The angles
and phases of the components are symbolic numbers, so a component can be trained
(with a WeightRef) or can encode data (with an InputRef) with no extra code.
The same resolve function evaluates the angles of both kinds of circuit. The
simulation in Fock space and the translation to Perceval are in
backends/perceval_backend, never in this module.
BeamSplitter
dataclass
A beam splitter on two modes.
modes are two adjacent modes (m, m + 1), because Perceval can place a beam
splitter only on adjacent modes. theta sets the reflectivity, with the
Perceval convention R = cos²(theta/2), so theta = π/2 gives a balanced
50:50 beam splitter. phi is a relative phase. Each angle is a Parameter
expression or a plain number, and a plain number is stored as a Constant.
The exact unitary is set by the executor, which maps the component to Perceval's
pcvl.BS, so this class only describes the component.
FockProbability
dataclass
The probability of detecting exactly the output Fock state target.
In formula form, <O> = P(target).
Permutation
dataclass
A reordering of the modes, which is a network of mode swaps given as one component.
perm[i] is the output mode to which input mode i is sent. The component
acts on the modes 0 to len(perm) - 1, so perm must reorder exactly these
modes.
PhaseShifter
dataclass
A phase shift exp(i·phi·n̂) on a single mode.
n̂ is the photon-number operator of the mode. phi is a Parameter
expression or a plain number, and a plain number is stored as a Constant.
PhotonNumber
dataclass
The expected number of photons in a mode: <O> = <n̂_mode>.
PhotonicCircuitSpec
dataclass
A description of a linear-optical circuit that does not depend on the backend.
It is the photonic counterpart of core.ir.CircuitSpec. It cannot be changed
after it is built, and it can be hashed and pickled.
input_state is the Fock state sent into the circuit, as the number of photons
in each mode. For example, (1, 0, 1, 0) means one photon in mode 0 and one
in mode 2. What is measured (the full distribution of photon numbers, the
expected photon number of each mode, or a function of the detection pattern)
is left to the executor for now. A PhotonicMeasurement type is planned.
Every component must act on the modes 0 to n_modes - 1, and input_state
must hold non-negative integers. Both are checked when the object is built, so
a wrong circuit fails at that point, and not inside Perceval.
n_photons
property
The total number of photons sent into the circuit.
This number sets the cost of the simulation in Fock space.