Skip to main content
IBM Quantum Platform

TwoQubitPeepholeOptimization

class qiskit.transpiler.passes.TwoQubitPeepholeOptimization(*args, **kwargs)

GitHub

Bases: TransformationPass

Optimización unitaria unificada de dos qubits mediante el método «peephole»

Esta pasada del transpilador está diseñada para llevar a cabo la optimización unitaria de «peephole» de dos qubits. Esta pasada localiza todos los bloques de 2 qubits del circuito, calcula el operador unitario de cada bloque y, a continuación, sintetiza dicho operador unitario. Si la operación unitaria de dos qubits sintetizada es «mejor» que el subcircuito original, se utiliza ese subcircuito para sustituir al original. La heurística utilizada para determinar cuál es la mejor opción analiza en primer lugar el número de puertas de dos qubits del circuito y da preferencia a la síntesis que contenga menos puertas de dos qubits; si el número de puertas de dos qubits es el mismo, analiza la fidelidad estimada del circuito y elige el subcircuito con mayor fidelidad estimada; y, por último, si es necesario, elige el subcircuito con el menor número total de puertas.

En caso de que el objetivo sea sobrecompleto, la pasada probará todos los descomponedores compatibles con todas las puertas compatibles con un qubit determinado. Se seleccionará la descomposición que ofrezca el mejor rendimiento esperado según la heurística anterior y se utilizará para sustituir el bloque.

Este paso está diseñado para ejecutarse en un circuito físico y se da por supuesto que las operaciones realizadas sobre un qubit determinado corresponden al qubit de hardware del objetivo. Sin embargo, es posible que el resultado de la pasada no utilice operaciones de hardware; concretamente, es posible que se generen puertas de un solo qubit que no estén incluidas entre las operaciones admitidas por el objetivo, normalmente solo si se utiliza para la síntesis una puerta parametrizada compatible con el TwoQubitControlledUDecomposer . Por lo tanto, si se ejecuta esta pasada en una etapa de optimización física (como la etapa de optimización), debería combinarse con pasadas como BasisTranslator y/o Optimize1qGatesDecomposition para garantizar que estas puertas de un solo qubit erróneas se sustituyan por operaciones compatibles con el hardware antes de salir de la etapa.

Esta pasada es multihilo, por lo que realizará el análisis en paralelo y utilizará todos los núcleos disponibles en tu sistema local. Puedes consultar la guía de configuración para obtener más detalles sobre cómo controlar el comportamiento del multihilo en Qiskit de forma más general, lo que también afectará a esta pasada

Este paso tiene una funcionalidad similar a la de ejecutar ConsolidateBlocks y UnitarySynthesis de forma secuencial en el gestor de pasos. Sin embargo, esta pasada ofrece un mejor rendimiento en tiempo de ejecución al realizar la síntesis en paralelo. Además, cuenta con heurísticas mejoradas gracias a que la optimización se lleva a cabo en un solo paso, lo que puede dar lugar a resultados de mayor calidad, especialmente en el caso de objetivos sobrecompletos y/o heterogéneos. Sin embargo, estas heurísticas y esta pasada en su conjunto solo son válidas para circuitos físicos. Además, a diferencia de UnitarySynthesis «pass», este no utiliza los complementos de síntesis unitaria. Se trata de una solución de compromiso en cuanto al rendimiento, que renuncia a la capacidad de ampliación que ofrece dicha interfaz. A nivel interno, actualmente solo utiliza y TwoQubitControlledUDecomposer para sintetizar los operadores TwoQubitBasisDecomposer unitarios de dos qubits. No debes utilizar este paso si necesitas usar la interfaz enchufable y la posibilidad de emplear diferentes algoritmos de síntesis; en su lugar, debes utilizar una combinación de ConsolidateBlocks y UnitarySynthesis para aprovechar el mecanismo de plugins en UnitarySynthesis.

from qiskit.circuit import QuantumCircuit
from qiskit.transpiler.passes import TwoQubitPeepholeOptimization
from qiskit.providers.fake_provider import GenericBackendV2

# Build an unoptimized 2 qubit circuit
unoptimized = QuantumCircuit(2)
for i in range(10):
  if i % 2:
    unoptimized.cx(0, 1)
  else:
    unoptimized.cx(1, 0)
# Generate a target with random error rates
backend = GenericBackendV2(2, ["u", "cx"], coupling_map=[[0, 1], [1, 0]])
# Instantiate pass
peephole_pass = TwoQubitPeepholeOptimization(backend.target)
# Run pass and visualize output
optimized = peephole_pass(unoptimized)
optimized.draw("mpl")
Circuito optimizado

Inicializar el pase

Parámetros

  • destino : el destino al que se va a enviar el pase
  • approximation_degree – dial heurístico utilizado para la aproximación de circuitos (aproximación de 1.0=no, aproximación de 0.0=maximal ). La aproximación puede reducir el número de puertas utilizadas en los operadores unitarios sintetizados más pequeños, a costa de alejarse del operador unitario original. Si None, la aproximación se realiza basándose en las fidelidades de las puertas especificadas en el target.

Atributos

is_analysis_pass

Comprueba si la pasada es una pasada de análisis.

Si el paso es de tipo « AnalysisPass, », eso significa que puede analizar el DAG y escribir los resultados de dicho análisis en el conjunto de propiedades. Este tipo de pasada no permite realizar modificaciones en el DAG.

is_transformation_pass

Comprueba si el paso es un paso de transformación.

Si el pase es de tipo « TransformationPass, », eso significa que el pase puede manipular el DAG, pero no puede modificar el conjunto de propiedades (aunque sí puede leerlo).


Métodos

execute

execute(passmanager_ir, state, callback=None)

GitHub

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

Parámetros

  • passmanager_ir (DAGCircuit) – Qiskit IR para optimizar.
  • state (DAGCircuit) – Estado asociado a la ejecución del flujo de trabajo por parte del propio gestor de pasadas.
  • callback (Callable[[Task, DAGCircuit, 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 [ DAGCircuit, PassManagerState ]

name

name()

GitHub

Nombre del paso.

Tipo de retorno

str

run

run(dag)

GitHub

Ejecuta una pasada en el DAGCircuit. Esto lo implementa el desarrollador de «pass».

Parámetros

dag (DAGCircuit) – el día en que se realiza el paso.

Subidas

NotImplementedError – cuando esto no se aplica durante una pasada.

Tipo de retorno

DAGCircuit

update_status

update_status(state, run_state)

GitHub

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.