extract_unitary(prog, cutoff_dim, vectorize_modes=False, backend='fock')[source]

Numerical array representation of a unitary quantum circuit.

Note that the circuit must only include operations of the strawberryfields.ops.Gate class.

  • If vectorize_modes=True, it returns a matrix.

  • If vectorize_modes=False, it returns an operator with \(2N\) indices, where N is the number of modes that the Program is created with. Adjacent indices correspond to output-input pairs of the same mode.


This shows the Hong-Ou-Mandel effect by extracting the unitary of a 50/50 beamsplitter, and then computing the output given by one photon at each input (notice the order of the indices: \([out_1, in_1, out_2, in_2,\dots]\)). The result tells us that the two photons always emerge together from a random output port and never one per port.

>>> prog = sf.Program(num_subsystems=2)
>>> with prog.context as q:
>>>     BSgate(np.pi/4) | q
>>> U = extract_unitary(prog, cutoff_dim=3)
>>> print(abs(U[:,1,:,1])**2)
[[0.  0.  0.5]
 [0.  0.  0. ]
 [0.5 0.  0. ]])
  • prog (Program) – quantum program

  • cutoff_dim (int) – dimension of each index

  • vectorize_modes (bool) – If True, reshape input and output modes in order to return a matrix.

  • backend (str) – the backend to build the unitary; 'fock' (default) and 'tf' are supported


numerical array of the unitary circuit

as a NumPy ndarray ('fock' backend) or as a TensorFlow Tensor ('tf' backend)

Return type

array, tf.Tensor


TypeError – if the operations used to construct the circuit are not all unitary