sf.lab.Pgate

class mrmustard.lab.Pgate(shearing=0.0, shearing_trainable=False, shearing_bounds=(None, None), modes=None)[source]

Bases: Unitary

Quadratic phase gate.

If len(modes) > 1 the gate is applied in parallel to all of the modes provided. If a parameter is a single float, the parallel instances of the gate share that parameter. To apply mode-specific values use a list of floats. One can optionally set bounds for each parameter, which the optimizer will respect.

Parameters:
  • modes (optional, List[int]) – the list of modes this gate is applied to

  • shearing (float or List[float]) – the list of shearing parameters

  • shearing_bounds (float, float) – bounds for the shearing parameters

  • bool (shearing_trainable) – whether shearing is a trainable variable

  • modes – the list of modes this gate is applied to

X_matrix

X_matrix_dual

Y_matrix

Y_matrix_dual

adjoint

The adjoint view of this Tensor (with new ``id``s). That is, ket <-> bra.

d_vector

d_vector_dual

input

A dictionary mapping the input modes to their respective wires.

is_gaussian

modes

For backward compatibility.

modes_in

The list of input modes that are used by this Tensor.

modes_out

The list of output modes that are used by this Tensor.

name

The name of this tensor.

num_modes

The number of modes on which the transformation acts.

output

A dictionary mapping the output modes to their respective wires.

parallelizable

parameter_set

The set of parameters for this transformation.

short_name

wires

The list of all wires in this tensor, sorted as [ket_in, ket_out, bra_in, bra_out].

X_matrix
X_matrix_dual
Y_matrix
Y_matrix_dual
adjoint

The adjoint view of this Tensor (with new ``id``s). That is, ket <-> bra.

d_vector
d_vector_dual
input

A dictionary mapping the input modes to their respective wires.

is_gaussian = True
modes

For backward compatibility. Don’t overuse. It returns a list of modes for this Tensor, unless it’s ambiguous.

modes_in

The list of input modes that are used by this Tensor.

If this tensor has no input modes on the bra side, or if the input modes are equal on both ket and bra sides, it returns the list of modes. Otherwise, it performs the set() operation before returning the list (and hence, the order may be unexpected).

modes_out

The list of output modes that are used by this Tensor.

If this tensor has no output modes on the bra side, or if the output modes are equal on both ket and bra sides, it returns the list of modes. Otherwise, it performs the set() operation before returning the list (and hence, the order may be unexpected).

name

The name of this tensor.

num_modes

The number of modes on which the transformation acts.

output

A dictionary mapping the output modes to their respective wires.

parallelizable = True
parameter_set

The set of parameters for this transformation.

short_name = 'P'
wires

The list of all wires in this tensor, sorted as [ket_in, ket_out, bra_in, bra_out].

U([cutoffs, shape])

Returns the unitary representation of the transformation.

XYd([allow_none])

Returns the `(X, Y, d)` triple.

XYd_dual([allow_none])

Returns the `(X, Y, d)` triple of the dual of the current transformation.

bargmann([numpy])

change_modes([modes_in_ket, modes_out_ket, ...])

Changes the modes in this tensor.

choi([cutoffs, shape, dual])

Returns the Choi representation of the transformation.

dual(state)

Applies the dual of this transformation to the given state and returns the transformed state.

primal(state)

Applies this transformation to the given state and returns the transformed state.

shape([default_dim, out_in])

Returns the shape of the underlying tensor, as inferred from the dimensions of the individual wires.

unpack_shape(shape)

Unpack the given shape into the shapes of the input and output wires on ket and bra sides.

value(shape)

The value of this tensor.

U(cutoffs=None, shape=None)

Returns the unitary representation of the transformation.

If specified, shape takes precedence over cutoffs. shape is in the order (out, in).

Note that for a unitary transformation on N modes, len(cutoffs) is N and len(shape) is 2N.

Parameters:
  • cutoffs (Optional[Sequence[int]]) – the cutoffs of the input and output modes

  • shape (Optional[Sequence[int]]) – the shape of the unitary matrix

Returns:

the unitary matrix in Fock representation

Return type:

ComplexTensor

XYd(allow_none=True)

Returns the `(X, Y, d)` triple.

Override in subclasses if computing X, Y and d together is more efficient.

Return type:

Tuple[Optional[ndarray[Tuple[int, int], TypeVar(R, float16, float32, float64)]], Optional[ndarray[Tuple[int, int], TypeVar(R, float16, float32, float64)]], Optional[ndarray[Tuple[int], TypeVar(R, float16, float32, float64)]]]

XYd_dual(allow_none=True)

Returns the `(X, Y, d)` triple of the dual of the current transformation.

Override in subclasses if computing Xdual, Ydual and ddual together is more efficient.

Return type:

tuple[Optional[ndarray[Tuple[int, int], TypeVar(R, float16, float32, float64)]], Optional[ndarray[Tuple[int, int], TypeVar(R, float16, float32, float64)]], Optional[ndarray[Tuple[int], TypeVar(R, float16, float32, float64)]]]

bargmann(numpy=False)
change_modes(modes_in_ket=None, modes_out_ket=None, modes_in_bra=None, modes_out_bra=None)

Changes the modes in this tensor.

Parameters:
  • name – The name of this tensor.

  • modes_in_ket (Optional[list[int]]) – The input modes on the ket side.

  • modes_out_ket (Optional[list[int]]) – The output modes on the ket side.

  • modes_in_bra (Optional[list[int]]) – The input modes on the bra side.

  • modes_out_bra (Optional[list[int]]) – The output modes on the bra side.

Raises:

ValueError – if one or more wires in this tensor are already connected.

Return type:

None

choi(cutoffs=None, shape=None, dual=False)

Returns the Choi representation of the transformation.

If specified, shape takes precedence over cutoffs. The shape is in the order (out_L, in_L, out_R, in_R).

Parameters:
  • cutoffs (Optional[Sequence[int]]) – the cutoffs of the input and output modes

  • shape (Optional[Sequence[int]]) – the shape of the Choi matrix

  • dual (bool) – whether to return the dual Choi

dual(state)

Applies the dual of this transformation to the given state and returns the transformed state.

Parameters:

state (State) – the state to transform

Returns:

the transformed state

Return type:

State

primal(state)

Applies this transformation to the given state and returns the transformed state.

Parameters:

state (State) – the state to transform

Returns:

the transformed state

Return type:

State

shape(default_dim=None, out_in=False)

Returns the shape of the underlying tensor, as inferred from the dimensions of the individual wires.

If out_in is False, the shape returned is in the order (in_ket, in_bra, out_ket, out_bra). Otherwise, it is in the order (out_ket, out_bra, in_ket, in_bra).

Parameters:
  • default_dim (Optional[int]) – The default dimension of wires with unspecified dimension.

  • out_in – Whether to return output shapes followed by input shapes or viceversa.

unpack_shape(shape)

Unpack the given shape into the shapes of the input and output wires on ket and bra sides.

Parameters:

shape (Tuple[int]) – A shape.

Returns:

The shape of the input wires on the ket side. shape_out_ket: The shape of the output wires on the ket side. shape_in_bra: The shape of the input wires on the bra side. shape_out_bra: The shape of the output wires on the bra side.

Return type:

shape_in_ket

value(shape)

The value of this tensor.

Parameters:

shape (Tuple[int]) – the shape of this tensor

Returns:

the unitary matrix in Fock representation

Return type:

ComplexTensor