Propagación
pauli_prop.propagation
Funciones para realizar la propagación de Pauli.
RotationGates
class RotationGates(gates, qargs, thetas)
Bases: NamedTuple
Una representación mínima intermedia de un QuantumCircuit.
Rotaciones de Pauli admitidas: rx/rxx, ry/ryy, rz/rzz, PauliEvolutionGate
Crear una nueva instancia de RotationGates(gates, qargs, thetas)
Parámetros
append_circuit_instruction
append_circuit_instruction(inst, qargs, num_qubits, *, clifford=None)
Analiza una instrucción del circuito y añade sus datos a las listas internas.
Parámetros
- inst (CircuitInstruction) – La instrucción del circuito para analizar y añadir
- qargs (list[int]) – La lista de índices de qubits de la instrucción en el contexto de su circuito
- num_qubits (int) – El número de qubits del circuito que contiene esta instrucción
- clifford (Clifford | None) – Un Clifford opcional por el que debe pasar la instrucción proporcionada. El Clifford debe actuar sobre todos los qubits del circuito.
Subidas
- ValueError – Se ha detectado una puerta no compatible en el circuito
- ValueError – Si se especifica,
clifforddebe actuar sobre todos los qubits del circuito
Tipo de retorno
Ninguna
count
count(value, /)
Devuelve el número de veces que aparece el valor.
gates
Tipo: list[ndarray[tuple[int,...], dtype[bool]]]
Una representación de las puertas similar al cálculo ZX.
index
index(value, start=0, stop=9223372036854775807, /)
Devuelve el primer índice del valor.
Lanza una excepción « ValueError » si el valor no está presente.
qargs
thetas
circuit_to_rotation_gates
circuit_to_rotation_gates(circuit)
Convierte el circuito proporcionado en una representación intermedia.
Admite puertas de rotación de Pauli («rx/rxx», «ry/ryy», «rz/rzz», « ‘PauliEvolutionGate’ ») y canales de error de Pauli-Lindblad, especificados como instrucciones « PauliLindbladError ».
Parámetros
circuit (QuantumCircuit) –
El circuito que hay que convertir. Puede contener rotaciones de Pauli (rx/rxx, ry/ryy, rz/rzz, PauliEvolutionGate ) y, opcionalmente, instrucciones de tipo « PauliLindbladError ».
Devuelve
Se devuelve una instancia RotationGates si el circuito no contiene PauliLindbladError instrucciones; en caso contrario, se devuelve una instancia NoisyRotationGates .
Subidas
ValueError – cuando se encuentra una puerta no compatible en circuit.
Tipo de retorno
RotationGates | NoisyRotationGates
propagate_through_rotation_gates
propagate_through_rotation_gates(operator, rot_gates, max_terms, atol, frame)
Propaga un operador de Pauli disperso, , a través de un circuito (representado en rot_gates), .
Para la propagación de Schrödinger: . Para la propagación de Heisenberg: .
Si es rot_gates una instancia NoisyRotationGates de, el operador se propagará a través de cada generador de ruido. El coeficiente asociado a cada término de operator se amortiguará en función de la tasa de cada generador de error anticomutativo, : .
En general, la memoria y el tiempo necesarios para la propagación a través de un circuito crecen exponencialmente con el número de operaciones del circuito, debido al crecimiento exponencial del número de términos del operador en la base de Pauli. Para regular esta dificultad exponencial, se pueden truncar los términos de Pauli pequeños (es decir, establecerlos en cero), lo que da lugar a un sesgo proporcional a las magnitudes de los términos truncados. Tras aplicar cada operación del circuito, los términos se truncan en función de dos parámetros:
- Solo se conservan los componentes de Pauli más grandes
max_terms; los términos más pequeños se truncan. Esta opción permite calcular de antemano cuánto tiempo y cuánta memoria serán suficientes para el cálculo. - Los términos con magnitudes inferiores a
atolse truncan (se establecen en cero).
Esta función preasigna espacio en memoria para el operador de tamaño completo y el búfer del operador. Es responsabilidad de quien realiza la llamada asegurarse de que dispone de memoria suficiente para almacenar los operadores que contienen términos max_terms . Cuando es max_terms None, los requisitos de memoria y tiempo suelen crecer exponencialmente con el número de operaciones del circuito.
Parámetros
- operator (SparsePauliOp) – El operador que se va a propagar
- rot_gates (RotationGates | NoisyRotationGates) – Un circuito representado en forma de
RotationGates. - max_terms (int) – El número máximo de términos que puede contener el operador a medida que se propaga
- atol (float) – Los términos cuyos coeficientes tengan magnitudes inferiores a este valor no se sumarán al operador a medida que este se propague. Este parámetro no garantiza la precisión del operador devuelto.
- frame (str) –
spara la evolución de Schrödingerhpara la evolución de Heisenberg
Devuelve
El operador evolucionado y la norma uno de todos los coeficientes truncados.
Subidas
- ValueError – no es
frameni nihs. - ValueError – es
atolnegativo. - ValueError – no
max_termses positivo.
Tipo de retorno
tupla [ SparsePauliOp, float ]
propagate_through_circuit
propagate_through_circuit(operator, circuit, max_terms, atol, frame)
Propagar un operador de Pauli disperso, , a través de un circuito, .
Admite puertas de rotación de Pauli («rx/rxx», «ry/ryy», «rz/rzz», « ‘PauliEvolutionGate’ ») y canales de error de Pauli-Lindblad, especificados como instrucciones « PauliLindbladError ».
Para la propagación de Schrödinger: . Para la propagación de Heisenberg: .
Si contiene circuit instrucciones de ruido de Pauli-Lindblad, el operador se propagará a través de cada generador de ruido. El coeficiente asociado a cada término de operator se amortiguará en función de la tasa de cada generador de error anticomutativo, : .
En general, la memoria y el tiempo necesarios para la propagación a través de un circuito crecen exponencialmente con el número de operaciones del circuito, debido al crecimiento exponencial del número de términos del operador en la base de Pauli. Para regular esta dificultad exponencial, se pueden truncar los términos de Pauli pequeños (es decir, establecerlos en cero), lo que da lugar a un sesgo proporcional a las magnitudes de los términos truncados. Tras aplicar cada operación del circuito, los términos se truncan en función de dos parámetros:
- Solo se conservan los componentes de Pauli más grandes
max_terms; los términos más pequeños se truncan. Esta opción permite calcular de antemano cuánto tiempo y cuánta memoria serán suficientes para el cálculo. - Los términos con magnitudes inferiores a
atolse truncan (se establecen en cero).
Esta función preasigna espacio en memoria para el operador de tamaño completo y el búfer del operador. Es responsabilidad de quien realiza la llamada asegurarse de que dispone de memoria suficiente para almacenar los operadores que contienen términos max_terms . Cuando es max_terms None, los requisitos de memoria y tiempo suelen crecer exponencialmente con el número de operaciones del circuito.
Parámetros
- operator (SparsePauliOp) – El operador que se va a propagar
- circuit (QuantumCircuit) – El circuito por el que se propagará la señal de control
- max_terms (int) – El número máximo de términos que puede contener el operador a medida que se propaga
- atol (float) – Los términos cuyos coeficientes tengan magnitudes inferiores a este valor no se sumarán al operador a medida que este se propague. Este parámetro no garantiza la precisión del operador devuelto.
- frame (str) –
spara la evolución de Schrödingerhpara la evolución de Heisenberg
Devuelve
El operador evolucionado
Subidas
- ValueError – no es
frameni nihs. - ValueError – es
atolnegativo. - ValueError – no
max_termses positivo.
Tipo de retorno
tupla [ SparsePauliOp, float ]
propagate_through_operator
propagate_through_operator(op1, op2, max_terms=None, coerce_op1_traceless=False, num_leading_terms=0, frame='s', atol=0.0, search_step=4)
Transmitir un operador, op1 o , a través de otro operador, op2 o .
Para la evolución de Schrödinger: .
Para la evolución de Heisenberg: .
La evolución se lleva a cabo en la base de Pauli sumando términos de la forma (sin tener en cuenta la cruz, véase la nota más abajo). El número de estos términos es cúbico con respecto al tamaño del operador (len( op1 ) * len( op2 )**2) y, por lo general, incluirá muchos Paulis duplicados.
Al establecer max_terms se obtiene un resultado aproximado, en el que solo se calculan los términos max_terms más grandes (en cuanto a la magnitud de los coeficientes). Esto puede ser mucho más rápido, pero da lugar a algunos errores debido al truncamiento de los términos más pequeños.
El cálculo aproximado consta de dos partes: buscar los términos que hay que conservar y, a continuación, calcular dichos términos. Aumentar considerablemente search_step (de forma cúbica) acelera la búsqueda, a costa de una precisión que suele ser mínima.
Es posible que algunos «Pauli» presentes en los términos conservados también hubieran aparecido en los términos truncados. Dado que esos términos truncados nunca se calculan, es imposible que se fusionen con los términos conservados que comparten el mismo Pauli. Por lo tanto, la puede n``th-largest term in the approximate result is not guaranteed to equal the nth-largest term in the exact result. Likewise, convergence to the exact result with increasing ``max_terms no ser monótona.
se supone que es hermitiana ( = )
Parámetros
-
op1 (SparsePauliOp) – El operador que se va a propagar
-
op2 (SparsePauliOp) – El operador a través del cual se va a propagar
-
max_terms (int | None) –
Cuando no es así
None, se obtiene un resultado aproximado que incluye únicamente los términos de mayormax_termsorden en el producto directo de los tres operadores en el espacio de Pauli.Cuando
max_termses yNoneel número de qubits es < 12, the propagation will be performed in the computational basis using matrix multiplication. For systems >, 12 qubits, se calculan y se suman todos los términos de Pauli; sin embargo, esto no suele ser una buena forma de calcular la evolución exacta debido a la gran cantidad de términos duplicados que hay. -
coerce_op1_traceless (bool) – Un indicador que especifica si se deben eliminar los términos de identidad del operador de salida.
-
num_leading_terms (int) – El número de términos de que hay que
op1conjugar por cada término deop2. El conjunto de términos incluidos se amplía para incluir su unión con el conjunto de términos , para . Esto puede mejorar la precisión de los componentes principales de O en la salida, a costa de un cierto coste computacional en tiempo de ejecución. -
frame (str) – «s» para la evolución de Schrödinger y «h» para la evolución de Heisenberg
-
atol (float) – Los términos del operador evolucionado cuyas magnitudes sean inferiores a
atolse truncarán -
search_step (int) – Un parámetro que puede acelerar la búsqueda en el enorme espacio de « 3D » para identificar los términos más
max_termsimportantes del producto. Si se establece este tamaño de paso en un valor >1, la búsqueda se acelera en un factor desearch_step**3, aunque ello puede suponer una pérdida de precisión. Se prevé que esta imprecisión sea pequeña parasearch_step**3 << max_terms.
Devuelve
El operador transformado
Subidas
- ValueError – no es
frameni nish. - ValueError – no
search_stepes positivo. - ValueError – contiene
max_termsun valor no válido.
Tipo de retorno
evolve_through_cliffords
evolve_through_cliffords(circuit)
Aplica la evolución (en el marco de Schrödinger) a todas las instrucciones no cliffordianas a través de todas las puertas cliffordianas del circuito.
Esto desplaza todas las puertas de Clifford reconocidas al principio del circuito y actualiza las bases de las puertas de rotación de Pauli (p. ej. RxGate, RzzGate,, PauliEvolutionGate) y de los canales de « PauliLindbladError ». No se admiten otras operaciones. Consulta la documentación de « Pauli.evolve » para obtener más información sobre la evolución de los Paulis mediante los Cliffords.
El efecto es similar al de la imagen de interacción de Clifford que aparece en arXiv:2306.04797, pero sin asignar a todos los ángulos de rotación el valor de .
La función devuelve dos objetos que representan las partes de Clifford y no Clifford del circuito.
Parámetros
circuit (QuantumCircuit) – El que se va a QuantumCircuit transformar. Solo puede contener puertas de rotación de Pauli ( PauliLindbladError añadidas al circuito como canales cuánticos) y puertas de Clifford reconocidas.
Devuelve
- Clifford : un único operador Clifford de un solo qubit que representa la primera parte del circuito
- QuantumCircuit - Un circuito que contiene la parte restante y transformada del circuito
Subidas
ValueError – El circuito de entrada contiene una puerta no compatible
Tipo de retorno
tupla [ Clifford, QuantumCircuit ]