---
title: Choi (latest version)
description: API reference for qiskit.quantum_info.Choi in the latest version of qiskit
source: https://eu-de.quantum.cloud.ibm.com/docs/en/api/qiskit/qiskit.quantum_info.Choi
---

# Choi

*class* `qiskit.quantum_info.Choi(data, input_dims=None, output_dims=None)`

[GitHub](https://github.com/Qiskit/qiskit/tree/stable/2.5/qiskit/quantum_info/operators/channel/choi.py#L40-L213)

Bases: `QuantumChannel`

Choi-matrix representation of a Quantum Channel.

The Choi-matrix representation of a quantum channel $\mathcal{E}$ is a matrix

$$
\Lambda = \sum_{i,j} |i\rangle\!\langle j|\otimes
\mathcal{E}\left(|i\rangle\!\langle j|\right)
$$

Evolution of a [`DensityMatrix`](/docs/api/qiskit/qiskit.quantum_info.DensityMatrix "qiskit.quantum_info.DensityMatrix") $\rho$ with respect to the Choi-matrix is given by

$$
\mathcal{E}(\rho) = \mbox{Tr}_{1}\left[\Lambda
(\rho^T \otimes \mathbb{I})\right]
$$

where $\mbox{Tr}_1$ is the [`partial_trace()`](/docs/api/qiskit/quantum_info#qiskit.quantum_info.partial_trace "qiskit.quantum_info.partial_trace") over subsystem 1.

See reference \[1] for further details.

**References**

1. C.J. Wood, J.D. Biamonte, D.G. Cory, *Tensor networks and graphical calculus for open quantum systems*, Quant. Inf. Comp. 15, 0579-0811 (2015). [arXiv:1111.6950 \[quant-ph\]](https://arxiv.org/abs/1111.6950)

Initialize a quantum channel Choi matrix operator.

**Parameters**

- **data** ([*QuantumCircuit*](/docs/api/qiskit/qiskit.circuit.QuantumCircuit "qiskit.circuit.QuantumCircuit")  *|*[*circuit.instruction.Instruction*](/docs/api/qiskit/qiskit.circuit.Instruction "qiskit.circuit.instruction.Instruction") *| BaseOperator | np.ndarray*) – data to initialize superoperator.
- **input\_dims** ([*int*](https://docs.python.org/3/library/functions.html#int)  *|*[*tuple*](https://docs.python.org/3/library/stdtypes.html#tuple) *| None*) – the input subsystem dimensions.
- **output\_dims** ([*int*](https://docs.python.org/3/library/functions.html#int)  *|*[*tuple*](https://docs.python.org/3/library/stdtypes.html#tuple) *| None*) – the output subsystem dimensions.

**Raises**

[**QiskitError**](/docs/api/qiskit/exceptions#qiskit.exceptions.QiskitError "qiskit.exceptions.QiskitError") – if input data cannot be initialized as a Choi matrix.

**Additional Information:**

If the input or output dimensions are None, they will be automatically determined from the input data. If the input data is a Numpy array of shape (4\*\*N, 4\*\*N) qubit systems will be used. If the input operator is not an N-qubit operator, it will assign a single subsystem with dimension specified by the shape of the input.

## Attributes

### atol

Default value: `1e-08`

### data

Return data.

### dim

Return tuple (input\_shape, output\_shape).

### num\_qubits

Return the number of qubits if a N-qubit operator or None otherwise.

### qargs

Return the qargs for the operator.

### rtol

Default value: `1e-05`

### settings

Return settings.

## Methods

### adjoint

`adjoint()`

[GitHub](https://github.com/Qiskit/qiskit/tree/stable/2.5/qiskit/quantum_info/operators/channel/quantum_channel.py#L127-L137)

Return the adjoint quantum channel.

> **Note**
>
> This is equivalent to the matrix Hermitian conjugate in the [`SuperOp`](/docs/api/qiskit/qiskit.quantum_info.SuperOp "qiskit.quantum_info.SuperOp") representation ie. for a channel $\mathcal{E}$, the SuperOp of the adjoint channel $\mathcal{{E}}^\dagger$ is $S_{\mathcal{E}^\dagger} = S_{\mathcal{E}}^\dagger$.

**Return type**

[*Self*](https://docs.python.org/3/library/typing.html#typing.Self)

### compose

`compose(other, qargs=None, front=False)`

[GitHub](https://github.com/Qiskit/qiskit/tree/stable/2.5/qiskit/quantum_info/operators/channel/choi.py#L169-L194)

Return the operator composition with another Choi.

**Parameters**

- **other** ([*Choi*](#qiskit.quantum_info.Choi "qiskit.quantum_info.Choi")) – a Choi object.
- **qargs** ([*list*](https://docs.python.org/3/library/stdtypes.html#list) *or None*) – a list of subsystem positions to apply other on. If None apply on all subsystems (default: None).
- **front** ([*bool*](https://docs.python.org/3/library/functions.html#bool)) – If True compose using right operator multiplication, instead of left multiplication \[default: False].

**Returns**

The composed Choi.

**Return type**

[Choi](#qiskit.quantum_info.Choi "qiskit.quantum_info.Choi")

**Raises**

[**QiskitError**](/docs/api/qiskit/exceptions#qiskit.exceptions.QiskitError "qiskit.exceptions.QiskitError") – if other cannot be converted to an operator, or has incompatible dimensions for specified subsystems.

> **Note**
>
> Composition (`&`) by default is defined as left matrix multiplication for matrix operators, while `@` (equivalent to [`dot()`](#qiskit.quantum_info.Choi.dot "qiskit.quantum_info.Choi.dot")) is defined as right matrix multiplication. That is that `A & B == A.compose(B)` is equivalent to `B @ A == B.dot(A)` when `A` and `B` are of the same type.
>
> Setting the `front=True` kwarg changes this to right matrix multiplication and is equivalent to the [`dot()`](#qiskit.quantum_info.Choi.dot "qiskit.quantum_info.Choi.dot") method `A.dot(B) == A.compose(B, front=True)`.

### conjugate

`conjugate()`

[GitHub](https://github.com/Qiskit/qiskit/tree/stable/2.5/qiskit/quantum_info/operators/channel/choi.py#L153-L156)

Return the conjugate quantum channel.

> **Note**
>
> This is equivalent to the matrix complex conjugate in the [`SuperOp`](/docs/api/qiskit/qiskit.quantum_info.SuperOp "qiskit.quantum_info.SuperOp") representation ie. for a channel $\mathcal{E}$, the SuperOp of the conjugate channel $\overline{{\mathcal{{E}}}}$ is $S_{\overline{\mathcal{E}^\dagger}} = \overline{S_{\mathcal{E}}}$.

### copy

`copy()`

[GitHub](https://github.com/Qiskit/qiskit/tree/stable/2.5/qiskit/quantum_info/operators/base_operator.py#L143-L145)

Make a deep copy of current operator.

### dot

`dot(other, qargs=None)`

[GitHub](https://github.com/Qiskit/qiskit/tree/stable/2.5/qiskit/quantum_info/operators/mixins/group.py#L136-L152)

Return the right multiplied operator self \* other.

**Parameters**

- **other** ([*Operator*](/docs/api/qiskit/qiskit.quantum_info.Operator "qiskit.quantum_info.Operator")) – an operator object.
- **qargs** ([*list*](https://docs.python.org/3/library/stdtypes.html#list) *or None*) – a list of subsystem positions to apply other on. If None apply on all subsystems (default: None).

**Returns**

The right matrix multiplied Operator.

**Return type**

[Operator](/docs/api/qiskit/qiskit.quantum_info.Operator "qiskit.quantum_info.Operator")

> **Note**
>
> The dot product can be obtained using the `@` binary operator. Hence `a.dot(b)` is equivalent to `a @ b`.

### expand

`expand(other)`

[GitHub](https://github.com/Qiskit/qiskit/tree/stable/2.5/qiskit/quantum_info/operators/channel/choi.py#L201-L204)

Return the reverse-order tensor product with another Choi.

**Parameters**

**other** ([*Choi*](#qiskit.quantum_info.Choi "qiskit.quantum_info.Choi")) – a Choi object.

**Returns**

**the tensor product $b \otimes a$, where $a$**

is the current Choi, and $b$ is the other Choi.

**Return type**

[Choi](#qiskit.quantum_info.Choi "qiskit.quantum_info.Choi")

### input\_dims

`input_dims(qargs=None)`

[GitHub](https://github.com/Qiskit/qiskit/tree/stable/2.5/qiskit/quantum_info/operators/base_operator.py#L135-L137)

Return tuple of input dimension for specified subsystems.

### is\_cp

`is_cp(atol=None, rtol=None)`

[GitHub](https://github.com/Qiskit/qiskit/tree/stable/2.5/qiskit/quantum_info/operators/channel/quantum_channel.py#L218-L221)

Test if Choi-matrix is completely-positive (CP)

**Parameters**

- **atol** ([*float*](https://docs.python.org/3/library/functions.html#float) *| None*)
- **rtol** ([*float*](https://docs.python.org/3/library/functions.html#float) *| None*)

**Return type**

[bool](https://docs.python.org/3/library/functions.html#bool)

### is\_cptp

`is_cptp(atol=None, rtol=None)`

[GitHub](https://github.com/Qiskit/qiskit/tree/stable/2.5/qiskit/quantum_info/operators/channel/quantum_channel.py#L208-L211)

Return True if completely-positive trace-preserving (CPTP).

**Parameters**

- **atol** ([*float*](https://docs.python.org/3/library/functions.html#float) *| None*)
- **rtol** ([*float*](https://docs.python.org/3/library/functions.html#float) *| None*)

**Return type**

[bool](https://docs.python.org/3/library/functions.html#bool)

### is\_tp

`is_tp(atol=None, rtol=None)`

[GitHub](https://github.com/Qiskit/qiskit/tree/stable/2.5/qiskit/quantum_info/operators/channel/quantum_channel.py#L213-L216)

Test if a channel is trace-preserving (TP)

**Parameters**

- **atol** ([*float*](https://docs.python.org/3/library/functions.html#float) *| None*)
- **rtol** ([*float*](https://docs.python.org/3/library/functions.html#float) *| None*)

**Return type**

[bool](https://docs.python.org/3/library/functions.html#bool)

### is\_unitary

`is_unitary(atol=None, rtol=None)`

[GitHub](https://github.com/Qiskit/qiskit/tree/stable/2.5/qiskit/quantum_info/operators/channel/quantum_channel.py#L223-L229)

Return True if QuantumChannel is a unitary channel.

**Parameters**

- **atol** ([*float*](https://docs.python.org/3/library/functions.html#float) *| None*)
- **rtol** ([*float*](https://docs.python.org/3/library/functions.html#float) *| None*)

**Return type**

[bool](https://docs.python.org/3/library/functions.html#bool)

### output\_dims

`output_dims(qargs=None)`

[GitHub](https://github.com/Qiskit/qiskit/tree/stable/2.5/qiskit/quantum_info/operators/base_operator.py#L139-L141)

Return tuple of output dimension for specified subsystems.

### power

`power(n)`

[GitHub](https://github.com/Qiskit/qiskit/tree/stable/2.5/qiskit/quantum_info/operators/channel/quantum_channel.py#L139-L174)

Return the power of the quantum channel.

**Parameters**

**n** ([*float*](https://docs.python.org/3/library/functions.html#float)) – the power exponent.

**Returns**

the channel $\mathcal{{E}} ^n$.

**Return type**

[SuperOp](/docs/api/qiskit/qiskit.quantum_info.SuperOp "qiskit.quantum_info.SuperOp")

**Raises**

[**QiskitError**](/docs/api/qiskit/exceptions#qiskit.exceptions.QiskitError "qiskit.exceptions.QiskitError") – if the input and output dimensions of the SuperOp are not equal.

> **Note**
>
> For non-positive or non-integer exponents the power is defined as the matrix power of the [`SuperOp`](/docs/api/qiskit/qiskit.quantum_info.SuperOp "qiskit.quantum_info.SuperOp") representation ie. for a channel $\mathcal{{E}}$, the SuperOp of the powered channel $\mathcal{{E}}^\n$ is $S_{{\mathcal{{E}}^n}} = S_{{\mathcal{{E}}}}^n$.

### reshape

`reshape(input_dims=None, output_dims=None, num_qubits=None)`

[GitHub](https://github.com/Qiskit/qiskit/tree/stable/2.5/qiskit/quantum_info/operators/base_operator.py#L106-L133)

Return a shallow copy with reshaped input and output subsystem dimensions.

**Parameters**

- **input\_dims** (*None or* [*tuple*](https://docs.python.org/3/library/stdtypes.html#tuple)) – new subsystem input dimensions. If None the original input dims will be preserved \[Default: None].
- **output\_dims** (*None or* [*tuple*](https://docs.python.org/3/library/stdtypes.html#tuple)) – new subsystem output dimensions. If None the original output dims will be preserved \[Default: None].
- **num\_qubits** (*None or* [*int*](https://docs.python.org/3/library/functions.html#int)) – reshape to an N-qubit operator \[Default: None].

**Returns**

returns self with reshaped input and output dimensions.

**Return type**

BaseOperator

**Raises**

[**QiskitError**](/docs/api/qiskit/exceptions#qiskit.exceptions.QiskitError "qiskit.exceptions.QiskitError") – if combined size of all subsystem input dimension or subsystem output dimensions is not constant.

### tensor

`tensor(other)`

[GitHub](https://github.com/Qiskit/qiskit/tree/stable/2.5/qiskit/quantum_info/operators/channel/choi.py#L196-L199)

Return the tensor product with another Choi.

**Parameters**

**other** ([*Choi*](#qiskit.quantum_info.Choi "qiskit.quantum_info.Choi")) – a Choi object.

**Returns**

**the tensor product $a \otimes b$, where $a$**

is the current Choi, and $b$ is the other Choi.

**Return type**

[Choi](#qiskit.quantum_info.Choi "qiskit.quantum_info.Choi")

> **Note**
>
> The tensor product can be obtained using the `^` binary operator. Hence `a.tensor(b)` is equivalent to `a ^ b`.

### to\_instruction

`to_instruction()`

[GitHub](https://github.com/Qiskit/qiskit/tree/stable/2.5/qiskit/quantum_info/operators/channel/quantum_channel.py#L236-L265)

Convert to a Kraus or UnitaryGate circuit instruction.

If the channel is unitary it will be added as a unitary gate, otherwise it will be added as a kraus simulator instruction.

**Returns**

A kraus instruction for the channel.

**Return type**

[qiskit.circuit.Instruction](/docs/api/qiskit/qiskit.circuit.Instruction "qiskit.circuit.Instruction")

**Raises**

[**QiskitError**](/docs/api/qiskit/exceptions#qiskit.exceptions.QiskitError "qiskit.exceptions.QiskitError") – if input data is not an N-qubit CPTP quantum channel.

### to\_operator

`to_operator()`

[GitHub](https://github.com/Qiskit/qiskit/tree/stable/2.5/qiskit/quantum_info/operators/channel/quantum_channel.py#L231-L234)

Try to convert channel to a unitary representation Operator.

**Return type**

[*Operator*](/docs/api/qiskit/qiskit.quantum_info.Operator "qiskit.quantum_info.operators.operator.Operator")

### transpose

`transpose()`

[GitHub](https://github.com/Qiskit/qiskit/tree/stable/2.5/qiskit/quantum_info/operators/channel/choi.py#L158-L167)

Return the transpose quantum channel.

> **Note**
>
> This is equivalent to the matrix transpose in the [`SuperOp`](/docs/api/qiskit/qiskit.quantum_info.SuperOp "qiskit.quantum_info.SuperOp") representation, ie. for a channel $\mathcal{E}$, the SuperOp of the transpose channel $\mathcal{{E}}^T$ is $S_{\mathcal{E}^T} = S_{\mathcal{E}}^T$.
