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 _linear_operator_). A class implementing that
one method thereby satisfies the corresponding protocol – 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 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. The simulation protocols
(SupportsApplyUnitary, SupportsLinearOperator and SupportsTrace) have
none: they are the same contracts ffsim defines, so ffsim.apply_unitary(),
ffsim.linear_operator() and ffsim.trace() dispatch to them already.
Protocol |
Method |
Helper function |
|---|---|---|
|
||
|
||
|
– |
|
|
– |
|
|
– |
|
|
– |
|
|
|
The state-vector simulation contract this package implements. |
|
A package-specific extension of |
|
A Protocol indicating support for efficient commutator generation. |
|
This package's operator-conversion contract, converting an operator to a |
|
The linear-operator conversion contract this package implements. |
|
An equivalent of the |
|
The trace contract this package implements. |