Skip to main content
IBM Quantum Platform

QDriftTrotterization

class QDriftTrotterization(num_terms, *, filter_trivial=False, rng=None)

Bases: GenericPass[DAGCircuit, DAGCircuit]

Una pasada de transpilación para «trotterizar» las puertas Evolution mediante el protocolo « qDRIFT ».

Esta pasada sustituye la evolución exacta eitHe^{-i t H} de cada Evolution puerta por una fórmula de producto aleatorio: extrae muestras num_terms de los términos del hamiltoniano (o de groups, si se ha asignado), muestreando cada término con una probabilidad proporcional a la magnitud de su coeficiente, y emite una Evolution puerta por muestra. Cada puerta muestreada evoluciona su término (de magnitud unitaria y que conserva el signo) durante el mismo tiempo

δ=λtnum_terms,λ=jcj,\delta = \frac{\lambda t}{\texttt{num\_terms}}, \qquad \lambda = \sum_j |c_j|,

donde cjc_j son los coeficientes de los términos o grupos muestreados. El producto ordenado de las evoluciones muestreadas no reproduce exactamente eitHe^{-i t H}; más bien, su valor esperado sobre el muestreo se aproxima a la evolución exacta, con un error que disminuye a medida que aumenta num_terms . Dado que el resultado depende de los sorteos aleatorios, varía de una ejecución a otra, a menos que rng se especifique un valor fijo.

Sugerencia

Los términos que son diagonales en la base de ocupación-número (es decir, los productos de operadores numéricos) no tienen ningún efecto sobre las cadenas de bits muestreadas, por lo que incluirlos solo aumenta la sobrecarga de muestreo. Filtralos con filter_diagonal_terms() sobre el hamiltoniano antes de construir la Evolution puerta, en lugar de hacerlo en cada llamada a run(): esta pasada se ejecuta una vez por cada circuito transpilado, por lo que filtrar en una fase anterior evita repetir el mismo trabajo de filtrado para cada circuito generado a partir del mismo hamiltoniano.

Consulte también

El protocolo « qDRIFT » se presentó en arXiv:1811.08017.

La inicialización de esta pasada del transpilador puede realizarse con los argumentos que se indican a continuación.

Parámetros

  • num_terms (int) – el número de términos que se deben muestrear para la « qDRIFT » (Trotterización). Esto equivale al número de puertas Evolution emitidas por cada puerta de entrada; un valor mayor reduce el error de trotterización, a costa de que el circuito sea más profundo.
  • filter_trivial (bool) – Cuando se configura en True, el bucle de muestreo rechaza un término muestreado a menos que asocie un modo que se sabe que está ocupado con otro modo que se sabe que está desocupado. Cualquier término que actúe únicamente dentro de uno de estos dos conjuntos no puede cambiar la ocupación y, por lo tanto, no tiene ningún efecto sobre una cadena de bits muestreada, por lo que volver a sortear evita desperdiciar una de las ranuras num_terms en ella. Para ello, es necesario que una PrepareSlaterDeterminant puerta InitializeModes o precede a las puertas Evolution que se van a someter al proceso de Trotter (para establecer los conjuntos iniciales de modos ocupados y desocupados); si no se encuentra ninguna, o si los conjuntos de modos que establece resultan estar totalmente ocupados o totalmente desocupados, se omite el filtrado para esa puerta y, en su lugar, UserWarning se emite un. Cualquier puerta OrbitalRotation con la que se encuentre antes o entre las puertas Evolution también actualiza estos conjuntos: cada modo sobre el que actúa pasa a ser «incierto» (ya que la rotación puede mezclarlo con cualquier otro modo con el que entre en contacto), al igual que un modo con el que entra en contacto un término « qDRIFT » aceptado. Una PrepareSlaterDeterminant puerta actualiza estos conjuntos de la misma manera que lo harían sus OrbitalRotation componentes y InitializeModes si se aplicaran de forma secuencial: inicializa los conjuntos de estados ocupados y desocupados a partir de su occupation, y a continuación marca inmediatamente todos los modos sobre los que actúa como «inciertos» debido a su rotación. Consulta la cadena run() de documentación para conocer la regla de aceptación exacta.
  • rng (np.random.Generator | int | None) – el generador de números aleatorios (RNG) que se va a utilizar. Cuando se trate de un int, el generador de números aleatorios interno se inicializará con np.random.default_rng(seed=rng).

