sf.ops.GaussianTransform¶

class GaussianTransform(S, vacuum=False, tol=1e-10)[source]

Bases: strawberryfields.ops.Decomposition

Apply a Gaussian symplectic transformation to the specified qumodes.

This operation uses the Bloch-Messiah decomposition to decompose a symplectic matrix $$S$$:

$S = O_1 R O_2$

where $$O_1$$ and $$O_2$$ are two orthogonal symplectic matrices (and thus passive Gaussian transformations), and $$R$$ is a squeezing transformation in the phase space ($$R=\text{diag}(e^{-z},e^z)$$).

The symplectic matrix describing the Gaussian transformation on $$N$$ modes must satisfy

$\begin{split}S\Omega S^T = \Omega, ~~\Omega = \begin{bmatrix}0&I\\-I&0\end{bmatrix}\end{split}$

where $$I$$ is the $$N\times N$$ identity matrix, and $$0$$ is the zero matrix.

The two orthogonal symplectic unitaries describing the interferometers are then further decomposed via the Interferometer operator and the Rectangular decomposition:

$U_i = X_i + iY_i$

where

$\begin{split}O_i = \begin{bmatrix}X&-Y\\Y&X\end{bmatrix}\end{split}$
Parameters
• S (array[float]) – a $$2N\times 2N$$ symplectic matrix describing the Gaussian transformation.

• vacuum (bool) – set to True if acting on a vacuum state. In this case, $$O_2 V O_2^T = I$$, and the unitary associated with orthogonal symplectic $$O_2$$ will be ignored.

• tol (float) – the tolerance used when checking if the matrix is symplectic: $$|S^T\Omega S-\Omega| \leq$$ tol

Definition

For every symplectic matrix $$S\in\mathbb{R}^{2N\times 2N}$$, there exists orthogonal symplectic matrices $$O_1$$ and $$O_2$$, and diagonal matrix $$Z$$, such that

$S = O_1 Z O_2$

where $$Z=\text{diag}(e^{-r_1},\dots,e^{-r_N},e^{r_1},\dots,e^{r_N})$$ represents a set of one mode squeezing operations with parameters $$(r_1,\dots,r_N)$$.

Gaussian symplectic transforms can be grouped into two main types; passive transformations (those which preserve photon number) and active transformations (those which do not). Compared to active transformation, passive transformations have an additional constraint - they must preserve the trace of the covariance matrix, $$\text{Tr}(SVS^T)=\text{Tr}(V)$$; this only occurs when the symplectic matrix $$S$$ is also orthogonal ($$SS^T=\I$$).

The Bloch-Messiah decomposition therefore allows any active symplectic transformation to be decomposed into two passive Gaussian transformations $$O_1$$ and $$O_2$$, sandwiching a set of one-mode squeezers, an active transformation.

Acting on the vacuum

In the case where the symplectic matrix $$S$$ is applied to a vacuum state $$V=\frac{\hbar}{2}\I$$, the action of $$O_2$$ cancels out due to its orthogonality:

$SVS^T = (O_1 Z O_2)\left(\frac{\hbar}{2}\I\right)(O_1 Z O_2)^T = \frac{\hbar}{2} O_1 Z O_2 O_2^T Z O_1^T = \frac{\hbar}{2}O_1 Z^2 O_1^T$

As such, a symplectic transformation acting on the vacuum is sufficiently characterised by single mode squeezers followed by a passive Gaussian transformation ($$S = O_1 Z$$).

 measurement_deps Extra dependencies due to parameters that depend on measurements. ns
measurement_deps

Extra dependencies due to parameters that depend on measurements.

Returns

dependencies

Return type

set[RegRef]

ns = None
 apply(reg, backend, **kwargs) Ask a local backend to execute the operation on the current register state right away. decompose(reg, **kwargs) Decompose the operation into elementary operations supported by the backend API. merge(other) Merge the operation with another (acting on the exact same set of subsystems).
apply(reg, backend, **kwargs)

Ask a local backend to execute the operation on the current register state right away.

Takes care of parameter evaluations and any pending formal transformations (like dagger) and then calls Operation._apply().

Parameters
• reg (Sequence[RegRef]) – subsystem(s) the operation is acting on

• backend (BaseBackend) – backend to execute the operation

Returns

the result of self._apply

Return type

Any

decompose(reg, **kwargs)

Decompose the operation into elementary operations supported by the backend API.

See strawberryfields.backends.base.

Parameters

reg (Sequence[RegRef]) – subsystems the operation is acting on

Returns

decomposition as a list of operations acting on specific subsystems

Return type

list[Command]

merge(other)

Merge the operation with another (acting on the exact same set of subsystems).

Note

For subclass overrides: merge may return a newly created object, or self, or other, but it must never modify self or other because the same Operation objects may be also used elsewhere.

Parameters

other (Operation) – operation to merge this one with

Returns

other * self. The return value None represents the identity gate (doing nothing).

Return type

Operation, None

Raises

MergeFailure – if the two operations cannot be merged