Skip to main content
IBM Quantum Platform

PauliEvolutionGate

class qiskit.circuit.library.PauliEvolutionGate(operator, time=1.0, label=None, synthesis=None)

GitHub

Bases: Gate

Evolución temporal de un operador formado por Paulis.

Para un operador hermitiano HH formado por términos de Pauli y tiempo de evolución (real) tt esta puerta representa el unitario

U(t)=e−itH.U(t) = e^{-itH}.

Las puertas de evolución están relacionadas con las puertas de rotación Pauli por un factor de 2. Por ejemplo, la evolución temporal del operador de Pauli XX está conectada a la rotación de Pauli XX RXR_X mediante

U(t)=e−itX=RX(2t).U(t) = e^{-itX} = R_X(2t).

Recopilación:

Esta puerta representa la evolución exacta de « U(t)U(t) ». Sin embargo, para implementar esta operación con exactitud se suele necesitar un número exponencial de puertas. Por lo tanto, el compilador suele implementar una aproximación del operador unitario U(t)U(t), por ejemplo, utilizando una fórmula de producto como la definida por LieTrotter. Al pasar el synthesis argumento, puedes especificar qué método debe utilizar el compilador; consulta qiskit.synthesis aquí las opciones disponibles.

Obsérvese que el orden en que la aproximación y métodos como control() y power() importan. Cambiar el orden puede dar lugar a diferentes unitarios.

Comprobaciones de conmutación:

Qiskit admite comprobaciones de conmutación eficientes de PauliEvolutionGate instancias con otras puertas basadas en Pauli, como PauliGate o PauliProductMeasurement. Sin embargo, estas comprobaciones requieren la conversión del operador al SparseObservable formato, por lo que recomendamos encarecidamente crear operadores utilizando esta clase de operador si se prevé un gran número de comprobaciones de conmutación (por ejemplo, si se tiene un circuito con un gran número de secuenciales PauliEvolutionGate).

Ejemplos:

from qiskit.circuit import QuantumCircuit
from qiskit.circuit.library import PauliEvolutionGate
from qiskit.quantum_info import SparsePauliOp

X = SparsePauliOp("X")
Z = SparsePauliOp("Z")
I = SparsePauliOp("I")

# build the evolution gate
operator = (Z ^ Z) - 0.1 * (X ^ I)
evo = PauliEvolutionGate(operator, time=0.2)

# plug it into a circuit
circuit = QuantumCircuit(2)
circuit.append(evo, range(2))
print(circuit.draw())

Lo anterior se imprimirá (¡nótese que el coeficiente -0.1 no se imprime!):

     ┌──────────────────────────┐
q_0: ┤0                         ├
     │  exp(-it (ZZ + XI))(0.2) │
q_1: ┤1                         ├
     └──────────────────────────┘
Aviso

Es posible que el transpilador omita silenciosamente la estrategia synthesis durante la optimización, por ejemplo, si se fusionan dos puertas de evolución de Pauli.

Referencias:

[1] G. Li et al. Paulihedral: A Generalized Block-Wise Compiler Optimization Framework For Quantum Simulation Kernels (2021). arXiv:2109.03371

Parámetros

  • operator (qiskit.quantum_info.Pauli |SparsePauliOp |SparseObservable |list[qiskit.quantum_info.Pauli |SparsePauliOp |SparseObservable]) – El operador que se va a desarrollar. También puede presentarse como una lista de operadores no conmutativos cuyos elementos son sumas de operadores conmutativos. Por ejemplo: [XY + YX, ZZ + ZI + IZ, YY].
  • time (ParameterValueType) – El tiempo de evolución.
  • label (str | None) – Una etiqueta para la puerta que se mostrará en las visualizaciones. Por defecto, la etiqueta se establece en exp(-it <operators>) donde es <operators> la suma de los Paulis. Ten en cuenta que la etiqueta no incluye ningún coeficiente de los Pauli. Consulta la cadena de documentación de la clase para ver un ejemplo.
  • synthesis (EvolutionSynthesis | None) – Una estrategia de síntesis. Si es Ninguno, la síntesis por defecto es la fórmula del producto Lie-Trotter con una sola repetición.

Atributos

base_class

