Operator utilities (qiskit_addon_obp.utils.operations)

Utility functions for operator backpropagation.

apply_op_to(op1, op1_qargs, op2, op2_qargs, *, apply_as_transform=False)[source]

Apply the operator op2 to the operator op1.

These operators do not necessarily need to act on the same number of qubits, as they are assumed to act on a larger system. The position in the system of each operator is defined by the corresponding qargs. The output operator will be defined on union(op1_qargs, op2_qargs).

By default, this function applies op1 to op2 in the following way:

op2 @ op1

By setting apply_as_transform=True, this function will apply op1 to op2 in the following way:

op2.adjoint() @ op1 @ op2

Parameters:
  • op1 (SparsePauliOp) – The operator on which op2 will be applied.

  • op1_qargs (list[int]) – The qubit indices for op1.

  • op2 (SparsePauliOp) – The operator to apply to op1.

  • op2_qargs (list[int]) – The qubit indices for op2.

  • apply_as_transform (bool) – Whether to apply op2 to op1 as a transformation.

Returns:

The tuple (op, qargs) where op is the input op1 with op2 left-applied and qargs is a list of qubit indices for the new operator op. The qubit IDs in the output op correspond to the global qubit ID in the same index in qargs.

For example, if the output op is a SparsePauliOp("YX") and qargs is [3, 4], the X term on qubit 0 of the operator corresponds to global qubit ID 3.

Raises:

ValueError – The number of unique operator qargs must match the number of qubits in the corresponding operator.

Return type:

tuple[SparsePauliOp, list[int]]

apply_reset_to(op, qubit_id, inplace=False)[source]

Apply a reset operation to a Pauli operator.

This function applies a reset operation to op in the following way:

<0|op|0>

Terms containing Pauli X or Y terms on qubit-qubit_id will have their weight reduced to 0.0. Terms containing Pauli Z on qubit_id will have that Pauli Z replaced by an identity.

Parameters:
  • op (SparsePauliOp) – The operator to which the reset will be applied.

  • qubit_id (int) – The index of the qubit on which to apply the reset.

  • inplace (bool) – Whether to modify the operator in-place.

Returns:

The transformed operator

Return type:

SparsePauliOp

to_global_op(op, qargs, n_qubits)[source]

Convert a local operator to a global operator by inserting identities on qubits which aren’t used.

Parameters:
  • op (SparsePauliOp) – Local operator to expand.

  • qargs (list[int]) – Qubit indices for local operator.

  • n_qubits (int) – Number of qubits in the global system.

Returns:

An operator on n_qubits qubits

Raises:

ValueError – Qubit ID out of range

Return type:

SparsePauliOp

reduce_op(global_op)[source]

Create a lean representation of a global Pauli operator.

This function returns a lean representation of the input operator such that all of the qubits associated solely with Pauli-I terms have been removed. A list of indices is also returned indicating on which qubits the lean operator acts.

For example:
>>> global_op = SparsePauliOp(["IXI", "IIZ"])
>>> reduced_op, qargs = reduce_op(global_op)
>>> reduced_op
SparsePauliOp(['XI', 'IZ'],
              coeffs=[1.+0.j, 1.+0.j])
>>> qargs
[0, 1]
Parameters:

global_op (SparsePauliOp) – The global operator for which to generate a lean representation

Returns:

  • A lean representation of the input operator with qubits associated solely with identity terms removed.

  • A list of indices specifying the qubits on which the lean operator acts.

Raises:

ValueError – Input operator may not be the identity operator.

Return type:

tuple[SparsePauliOp, list[int]]