TwoQubitPeepholeOptimization
class qiskit.transpiler.passes.TwoQubitPeepholeOptimization(*args, **kwargs)
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")
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 eltarget.
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)
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
name
run
run(dag)
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
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