Obtiene la clase base de esta instrucción. Está garantizado que se encuentra en el árbol de herencia de self.

La "clase base" de una instrucción es la clase más baja en su árbol de herencia con la que el objeto debe considerarse totalmente compatible para aplicaciones de circuito _all_. Por lo general, esto significa que la subclase se define únicamente para ofrecer algún tipo de comodidad al programador con respecto a la clase base, y la clase base es la "verdadera" clase desde el punto de vista del comportamiento. En particular, no debe anular base_class si está definiendo una versión personalizada de una instrucción que será implementada de forma diferente por el hardware, como una estrategia de medida alternativa, o una versión de una puerta parametrizada con un conjunto particular de parámetros con el propósito de distinguirla en un archivo Target de la puerta parametrizada completa.

Esto suele ser exactamente equivalente a type(obj), excepto en el caso de instancias únicas de instrucciones de biblioteca estándar. Estas instancias singleton son subclases especiales de su clase base, y esta propiedad devolverá esa base. Por ejemplo:

>>> isinstance(XGate(), XGate)
True
>>> type(XGate()) is XGate
False
>>> XGate().base_class is XGate
True

En general, no se debe confiar en la clase precisa de una instrucción; dentro de un circuito dado, se espera que Instruction.name sea un discriminador más adecuado en la mayoría de las situaciones.

decompositions

Obtenga las descomposiciones de la instrucción de la SessionEquivalenceLibrary.

definition

Definición de retorno en términos de otras puertas básicas.

label

Etiqueta de instrucciones de devolución

mutable

Esta instancia es una instancia única mutable o no.

Si este atributo es False la instancia de la puerta es un singleton compartido y no es mutable.

name

Devuelve el nombre.

num_clbits

Devuelve el número de clbits.

num_qubits

Devuelve el número de qubits.

params

Los parámetros de este Instruction. Lo ideal es que sean ángulos de puerta.

time

Devuelve el tiempo de evolución almacenado en los parámetros de la puerta.

Devuelve

El tiempo de evolución.


Métodos

add_decomposition

add_decomposition(decomposition)

GitHub

Añade una descomposición de la instrucción a la SessionEquivalenceLibrary.

broadcast_arguments

broadcast_arguments(qargs, cargs)

GitHub

Validación y tratamiento de los argumentos y su relación.

Por ejemplo, cx([q[0],q[1]], q[2]) significa cx(q[0], q[2]); cx(q[1], q[2]). Este método devuelve los argumentos en la agrupación correcta. En el ejemplo dado:

in: [[q[0],q[1]], q[2]],[]
outs: [q[0], q[2]], []
      [q[1], q[2]], []

Las normas generales de difusión son:

  • Si len(qargs) == 1:

    [q[0], q[1]] -> [q[0]],[q[1]]
  • Si len(qargs) == 2:

    [[q[0], q[1]], [r[0], r[1]]] -> [q[0], r[0]], [q[1], r[1]]
    [[q[0]], [r[0], r[1]]]       -> [q[0], r[0]], [q[0], r[1]]
    [[q[0], q[1]], [r[0]]]       -> [q[0], r[0]], [q[1], r[0]]
  • Si len(qargs) >= 3:

    [q[0], q[1]], [r[0], r[1]],  ...] -> [q[0], r[0], ...], [q[1], r[1], ...]

Parámetros

  • qargs (list) – Lista de argumentos de bits cuánticos.
  • cargs (list) – Lista de argumentos de bits clásicos.

Devuelve

Una tupla con argumentos únicos.

Eleva

CircuitError – Si la entrada no es válida. Por ejemplo, el número de argumentos no coincide con lo que cabría esperar de la puerta lógica.

Tipo de retorno

Iterable [ tupla [ lista, lista ]]

control

control(num_ctrl_qubits=1, label=None, ctrl_state=None, annotated=None)

GitHub

Devuelve la versión controlada de sí mismo.

El resultado es la versión controlada especificada de e−itHe^{-itH}. La puerta devuelta representa e−itHCe^{-it H_C}, donde HCH_C es el operador original HH, tensado con los proyectores ∣0⟩⟨0∣|0\rangle\langle 0| y ∣1⟩⟨1∣|1\rangle\langle 1| (dependiendo del estado de control).

