Protokolle
Dieses Modul stellt verschiedene Protokolle bereit, die im gesamten Paket verwendet werden.
A typing.Protocol ist eine Schnittstelle, die eine Klasse strukturell erfüllen kann, ohne explizit von ihr zu erben. Beispielsweise erfüllt jede Klasse, die eine Methode __len__ implementiert, diese Bedingung Sized, unabhängig davon, ob dies irgendwo in ihrer Klassenhierarchie ausdrücklich angegeben ist oder nicht.
Die Protokolle in diesem Modul folgen demselben Prinzip, doch jedes einzelne konzentriert sich auf eine einzige, ansonsten unscheinbare Methode im Dunder-Stil (zum Beispiel _majorana_operator_). Eine Klasse, die diese eine Methode implementiert, erfüllt damit das entsprechende Protokoll (SupportsMajoranaOperator in diesem Beispiel) und kann überall dort eingesetzt werden, wo dieses Protokoll erwartet wird, ohne dass eine explizite Registrierung erforderlich ist. Beachten Sie, dass der Begriff „Protokoll“ manchmal auch im weiteren Sinne verwendet wird, um eine typunabhängige Dispatch-Funktion zu bezeichnen, die auf einem Protokoll aufbaut (zum Beispiel fermion_operator()), und nicht die Schnittstelle selbst; die Unterscheidung sollte aus dem Kontext klar hervorgehen.
Einige der unten aufgeführten Protokolle sind mit einer kleinen, typunabhängigen Hilfsfunktion gekoppelt, die die Protokollmethode für das jeweils übergebene Objekt aufruft.
Protokoll | Methode | Hilfsfunktion |
|---|---|---|
SupportsFermionOperator | _fermion_operator_(self) | fermion_operator() |
SupportsMajoranaOperator | _majorana_operator_(self) | majorana_operator() |
SupportsApplyUnitaryPlaced | _apply_unitary_placed_(self, vec, norb, nelec, copy, freg_indices) | – |
SupportsCommutators | _commutator_, _anti_commutator_, _double_commutator_ (alle @staticmethod) | commutator(), anti_commutator(), double_commutator() |
Kolumne „ 1 “ | Kolumne „ 2 “ |
|---|---|
SupportsApplyUnitaryPlaced(*args, **kwargs) | Eine paketspezifische Erweiterung von ffsim.SupportsApplyUnitary. |
SupportsCommutators(*args, **kwargs) | Ein Protokoll, das die Unterstützung für die effiziente Erzeugung von Kommutatoren angibt. |
SupportsFermionOperator(*args, **kwargs) | Der Operator-Konvertierungsvertrag dieses Pakets, der einen Operator in einen FermionOperator. konvertiert. |
SupportsMajoranaOperator(*args, **kwargs) | Ein Äquivalent des Protokolls SupportsFermionOperator , das auf Majorana-Operatoren abzielt. |
Aus ffsim implementierte Protokolle
Die Simulation ist Gegenstand von ffsim, und die entsprechenden Protokolle sind dort definiert und werden hier nicht erneut aufgeführt. Die Gatter und Treiber dieses Pakets implementieren Folgendes, sodass die Dispatcher von ffsim sie direkt akzeptieren:
ffsim-Protokoll | Methode | Implementiert von |
|---|---|---|
ffsim.SupportsApplyUnitary | _apply_unitary_(self, vec, norb, nelec, copy) | FermionicCircuit und jeder FermionicGate |
ffsim.SupportsLinearOperator | _linear_operator_(self, norb, nelec) | FermionOperator |
ffsim.SupportsTrace | _trace_(self, norb, nelec) | FermionOperator |
ffsim.SupportsFermionOperator hat denselben Methodennamen wie die Methode _fermion_operator_ in diesem Paket SupportsFermionOperator, aber es handelt sich nicht um denselben Vertrag: Unsere Methode gibt den Typ dieses Pakets zurück FermionOperator und nicht den nicht damit in Zusammenhang stehenden Typ von ffsim. Da die ffsim.fermion_operator() Weiterleitung ausschließlich anhand des Methodennamens erfolgt, liefert der Aufruf dieser Methode auf einem Objekt dieses Pakets unseren Typ zurück.