Parámetros comúnmente utilizados para la transpilación
El código de esta página se ha desarrollado teniendo en cuenta los siguientes requisitos. Recomendamos utilizar estas versiones o versiones más recientes.
qiskit[all]~=2.5.0 qiskit-ibm-runtime~=0.47.0
En esta página se describen algunos de los parámetros más utilizados para la transpilación local. Estos parámetros se configuran mediante argumentos a generate_preset_pass_manager o transpile.
Grado de aproximación
Puede utilizar el grado de aproximación para especificar hasta qué punto desea que el circuito resultante coincida con el circuito deseado (de entrada). Se trata de un valor flotante en el rango ( 0.0 - 1.0 ), donde 0.0 es la máxima aproximación y 1.0 (por defecto) es ninguna aproximación. Los valores más pequeños cambian la precisión de la salida por la facilidad de ejecución (es decir, menos puertas). El valor por defecto es 1.0.
En la síntesis unitaria de dos qubits (utilizada en las etapas iniciales de todos los niveles y para la etapa de optimización con nivel de optimización 3), este valor especifica la fidelidad objetivo de la descomposición de salida. Es decir, cuánto error se introduce cuando una representación matricial de un circuito se convierte en puertas discretas. Si el grado de aproximación es un valor más bajo (más aproximación), el circuito de salida de la síntesis diferirá más de la matriz de entrada, pero también es probable que tenga menos puertas (porque cualquier operación arbitraria de dos qubits se puede descomponer perfectamente con un máximo de tres puertas CX) y es más fácil de ejecutar.
Cuando el grado de aproximación es inferior a 1.0, pueden sintetizarse circuitos con una o dos puertas CX, lo que conlleva menos error del hardware, pero más de la aproximación. Dado que CX es la puerta más costosa en términos de error, podría ser beneficioso disminuir el número de ellas a costa de la fidelidad en la síntesis (esta técnica se utilizó para aumentar el volumen cuántico en dispositivos IBM® : Validación de ordenadores cuánticos mediante circuitos modelo aleatorios ).
Como ejemplo, generamos un UnitaryGate aleatorio de dos qubits que se sintetizará en la etapa inicial. Ajustando approximation_degree a menos de 1.0 se podría generar un circuito aproximado. También debemos especificar basis_gates para que el método de síntesis sepa qué puertas puede utilizar para la síntesis aproximada.
from qiskit import QuantumCircuit, QuantumRegister
from qiskit.circuit.library import UnitaryGate
from qiskit.quantum_info import random_unitary
from qiskit.transpiler import generate_preset_pass_manager
UU = random_unitary(4, seed=12345)
rand_U = UnitaryGate(UU)
qubits = QuantumRegister(2, name="q")
qc = QuantumCircuit(qubits)
qc.append(rand_U, qubits)
pass_manager = generate_preset_pass_manager(
optimization_level=1,
approximation_degree=0.85,
basis_gates=["sx", "rz", "cx"],
)
approx_qc = pass_manager.run(qc)
print(approx_qc.count_ops()["cx"])Output:
2
El resultado es 2 porque la aproximación requiere menos puertas CX.
Semilla del generador de números aleatorios
Algunas partes del transpilador son estocásticas, por lo que la repetición de la transpilación puede dar resultados diferentes. Para obtener un resultado reproducible, puede establecer la semilla para el generador de números pseudoaleatorios utilizando el argumento seed_transpiler . Si se repite la operación con la misma semilla, se obtendrán los mismos resultados.
Ejemplo:
pass_manager = generate_preset_pass_manager(
optimization_level=1, seed_transpiler=11, basis_gates=["sx", "rz", "cx"]
)
optimized_1 = pass_manager.run(qc)
optimized_1.draw("mpl")Output:
Diseño inicial
Antes de la transpilación, los qubits contenidos en tu circuito son qubits virtuales que no se corresponden necesariamente con qubits físicos en el backend de destino. Puede especificar la asignación inicial de qubits virtuales a qubits físicos utilizando el argumento initial_layout . Tenga en cuenta que la disposición final de los qubits puede diferir de la disposición inicial porque el transpilador puede permutar los qubits utilizando puertas de intercambio u otros medios.
En el siguiente ejemplo, construimos un diseño inicial para el backend FakeSherbrooke creando un objeto Layout objeto Nuestra disposición mapea el primer qubit de nuestro circuito al qubit 5 de Sherbrooke, y mapea el segundo qubit de nuestro circuito al qubit 6 de Sherbrooke. Tenga en cuenta que los qubits físicos siempre se representan mediante números enteros.
En estos ejemplos se utiliza el backend FakeSherbrooke``qiskit_ibm_runtime simulado de, pero puedes probarlo con cualquier backend real o simulado compatible con Qiskit. Tus resultados pueden ser diferentes.
from qiskit_ibm_runtime.fake_provider import FakeSherbrooke
from qiskit.transpiler import Layout
backend = FakeSherbrooke()
a, b = qubits
initial_layout = Layout({a: 5, b: 6})
pass_manager = generate_preset_pass_manager(
optimization_level=1, backend=backend, initial_layout=initial_layout
)
transpiled_circ = pass_manager.run(qc)
transpiled_circ.draw("mpl", idle_wires=False)Output:
Además de especificar un objeto Layout, también se puede pasar una lista de enteros, donde el -ésimo elemento de la lista contiene el qubit físico al que se debe mapear el -ésimo qubit. Por ejemplo:
initial_layout = [5, 6]
pass_manager = generate_preset_pass_manager(
optimization_level=1, backend=backend, initial_layout=initial_layout
)
transpiled_circ = pass_manager.run(qc)
transpiled_circ.draw("mpl", idle_wires=False)Output:
Puede utilizar la función plot_error_map para generar un diagrama del gráfico del dispositivo con información de error y con los qubits físicos etiquetados. También puede ver diagramas similares en la página Recursos informáticos.
from qiskit.visualization import plot_error_map
plot_error_map(backend, figsize=(30, 24))Output:
Opciones de la etapa del transpilador y del complemento
Estas opciones llevan el sufijo _method. Influyen en el funcionamiento del transpilador y se utilizan para intentar obtener un resultado mejor, diferente o específico del transpilador.
-
init_method(str) - El plugin a utilizar para la etapa de inicialización. -
layout_method(str) - El paso de selección de diseño (trivial,dense,sabre). Esto también puede ser el nombre del plugin externo a utilizar para la etapa de diseño. -
optimization_method(str) - El plugin a utilizar para la etapa de optimización. -
routing_method(str) - Nombre del paso de enrutamiento (basic,lookahead,default,sabre,none). También puede ser el nombre del plugin externo a utilizar para la etapa de enrutamiento. -
scheduling_method(str) - Nombre del pase de programación. Este también puede ser el nombre del plugin externo a utilizar para la etapa de programación.as_soon_as_possible: Programar instrucciones con avidez: lo antes posible en un recurso qubit (alias:asap).as_late_as_possible: Programar las instrucciones con retraso. Es decir, mantener los qubits en el estado de tierra siempre que sea posible (alias:alap).
-
translation_method(str) - Nombre del paso de traducción (unroller,translator,synthesis). También puede ser el nombre del plugin externo a utilizar para la etapa de traducción. -
unitary_synthesis_method(str) - El nombre del método de síntesis unitaria a utilizar. Por defecto se utilizadefault.
Para ver una lista de todos los plugins instalados para una etapa determinada, ejecute list_stage_plugins("stage_name"). Por ejemplo, si desea ver una lista de todos los plugins instalados para la etapa de enrutamiento, ejecute list_stage_plugins(routing).
Próximos pasos
- Revise el tema Opciones por defecto y ajustes de configuración.
- Aprenda a configurar el nivel de optimización.
- Prueba la guía de configuración del transpilador Compare.
- Revisa la documentación de la API del transpilador.