La puerta controlada se implementa como PauliEvolutionGate, independientemente del valor de annotated.

Parámetros

  • num_ctrl_qubits (int) – Número de controles que se van a añadir. El valor predeterminado es 1.
  • label (str | None) – Una etiqueta para la puerta de evolución de Pauli resultante, que se mostrará en las visualizaciones. Por defecto, la etiqueta se establece en exp(-it <operators>) donde es <operators> la suma de los Paulis. Ten en cuenta que la etiqueta no incluye ningún coeficiente de los Pauli. Consulta la cadena de documentación de la clase para ver un ejemplo.
  • ctrl_state (int |str | None) – El estado de control de la puerta, especificado como un número entero o como una cadena de bits (p. ej., "110"). Si None, se establece por defecto en el estado en el que todos los bits son unos 2**num_ctrl_qubits - 1.
  • annotated (bool | None) – Ignorado.

Devuelve

Una versión controlada de esta puerta.

Tipo de retorno

Puerta

copy

copy(name=None)

GitHub

Copia de la instrucción.

Parámetros

name (str) – nombre que se le dará al circuito copiado; si entonces None el nombre se mantiene igual.

Devuelve

una copia de la instrucción actual, con el nombre actualizado si se proporcionó

Tipo de retorno

qiskit.circuit.Instruction

inverse

inverse(annotated=False)

GitHub

Devuelve la inversa, que se obtiene invirtiendo el signo del tiempo de evolución.

Parámetros

annotated (bool)

is_parameterized

is_parameterized()

GitHub

Devuelve si el Instruction contiene parámetros de tiempo de compilación.

power

power(exponent, annotated=False)

GitHub

Eleva esta puerta al poder de exponent.

El resultado representa e−itpHe^{-i tp H} donde pp es igual a exponent.

Parámetros

  • exponent (float) – La potencia a la que se eleva la compuerta.
  • annotated (bool) – No aplicable a esta clase. Normalmente, cuando ocurre esto True , devolvemos un AnnotatedOperation con un modificador de potencia establecido, en lugar de un concreto Gate. Sin embargo, podemos representar de forma eficaz las potencias de las evoluciones de Pauli como PauliEvolutionGate, lo cual es lo que se utiliza aquí.

Devuelve

Una operación que implementa gate^exponent.

Tipo de retorno

Puerta

repeat

repeat(n)

GitHub

Crea una instrucción que self se repite nn veces.

Parámetros

n (int) – Número de veces que se debe repetir la instrucción

Devuelve

Contiene la definición.

Tipo de retorno

qiskit.circuit.Instruction

Eleva

CircuitError – Si n < 1.

reverse_ops

reverse_ops()

GitHub

Para una instrucción compuesta, invierta el orden de las subinstrucciones.

Esto se hace invirtiendo recursivamente todas las subinstrucciones. No invierte ninguna puerta.

Devuelve

una nueva instrucción con

subinstrucciones invertidas.

Tipo de retorno

qiskit.circuit.Instruction

soft_compare

soft_compare(other)

GitHub

Comparación suave entre puertas. Sus nombres, número de qubits y números de bits clásicos deben coincidir. El número de parámetros debe coincidir. Se compara cada parámetro. Si uno es un ParameterExpression entonces no se tiene en cuenta.

Parámetros

other (instruction) – otras instrucciones.

Devuelve

son auto y otros iguales hasta expresiones de parámetros.

Tipo de retorno

bool

to_matrix

to_matrix()

GitHub

Devuelve la matriz e−itHe^{-it H} como numpy.ndarray.

Devuelve

La matriz que representa esta puerta.

Eleva

ValueError : si el parámetro time no es numérico.

Tipo de retorno

ndarray

to_mutable

to_mutable()

GitHub

Devuelve una copia mutable de esta puerta.

Este método devolverá una nueva copia mutable de esta instancia de puerta. Si se utiliza una instancia singleton, ésta será una nueva instancia única que puede mutar. Si la instancia ya es mutable será una deepcopy de esa instancia.

validate_parameter

validate_parameter(parameter)

GitHub

Los parámetros de la puerta deben ser int, float o ParameterExpression

Parámetros

parameter (ParameterExpression |float)

Tipo de retorno

ParameterExpression | float

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