Protocolli
Questo modulo mette a disposizione i vari protocolli utilizzati in tutto il pacchetto.
A typing.Protocol è un'interfaccia che una classe può implementare a livello strutturale, senza ereditarne esplicitamente le proprietà. Ad esempio, qualsiasi classe che implementi un metodo __len__ soddisfa tale condizione Sized, indipendentemente dal fatto che ciò sia indicato o meno nella sua gerarchia di classi.
I protocolli presenti in questo modulo seguono lo stesso principio, ma ciascuno di essi ruota attorno a un unico metodo in stile "dunder", di per sé piuttosto banale (ad esempio _majorana_operator_). Una classe che implementa quel metodo soddisfa quindi il protocollo corrispondente (SupportsMajoranaOperator in questo esempio) e diventa utilizzabile ovunque sia richiesto tale protocollo, senza alcuna registrazione esplicita. Si noti che il termine “protocollo” viene talvolta utilizzato in senso lato per indicare una funzione di dispatch indipendente dal tipo, implementata sulla base di un protocollo (ad esempio fermion_operator()), piuttosto che l’interfaccia stessa; la distinzione dovrebbe risultare chiara dal contesto.
Alcuni dei protocolli riportati di seguito sono abbinati a una piccola funzione di supporto, indipendente dal tipo, che invia la chiamata al metodo del protocollo su qualsiasi oggetto le venga passato.
Protocollo | Metodo | Funzione di supporto |
|---|---|---|
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_ (tutti @staticmethod) | commutator(), anti_commutator(), double_commutator() |
Rubrica 1 | Rubrica 2 |
|---|---|
SupportsApplyUnitaryPlaced(*args, **kwargs) | Un'estensione specifica per il pacchetto ffsim.SupportsApplyUnitary. |
SupportsCommutators(*args, **kwargs) | Un protocollo che indica il supporto per la generazione efficiente di commutatori. |
SupportsFermionOperator(*args, **kwargs) | Il contratto di conversione degli operatori di questo pacchetto, che converte un operatore in un FermionOperator. |
SupportsMajoranaOperator(*args, **kwargs) | Un equivalente del protocollo SupportsFermionOperator , incentrato sugli operatori di Majorana. |
Protocolli implementati da ffsim
La simulazione è di competenza di ffsim, e i relativi protocolli sono definiti in quel documento anziché essere riportati qui. I gate e gli operatori di questo pacchetto implementano quanto segue, pertanto i dispatcher di ffsim li accettano direttamente:
protocollo ffsim | Metodo | Implementato da |
|---|---|---|
ffsim.SupportsApplyUnitary | _apply_unitary_(self, vec, norb, nelec, copy) | FermionicCircuit e ogni FermionicGate |
ffsim.SupportsLinearOperator | _linear_operator_(self, norb, nelec) | FermionOperator |
ffsim.SupportsTrace | _trace_(self, norb, nelec) | FermionOperator |
ffsim.SupportsFermionOperator condivide il nome del metodo _fermion_operator_ con quello di questo pacchetto SupportsFermionOperator, ma i due non sono lo stesso contratto: il nostro restituisce il tipo di questo pacchetto FermionOperator anziché quello non correlato di ffsim. Poiché il dispatch ffsim.fermion_operator() avviene esclusivamente in base al nome del metodo, chiamandolo su un oggetto di questo pacchetto restituisce il nostro tipo.