---
title: protocols (latest version)
description: API reference for qiskit_fermions.protocols in the latest version of qiskit-fermions
source: https://quantum.cloud.ibm.com/docs/en/api/qiskit-fermions/protocols
---

# Protocols

This module provides various protocols used throughout the package.

A [`typing.Protocol`](https://docs.python.org/3/library/typing.html#typing.Protocol) is an interface that a class can fulfill structurally, without explicitly inheriting from it. For example, any class that implements a `__len__` method satisfies [`Sized`](https://docs.python.org/3/library/typing.html#typing.Sized), whether or not it says so anywhere in its class hierarchy.

The protocols in this module follow the same idea, but each one centers on a single, otherwise unremarkable dunder-style method (for example `_linear_operator_`). A class implementing that one method thereby satisfies the corresponding protocol – [`SupportsLinearOperator`](/docs/api/qiskit-fermions/protocols-supports-linear-operator#qiskit_fermions.protocols.SupportsLinearOperator "qiskit_fermions.protocols.SupportsLinearOperator") in this example – and becomes usable wherever that protocol is expected, without any explicit registration. Note that “protocol” is sometimes also used loosely to refer to the type-agnostic dispatch function built on top of a protocol (for example [`linear_operator()`](/docs/api/qiskit-fermions/linalg-linear-operator#qiskit_fermions.linalg.linear_operator "qiskit_fermions.linalg.linear_operator")) rather than the interface itself; the distinction should be clear from context.

Most protocols below follow this pattern paired with a small, type-agnostic **helper function** that dispatches to the protocol method on whatever object it is given:

| Protocol                                                                                                                                                                                                      | Method                                                                           | Helper function                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [`SupportsFermionOperator`](/docs/api/qiskit-fermions/protocols-supports-fermion-operator#qiskit_fermions.protocols.SupportsFermionOperator "qiskit_fermions.protocols.SupportsFermionOperator")              | `_fermion_operator_(self)`                                                       | [`fermion_operator()`](/docs/api/qiskit-fermions/mappers-library-fermion-operator#qiskit_fermions.mappers.library.fermion_operator "qiskit_fermions.mappers.library.fermion_operator")                                                                                                                                                                                                                                                                                                                                                                           |
| [`SupportsMajoranaOperator`](/docs/api/qiskit-fermions/protocols-supports-majorana-operator#qiskit_fermions.protocols.SupportsMajoranaOperator "qiskit_fermions.protocols.SupportsMajoranaOperator")          | `_majorana_operator_(self)`                                                      | [`majorana_operator()`](/docs/api/qiskit-fermions/mappers-library-majorana-operator#qiskit_fermions.mappers.library.majorana_operator "qiskit_fermions.mappers.library.majorana_operator")                                                                                                                                                                                                                                                                                                                                                                       |
| [`SupportsLinearOperator`](/docs/api/qiskit-fermions/protocols-supports-linear-operator#qiskit_fermions.protocols.SupportsLinearOperator "qiskit_fermions.protocols.SupportsLinearOperator")                  | `_linear_operator_(self, norb, nelec)`                                           | [`linear_operator()`](/docs/api/qiskit-fermions/linalg-linear-operator#qiskit_fermions.linalg.linear_operator "qiskit_fermions.linalg.linear_operator")                                                                                                                                                                                                                                                                                                                                                                                                          |
| [`SupportsApplyUnitary`](/docs/api/qiskit-fermions/protocols-supports-apply-unitary#qiskit_fermions.protocols.SupportsApplyUnitary "qiskit_fermions.protocols.SupportsApplyUnitary")                          | `_apply_unitary_(self, vec, norb, nelec, copy)`                                  | [`apply_unitary()`](/docs/api/qiskit-fermions/linalg-apply-unitary#qiskit_fermions.linalg.apply_unitary "qiskit_fermions.linalg.apply_unitary")                                                                                                                                                                                                                                                                                                                                                                                                                  |
| [`SupportsApplyUnitaryPlaced`](/docs/api/qiskit-fermions/protocols-supports-apply-unitary-placed#qiskit_fermions.protocols.SupportsApplyUnitaryPlaced "qiskit_fermions.protocols.SupportsApplyUnitaryPlaced") | `_apply_unitary_placed_(self, vec, norb, nelec, copy, freg_indices)`             | –                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| [`SupportsCommutators`](/docs/api/qiskit-fermions/protocols-supports-commutators#qiskit_fermions.protocols.SupportsCommutators "qiskit_fermions.protocols.SupportsCommutators")                               | `_commutator_`, `_anti_commutator_`, `_double_commutator_` (all `@staticmethod`) | [`commutator()`](/docs/api/qiskit-fermions/operators-library-commutator#qiskit_fermions.operators.library.commutator "qiskit_fermions.operators.library.commutator"), [`anti_commutator()`](/docs/api/qiskit-fermions/operators-library-anti-commutator#qiskit_fermions.operators.library.anti_commutator "qiskit_fermions.operators.library.anti_commutator"), [`double_commutator()`](/docs/api/qiskit-fermions/operators-library-double-commutator#qiskit_fermions.operators.library.double_commutator "qiskit_fermions.operators.library.double_commutator") |

|                                                                                                                                                                                                                                   |                                                                                                                                                                                                                                                               |
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [`SupportsApplyUnitary`](/docs/api/qiskit-fermions/protocols-supports-apply-unitary#qiskit_fermions.protocols.SupportsApplyUnitary "qiskit_fermions.protocols.SupportsApplyUnitary")(\*args, \*\*kwargs)                          | A mirror of the [`ffsim.SupportsApplyUnitary`](https://qiskit-community.github.io/ffsim/api/stubs/ffsim.SupportsApplyUnitary.html#ffsim.SupportsApplyUnitary "(in ffsim)") protocol.                                                                          |
| [`SupportsApplyUnitaryPlaced`](/docs/api/qiskit-fermions/protocols-supports-apply-unitary-placed#qiskit_fermions.protocols.SupportsApplyUnitaryPlaced "qiskit_fermions.protocols.SupportsApplyUnitaryPlaced")(\*args, \*\*kwargs) | A package-specific extension of [`SupportsApplyUnitary`](/docs/api/qiskit-fermions/protocols-supports-apply-unitary#qiskit_fermions.protocols.SupportsApplyUnitary "qiskit_fermions.protocols.SupportsApplyUnitary") carrying a mode placement.               |
| [`SupportsCommutators`](/docs/api/qiskit-fermions/protocols-supports-commutators#qiskit_fermions.protocols.SupportsCommutators "qiskit_fermions.protocols.SupportsCommutators")(\*args, \*\*kwargs)                               | A Protocol indicating support for efficient commutator generation.                                                                                                                                                                                            |
| [`SupportsFermionOperator`](/docs/api/qiskit-fermions/protocols-supports-fermion-operator#qiskit_fermions.protocols.SupportsFermionOperator "qiskit_fermions.protocols.SupportsFermionOperator")(\*args, \*\*kwargs)              | An equivalent of the [`ffsim.SupportsFermionOperator`](https://qiskit-community.github.io/ffsim/api/stubs/ffsim.SupportsFermionOperator.html#ffsim.SupportsFermionOperator "(in ffsim)") protocol.                                                            |
| [`SupportsLinearOperator`](/docs/api/qiskit-fermions/protocols-supports-linear-operator#qiskit_fermions.protocols.SupportsLinearOperator "qiskit_fermions.protocols.SupportsLinearOperator")(\*args, \*\*kwargs)                  | A mirror of the [`ffsim.SupportsLinearOperator`](https://qiskit-community.github.io/ffsim/api/stubs/ffsim.SupportsLinearOperator.html#ffsim.SupportsLinearOperator "(in ffsim)") protocol.                                                                    |
| [`SupportsMajoranaOperator`](/docs/api/qiskit-fermions/protocols-supports-majorana-operator#qiskit_fermions.protocols.SupportsMajoranaOperator "qiskit_fermions.protocols.SupportsMajoranaOperator")(\*args, \*\*kwargs)          | An equivalent of the [`SupportsFermionOperator`](/docs/api/qiskit-fermions/protocols-supports-fermion-operator#qiskit_fermions.protocols.SupportsFermionOperator "qiskit_fermions.protocols.SupportsFermionOperator") protocol, targeting Majorana operators. |
