Protocolos
Este módulo proporciona diversos protocolos que se utilizan en todo el paquete.
Una interfaz es typing.Protocol una estructura que una clase puede cumplir sin heredar explícitamente de ella. Por ejemplo, cualquier clase que implemente un método __len__ cumple con Sized, independientemente de que así se indique o no en algún lugar de su jerarquía de clases.
Los protocolos de este módulo siguen la misma idea, pero cada uno de ellos se centra en un único método de estilo «dunder», que por lo demás no tiene nada de especial (por ejemplo _majorana_operator_). Una clase que implemente ese método cumple, por tanto, con el protocolo correspondiente (SupportsMajoranaOperator en este ejemplo) y puede utilizarse en cualquier contexto en el que se requiera dicho protocolo, sin necesidad de ningún registro explícito. Ten en cuenta que el término «protocolo» a veces también se utiliza de forma imprecisa para referirse a una función de distribución independiente del tipo, construida sobre un protocolo (por ejemplo fermion_operator()), en lugar de a la propia interfaz; la distinción debería quedar clara por el contexto.
Algunos de los protocolos que se muestran a continuación van acompañados de una pequeña función auxiliar, independiente del tipo, que invoca el método del protocolo en cualquier objeto que se le pase como parámetro.
Protocolo | Método | Función auxiliar |
|---|---|---|
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_ (todos @staticmethod) | commutator(), anti_commutator(), double_commutator() |
Columna « 1 » | Columna « 2 » |
|---|---|
SupportsApplyUnitaryPlaced(*args, **kwargs) | Una extensión específica del paquete de ffsim.SupportsApplyUnitary. |
SupportsCommutators(*args, **kwargs) | Un protocolo que permite la generación eficiente de conmutadores. |
SupportsFermionOperator(*args, **kwargs) | El contrato de conversión de operadores de este paquete, que convierte un operador en un FermionOperator. |
SupportsMajoranaOperator(*args, **kwargs) | Un equivalente del protocolo SupportsFermionOperator , centrado en los operadores de Majorana. |
Protocolos implementados a partir de ffsim
La simulación es competencia de ffsim, y sus protocolos se definen allí, en lugar de repetirlos aquí. Las puertas y los accionamientos de este paquete implementan lo siguiente, por lo que los distribuidores de ffsim los aceptan directamente:
Protocolo ffsim | Método | Implementado por |
|---|---|---|
ffsim.SupportsApplyUnitary | _apply_unitary_(self, vec, norb, nelec, copy) | FermionicCircuit y cada FermionicGate |
ffsim.SupportsLinearOperator | _linear_operator_(self, norb, nelec) | FermionOperator |
ffsim.SupportsTrace | _trace_(self, norb, nelec) | FermionOperator |
ffsim.SupportsFermionOperator comparte el nombre del método _fermion_operator_ con el de este paquete SupportsFermionOperator, pero no se trata del mismo contrato: el nuestro devuelve el tipo de este paquete, FermionOperator en lugar del tipo no relacionado de ffsim. Dado que el despacho ffsim.fermion_operator() se realiza únicamente en función del nombre del método, al invocarlo sobre un objeto de este paquete se devuelve nuestro tipo.