Atributos

MAX_SAMPLE_RETRIES

Valor predeterminado: 1000000

El número máximo de muestras rechazadas consecutivas que tolera filter_trivial antes de que run() se dé por vencido y genere un RuntimeError. Esto evita que se produzca un bucle infinito cuando los términos restantes del hamiltoniano no pueden tender un puente entre los conjuntos de modos ocupados y desocupados objeto de seguimiento; por ejemplo, cuando ambos conjuntos siguen siendo pequeños y disjuntos (se han marcado pocos modos como ocupados o desocupados, y ninguno se ha convertido aún en «incierto») y el soporte de ningún término restante se superpone a ambos.

num_terms

El número de términos que se deben incluir en la « qDRIFT » (trotterización).

filter_trivial

Si se deben rechazar los términos muestreados que no puedan afectar a la cadena de bits muestreada (véase la documentación de la clase para el filter_trivial argumento).


Métodos

run

run(dag)

Ejecuta esta pasada de transpilación.

Cada Evolution nodo se sustituye por Evolution puertas de un solo término num_terms muestreadas (véase la documentación de la clase). Los nodos que no son Evolution puertas se copian a la salida sin modificaciones. Dado que el muestreo es aleatorio, el resultado varía de una ejecución a otra, a menos que se rng haya establecido una semilla.

Cuando filter_trivial se activa, este método realiza un seguimiento de los conjuntos de modos que se sabe que están ocupados o desocupados, a partir de cualquier InitializeModes puerta o puertas que precedan a las Evolution puertas del circuito (varias de estas puertas colocadas en paralelo, por ejemplo, una por sector de espín, se acumulan conjuntamente). Un término muestreado solo se acepta si su soporte se cruza con ambos conjuntos, es decir, si combina un modo conocido como ocupado con otro conocido como desocupado; de lo contrario, se descarta y se vuelve a muestrear, ya que no puede afectar a la cadena de bits muestreada. Una vez aceptado un término, cada modo que lo respalda pasa a considerarse «incierto» y se añade a ambos conjuntos, lo que lo hace apto para participar en cualquiera de las dos funciones en las muestras posteriores. Cualquier puerta OrbitalRotation que se encuentre en el circuito actualiza estos conjuntos de la misma manera: cada modo sobre el que actúa pasa a ser también «incierto», ya que la rotación puede mezclarlo con cualquier otro modo de su soporte. Una PrepareSlaterDeterminant puerta se considera como la aplicación consecutiva de sus OrbitalRotation componentes y InitializeModes : su primero occupation establece los conjuntos de estados ocupados y desocupados, y a continuación cada modo sobre el que actúa se marca inmediatamente como «incierto», ya que también conlleva una rotación.

Parámetros

dag (DAGCircuit) – el circuito de entrada con instrucciones basadas en fermiones. Solo DAGOpNode op se admiten instancias FermionicGate como estas.

Devuelve

El circuito de salida, que sigue actuando sobre un registro fermiónico.

Subidas

RuntimeError – si es filter_trivial True y se rechazan muestras MAX_SAMPLE_RETRIES consecutivas sin encontrar un término no trivial que emitir.

Tipo de retorno

DAGCircuit

Métodos heredados

execute

execute(passmanager_ir, state, callback=None)

Ejecutar la tarea de optimización para el IR de Qiskit de entrada.

Parámetros

  • passmanager_ir (IR) – Qiskit IR para optimizar.
  • state (PassManagerState) – Estado relacionado con la ejecución del flujo de trabajo por parte del propio gestor de pasadas.
  • callback (Callable[[Task, IR_OUT, PropertySet, float, int], None] | None) – Una función de devolución de llamada que se invoca cada vez que se ejecuta una tarea de optimización.

Devuelve

IR de Qiskit optimizado y estado del flujo de trabajo.

Tipo de retorno

tupla [ IR_OUT, PassManagerState ]

name

name()

Nombre del paso.

Tipo de retorno

str

update_status

update_status(state, run_state)

Actualizar el estado del flujo de trabajo.

Parámetros

  • state (PassManagerState) – Pasa el estado del gestor para actualizarlo.
  • run_state (RunState) – Estado de finalización de la tarea actual.

Devuelve

Se ha actualizado el estado del gestor de pases.

Tipo de retorno

PassManagerState

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