Skip to main content
IBM Quantum Platform

Propagación

pauli_prop.propagation

Funciones para realizar la propagación de Pauli.

RotationGates

class RotationGates(gates, qargs, thetas)

GitHub

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)

GitHub

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, clifford debe 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

Tipo: list[list[int]]

Los índices de los qubits sobre los que actúa cada puerta.

thetas

Tipo: list[float]

Los ángulos de rotación de todas las compuertas.

circuit_to_rotation_gates

circuit_to_rotation_gates(circuit)

GitHub

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)

GitHub

Propaga un operador de Pauli disperso, OO, a través de un circuito (representado en rot_gates), UU.

Para la propagación de Schrödinger: UOUU O U^{\dagger}. Para la propagación de Heisenberg: UOUU^{\dagger} O U.

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 cic_ioperator se amortiguará en función de la tasa de cada generador de error anticomutativo, rir_i : ci=exp(2.0ri)c_i *= exp(-2.0 * r_i).

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 atol se truncan (se establecen en cero).
Nota

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) –s para la evolución de Schrödinger h para la evolución de Heisenberg

Devuelve

El operador evolucionado y la norma uno de todos los coeficientes truncados.

Subidas

Tipo de retorno

tupla [ SparsePauliOp, float ]

propagate_through_circuit

propagate_through_circuit(operator, circuit, max_terms, atol, frame)

GitHub

Propagar un operador de Pauli disperso, OO, a través de un circuito, UU.

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: UOUU O U^{\dagger}. Para la propagación de Heisenberg: UOUU^{\dagger} O U.

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 cic_ioperator se amortiguará en función de la tasa de cada generador de error anticomutativo, rir_i : ci=exp(2.0ri)c_i *= exp(-2.0 * r_i).

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 atol se truncan (se establecen en cero).
Nota

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) –s para la evolución de Schrödinger h para la evolución de Heisenberg

Devuelve

El operador evolucionado

Subidas

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)

GitHub

Transmitir un operador, op1 o OO, a través de otro operador, op2 o UU.

Para la evolución de Schrödinger: UOUU O U^{\dagger}.

Para la evolución de Heisenberg: UOUU^{\dagger} O U.

La evolución se lleva a cabo en la base de Pauli sumando términos de la forma UiOjUkU_i O_j U_k (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.

Nota

OO se supone que es hermitiana ( OjO_j = OjO_j^{\dagger} )

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 mayor max_terms orden en el producto directo de los tres operadores en el espacio de Pauli.

    Cuando max_terms es y None el 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 op1 conjugar por cada término de op2. El conjunto de términos incluidos se amplía para incluir su unión con el conjunto de términos UiOjUiU_i O_j U_i^{\dagger}, para j<numleadingtermsj < num_leading_terms. 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 atol se 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_terms importantes del producto. Si se establece este tamaño de paso en un valor >1, la búsqueda se acelera en un factor de search_step**3, aunque ello puede suponer una pérdida de precisión. Se prevé que esta imprecisión sea pequeña para search_step**3 << max_terms.

Devuelve

El operador transformado

Subidas

Tipo de retorno

SparsePauliOp

evolve_through_cliffords

evolve_through_cliffords(circuit)

GitHub

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 π/4\leq \pi/4.

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 ]

¿Le ha resultado útil esta página?
Informe de un error, de una errata o solicite contenido en GitHub.