TernaryTreeEncoding
class TernaryTreeEncoding(tree, mode_map=None)
Bases: object
Un árbol ternario representado mediante las imágenes de Pauli de sus operadores de Majorana.
La asociación de las «patas» del árbol con los operadores de Majorana y la construcción de sus cadenas de Pauli se realiza una sola vez, aquí, en lugar de hacerlo para cada operador mapeado. Pasa uno de estos a los mapeadores de árboles ternarios.
El emparejamiento sigue el Algoritmo 1 del artículo de Bonsai: [1] desde cada nodo, se desciende por su X enlace y, a continuación, por los enlaces Z hasta llegar a un tramo que transporta del modo de ese nodo; el Y enlace, del mismo modo, da . Esto es lo que constituye el vacío fermiónico, por lo que no se trata de una convención ajustable.
[ 1 ]
A Miller, Z., Zimborás, S., Knecht, S., Maniscalco y G. García-Pérez, «Algoritmo Bonsai: crea tus propias correspondencias entre fermiones y qubits», PRX Quantum 4, 030314 (2023), arXiv:2212.09731.
Uso
>>> from qiskit_fermions.mappers import TernaryTree, TernaryTreeEncoding
>>> enc = TernaryTreeEncoding(TernaryTree.breadth_first(4, 3))
>>> enc.num_modes, enc.max_weight
(4, 2)
Dos codificaciones se consideran iguales cuando asignan la misma cadena de Pauli a cada operador de Majorana, lo que permite que un conjunto o un diccionario elimine los duplicados. Omitir el mapa de modos equivale a dar la identidad, mientras que cualquier otro cambia el operador de Majorana al que pertenece cada cadena:
>>> tree = TernaryTree.chain(3, "Z")
>>> TernaryTreeEncoding(tree) == TernaryTreeEncoding(tree, [0, 1, 2])
True
>>> TernaryTreeEncoding(tree) == TernaryTreeEncoding(tree, [2, 1, 0])
False
La codificación se crea una sola vez y se reutiliza en todos los operadores asignados a través de ella, por lo que el emparejamiento y la construcción de la cadena no se repiten en cada llamada. El número de qubits de un operador mapeado se proporciona al mapeador, en lugar de fijarse aquí, por lo que una misma codificación sirve para registros de cualquier anchura a partir de esa num_modes .
Una codificación no se puede convertir a formato «pickled». Se trata de un artefacto derivado: al compilar se descartan el árbol y el mapa de modos a partir de los cuales se creó, por lo que admitir el formato «pickle» implicaría conservarlos únicamente con el fin de serializarlos. Selecciona el ( TernaryTree y el mapa de modos) y vuelve a compilar.
Atributos
max_weight
El mayor peso de Pauli de cualquier operador de Majorana individual.
Siempre es igual a la del TernaryTree.max_weight árbol a partir del cual se compiló: la rama que queda sin emparejar nunca está más profunda que la más profunda de las emparejadas.
num_modes
El número de modos fermiónicos que abarca esta codificación.
Métodos
majorana_image
majorana_image(majorana)
Devuelve la imagen de Pauli del operador de Majorana majorana, en forma de pares (qubit, label) .
El índice es 2 * mode + is_prime, lo que coincide con gamma(). La cadena está ordenada por qubit en orden ascendente.
>>> from qiskit_fermions.mappers import TernaryTree, TernaryTreeEncoding
>>> enc = TernaryTreeEncoding(TernaryTree.chain(3, "Z"))
>>> enc.majorana_image(4)
[(0, 'Z'), (1, 'Z'), (2, 'X')]
El coeficiente es siempre exactamente : la cadena de un tramo es un producto de Paulis en qubits distintos, por lo que es hermitiana y se eleva al cuadrado de la identidad sin fase que corregir.
Parámetros
majorana – el índice de Majorana, 2 * mode + is_prime.
Subidas
- ValueError : si no
majoranaes menor que2 * num_modes. - OverflowError : si
majoranaes negativo o no cabe en 32 bits.
total_parity
total_parity(num_qubits)
Calcula el observable de paridad fermiónica total de esta codificación.
Las « » ramas de un árbol se emparejan en operadores de Majorana , dejando exactamente una sobrante, y esa que sobra es la paridad total .
Se trata de un parámetro observable que hay que medir, no de una restricción que haya que imponer. Sus dos valores propios son físicos, por lo que no proyectan ningún estado sobre el sector : una codificación en árbol ternario consume un qubit por modo y constituye un isomorfismo unitario sobre todo el espacio de dimensión , con ambos sectores de paridad representados con multiplicidad y sin ningún subespacio no físico que deba descartarse mediante proyección.
La cadena no es, en general, la cadena «all ». Es la rama a la que conduce la ruta , que lleva la identidad en todos los nodos que no se encuentran en dicha ruta. En la cadena de Jordan-Wigner, se trata de la cadena completa :
>>> from qiskit_fermions.mappers import TernaryTree, TernaryTreeEncoding
>>> TernaryTreeEncoding(TernaryTree.chain(4, "Z")).total_parity(4)
<SparseObservable with 1 term on 4 qubits: (1+0j)(Z_3 Z_2 Z_1 Z_0)>
En el árbol equilibrado con cuatro modos, no es así:
>>> TernaryTreeEncoding(TernaryTree.breadth_first(4, 3)).total_parity(4)
<SparseObservable with 1 term on 4 qubits: (1+0j)(Z_3 Z_0)>
Solo el soporte depende del árbol: el coeficiente es en cada árbol y bajo cada mapa de modos.
Parámetros
num_qubits : el número de qubits del observable resultante. Debe ser, como mínimo, el número de modos de la codificación; si el valor es mayor, se rellena con el valor de identidad.
Devuelve
una sola cadena con coeficiente .
Tipo de retorno
El observable de paridad total
Subidas
- ValueError : si
num_qubitses inferior al recuento de modos de la codificación. - OverflowError : si
num_qubitses negativo o no cabe en 32 bits.