Protocols¶
This module provides various protocols used throughout the package.
A 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, 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 _majorana_operator_). A class implementing that
one method thereby satisfies the corresponding protocol (SupportsMajoranaOperator 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 a type-agnostic dispatch function
built on top of a protocol (for example fermion_operator()) rather than the interface itself;
the distinction should be clear from context.
Some protocols below are paired with a small, type-agnostic helper function that dispatches to the protocol method on whatever object it is given.
Protocol |
Method |
Helper function |
|---|---|---|
|
||
|
||
|
– |
|
|
|
A package-specific extension of |
|
A Protocol indicating support for efficient commutator generation. |
|
This package's operator-conversion contract, converting an operator to a |
|
An equivalent of the |
Protocols implemented from ffsim¶
Simulation is ffsim’s concern, and its protocols are defined there rather than restated here. The gates and operators of this package implement the following, so ffsim’s dispatchers accept them directly:
ffsim protocol |
Method |
Implemented by |
|---|---|---|
|
|
|
|
||
|
Caution
ffsim.SupportsFermionOperator shares the _fermion_operator_ method name with
this package’s SupportsFermionOperator, but the two are not the same contract: ours
returns this package’s FermionOperator rather than ffsim’s unrelated type. Since
ffsim.fermion_operator() dispatches purely on the method name, calling it on an object of
this package returns our type.