Skip to main content
IBM Quantum Platform

RelabelModes

class RelabelModes(permutation=None, *, solver=None, **kwargs)

Bases: GenericPass[DAGCircuit, DAGCircuit]

Una pasada de transpilación para renombrar los modos fermiónicos.

Esta pasada reordena los modos fermiónicos de un circuito. El reordenamiento se describe mediante una lista permutation , que se interpreta como una correspondencia entre el índice del modo original y el del nuevo modo: el modo original i se sitúa en el nuevo índice del permutation[i] circuito renombrado. Por ejemplo, permutation = [0, 2, 4, 1, 3, 5] coloca el modo original 1 en el nuevo índice 2, el modo original 2 en el nuevo índice 4, y así sucesivamente. Al tratarse de una permutación, cada índice debe aparecer exactamente una vez.

Posproceso

El reetiquetado reordena los modos fermiónicos, lo que a su vez influye en la correspondencia entre fermiones y qubits elegida en una etapa posterior de síntesis (y, por lo tanto, en la profundidad del circuito que se puede alcanzar). Dado que cambia el orden de los modos, cualquier cadena de bits muestreada del circuito final se expresa según el nuevo orden de modos y debe volver a asignarse al orden original antes de poder interpretarse. El cambio de etiqueta que se aplicó realmente queda registrado en un permutation campo de los FermionicDAGCircuitresultados devueltos metadata.

Importante

Lee siempre el reetiquetado a partir de los metadatos del circuito, en lugar de a partir de permutation. Cuando se utiliza la optimización automática (es decir, permutation es None), la permutación aplicada solo está disponible a partir de los metadatos; e incluso cuando permutation se ha especificado explícitamente, se garantiza que los metadatos reflejen lo que ha hecho la pasada.

Ten en cuenta que el campo de metadatos permutation solo aparece cuando la pasada ha vuelto a etiquetar realmente el circuito. Cuando la pasada no surte efecto —por ejemplo, cuando la optimización automática no puede ejecutarse porque solver falta una dependencia pyomo opcional o un — el circuito devuelto no sufre cambios y no contiene metadatos permutation , por lo que hay que acceder a él con precaución (p. ej., qcirc.metadata.get("permutation")).

Desde un punto de vista conceptual, al anular el reetiquetado se asigna a cada modo original el m valor que se midió para el nuevo modo permutation[m]. En la práctica, esto se complica por el hecho de que los modos FermionicRegister y los bits clásicos de Qiskit se ejecutan en orden inverso (little-endian), por lo que la agrupación en el espacio de modos se convierte en una negación del índice (~idx) seguida de una inversión final ([::-1]) en las cadenas de bits de recuento.

El ejemplo siguiente reetiqueta un sistema de seis modos, pasando de un ordenamiento de espines en bloques ([u0, u1, u2, d0, d1, d2]) a uno entrelazado ([u0, d0, u1, d1, u2, d2]), un recurso habitual para reducir la profundidad de implementación, y a continuación deshace el reetiquetado en los recuentos muestreados:

>>> from qiskit.passmanager import MultiStagePassManager
>>> from qiskit.providers.basic_provider import BasicSimulator
>>> from qiskit_fermions.circuit import FermionicCircuit
>>> from qiskit_fermions.circuit.library import InitializeModes
>>> from qiskit_fermions.transpiler import FermionicCircuitToDAG, QuantumDAGToCircuit
>>> from qiskit_fermions.transpiler.passes import (
...     F2QSynthesis, F2QSynthesisPluginManager, RelabelModes, TrivialF2QLayout,
... )
>>>
>>> # blocked occupation: spin-up orbitals 0 and 1 and spin-down orbital 0 are occupied
>>> circ = FermionicCircuit(6)
>>> circ.append(InitializeModes([1, 1, 0, 1, 0, 0]), circ.modes)
>>>
>>> synth_plugins = F2QSynthesisPluginManager()
>>> synth = F2QSynthesis()
>>> synth.methods["InitializeModes"] = synth_plugins.method("InitializeModes", "TrivialOccupation")()
>>>
>>> # map blocked mode order onto the interleaved one
>>> relabel = RelabelModes(permutation=[0, 2, 4, 1, 3, 5])
>>>
>>> pm = MultiStagePassManager(
...     init=FermionicCircuitToDAG(),
...     optimization=relabel,
...     layout=TrivialF2QLayout(),
...     synthesis=synth,
...     output=QuantumDAGToCircuit(),
... )
>>>
>>> qcirc = pm.run(circ)
>>> qcirc.measure_all()
>>>
>>> bit_permutation = qcirc.metadata.get("permutation")
>>> print(bit_permutation)
[0, 2, 4, 1, 3, 5]
>>>
>>> res = BasicSimulator().run(qcirc, shots=1).result()
>>> counts = res.get_counts()
>>> print(counts)  # measured in the interleaved ordering
{'000111': 1}
>>>
>>> # undo the relabeling to recover the counts in the original blocked ordering
>>> post_processed = {
...     "".join(bitstring[~idx] for idx in bit_permutation)[::-1]: count
...     for bitstring, count in counts.items()
... }
>>> print(post_processed)  # recovered in the original blocked ordering
{'001011': 1}

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

