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 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
donde son los coeficientes de los términos o grupos muestreados. El producto ordenado de las evoluciones muestreadas no reproduce exactamente ; 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.
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.
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
Evolutionemitidas 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 ranurasnum_termsen ella. Para ello, es necesario que unaPrepareSlaterDeterminantpuertaInitializeModeso precede a las puertasEvolutionque 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,UserWarningse emite un. Cualquier puertaOrbitalRotationcon la que se encuentre antes o entre las puertasEvolutiontambié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. UnaPrepareSlaterDeterminantpuerta actualiza estos conjuntos de la misma manera que lo harían susOrbitalRotationcomponentes yInitializeModessi se aplicaran de forma secuencial: inicializa los conjuntos de estados ocupados y desocupados a partir de suoccupation, y a continuación marca inmediatamente todos los modos sobre los que actúa como «inciertos» debido a su rotación. Consulta la cadenarun()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á connp.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
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
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