Protocoles
Ce module fournit divers protocoles utilisés dans l'ensemble du progiciel.
Une interface est typing.Protocol une interface à laquelle une classe peut se conformer d'un point de vue structurel, sans en hériter explicitement. Par exemple, toute classe qui implémente une méthode __len__ satisfait à cette condition Sized, qu'elle le mentionne ou non quelque part dans sa hiérarchie de classes.
Les protocoles présentés dans ce module reposent sur le même principe, mais chacun d'entre eux s'articule autour d'une seule méthode de type « dunder », en soi tout à fait ordinaire (par exemple _majorana_operator_). Une classe qui implémente cette méthode unique satisfait ainsi au protocole correspondant (SupportsMajoranaOperator dans cet exemple) et peut être utilisée partout où ce protocole est requis, sans qu'aucun enregistrement explicite ne soit nécessaire. Il convient de noter que le terme « protocole » est parfois utilisé de manière un peu vague pour désigner une fonction de répartition indépendante du type, implémentée au-dessus d’un protocole (par exemple fermion_operator()), plutôt que l’interface elle-même; la distinction devrait ressortir clairement du contexte.
Certains des protocoles ci-dessous sont associés à une petite fonction d'aide, indépendante du type, qui appelle la méthode du protocole sur l'objet qui lui est transmis.
Protocole | Méthode | Fonction d'aide |
|---|---|---|
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_ (toutes @staticmethod) | commutator(), anti_commutator(), double_commutator() |
Chronique « 1 » | Chronique « 2 » |
|---|---|
SupportsApplyUnitaryPlaced(*args, **kwargs) | Une extension spécifique à un paquet de ffsim.SupportsApplyUnitary. |
SupportsCommutators(*args, **kwargs) | Un protocole permettant la génération efficace de commutateurs. |
SupportsFermionOperator(*args, **kwargs) | Le contrat de conversion d'opérateur de ce paquet, qui permet de convertir un opérateur en un FermionOperator. |
SupportsMajoranaOperator(*args, **kwargs) | Un équivalent du protocole SupportsFermionOperator , axé sur les opérateurs de Majorana. |
Protocoles implémentés à partir de ffsim
La simulation relève du domaine de ffsim; ses protocoles y sont définis et ne seront donc pas repris ici. Les portes et les motorisations de cet ensemble intègrent les fonctionnalités suivantes, ce qui permet aux répartiteurs de ffsim de les accepter directement :
protocole ffsim | Méthode | Implémenté par |
|---|---|---|
ffsim.SupportsApplyUnitary | _apply_unitary_(self, vec, norb, nelec, copy) | FermionicCircuit et chaque FermionicGate |
ffsim.SupportsLinearOperator | _linear_operator_(self, norb, nelec) | FermionOperator |
ffsim.SupportsTrace | _trace_(self, norb, nelec) | FermionOperator |
ffsim.SupportsFermionOperator partage le nom de la méthode _fermion_operator_ avec celle de ce package SupportsFermionOperator, mais il ne s'agit pas du même contrat : le nôtre renvoie le type de ce package FermionOperator plutôt que le type sans rapport de ffsim. Comme la distribution ffsim.fermion_operator() s'effectue uniquement en fonction du nom de la méthode, l'appeler sur un objet de ce paquet renvoie notre type.