Parámetros

  • permutation (list[int] | None) – la permutación de índices utilizada para renombrar los índices de los modos fermiónicos. Cuando esto ocurra None, se determinará automáticamente una permutación basándose en build_excitation_span_minimization_model(). Consulta también permutation para obtener más detalles.
  • solver (pyomo.opt.SolverFactory | None) – la instancia del solucionador de problemas de optimización utilizada para resolver el problema build_excitation_span_minimization_model() . Cuando esto ocurre None, no se permutation puede determinar automáticamente ningún valor. Consulta también solver para obtener más detalles.
  • kwargs : cualquier argumento de palabra clave adicional se reenviará a build_excitation_span_minimization_model().

Atributos

permutation

La permutación de índices utilizada para renombrar los índices de los modos fermiónicos.

Puede tratarse de una list[int], que asigna el índice del modo original i al índice del nuevo modo permutation[i] (consulta la cadena de documentación de la clase para obtener más detalles). Su longitud debe coincidir con el número de modos fermiónicos del circuito que se va a transpilar, y cada índice debe aparecer exactamente una vez. Por lo tanto, este escenario requiere que la fase de transpilado se adapte de forma muy específica al circuito del usuario.

O bien podría ser que None, en tal caso, la función build_excitation_span_minimization_model() se utilice para definir un problema de optimización que intente minimizar la amplitud de todas las excitaciones fermiónicas que se producen. En este caso, la permutación aplicada solo está disponible a partir de los metadatos del circuito transpilado (véase la cadena de documentación de la clase).

Nota

El uso de este modelo de optimización solo se aplica a las puertas de evolución temporal que contienen una instancia FermionOperator de.

solver

La instancia del solucionador de problemas de optimización para encontrar automáticamente permutation.

Cuando permutation es None, el problema de optimización definido por build_excitation_span_minimization_model() se utiliza para encontrar automáticamente una buena permutación de los índices de modo. En tal caso, el usuario debe proporcionar un optimizador para resolver este modelo.


Métodos

find_permutation

find_permutation(dag)

Busca un índice de modo cuando permutation el usuario no lo ha especificado.

Esta función solo se ejecuta cuando el usuario no ha permutation especificado (es decir, cuando es None). Cuando ocurre eso, hace lo siguiente:

  1. Asegúrate de que la dependencia opcional «pyomo» esté instalada. De lo contrario, no se podrá realizar ninguna optimización y esta pasada del transpilador no tendrá ningún efecto.
  2. Asegúrate de que solver se especifique un. De lo contrario, no se podrá realizar ninguna optimización y esta pasada del transpilador no tendrá ningún efecto.
  3. recoger todas las excitaciones fermiónicas de cualquier puerta Evolution que contenga una instancia FermionOperator .
  4. Construir el problema de optimización utilizando build_excitation_span_minimization_model(), pasando cualquier argumento de palabra clave adicional (kwargs) procedente de cuando se construyó esta pasada del transpilador.
  5. Resuelve el problema de optimización utilizando solver y extrae la permutación final.

Parámetros

dag (FermionicDAGCircuit) – el circuito que se va a transpilear.

Devuelve

La permutación que hay que utilizar. En ese caso None, esta pasada del transpilador no tendrá ningún efecto.

Subidas

NotImplementedError – cuando se encuentra una puerta Evolution que contiene un operador que no es una instancia FermionOperator .

Tipo de retorno

tupla [ lista [ int ] | None, pyomo.opt.results.results_.SolverResults | None]

run

run(dag)

Ejecuta esta pasada de transpilació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

NotImplementedError – cuando el circuito de entrada proporcionado tiene más de un registro.

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.