Introducción al transpilador basado en IA de Qiskit
Tiempo estimado de uso: 5 minutos en un Her IBM (NOTA: Se trata únicamente de una estimación). (El tiempo de ejecución puede variar.)
Resultados del aprendizaje
Una vez completado este tutorial, los usuarios deberían comprender:
- Cómo utilizar el transpilador basado en IA (
generate_ai_pass_manager) como sustituto directo del transpilador estándar - Comparación entre el transpilador basado en IA y el transpilador predeterminado en cuanto a profundidad de dos qubits, número de puertas y tiempo de transpilación
- Cómo utilizar circuitos espejo para evaluar la calidad de la transpilación mediante la ejecución en hardware
Requisitos previos
Recomendamos a los usuarios que se familiaricen con los siguientes temas antes de seguir este tutorial:
- Transpilar circuitos
- Configurar gestores de pases predefinidos
- El transpilador basado en IA supera la prueba
En segundo plano
El transpilador de Qiskit, impulsado por IA, incorpora pases de transpilación basados en el aprendizaje automático que permiten generar circuitos más cortos y más eficientes desde el punto de vista del hardware que los métodos heurísticos tradicionales, como SABRE. Los circuitos más cortos acumulan menos ruido, lo que mejora directamente la calidad de los resultados en el hardware cuántico real.
En este tutorial comparamos dos estrategias de transpilación:
Estrategia | API de |
|---|---|
| Valor predeterminado | generate_preset_pass_manager(optimization_level=3, ...) |
| IA | generate_ai_pass_manager(optimization_level=1, ai_optimization_level=3, ...) |
Medimos tres parámetros para cada estrategia: la profundidad de las puertas de dos qubits, el número total de puertas y el tiempo de ejecución de la transpilación.
Pruebas de rendimiento de transpiladores basados en IA
En las pruebas comparativas, el transpilador basado en IA generó de forma sistemática circuitos menos profundos y de mayor calidad en comparación con el transpilador estándar de Qiskit. Para estas pruebas, utilizamos la estrategia predeterminada del gestor de pasadas de Qiskit, configurada con generate_preset_pass_manager. Aunque esta estrategia predeterminada suele ser eficaz, puede tener dificultades con circuitos más grandes o más complejos. Por el contrario, los pases basados en IA lograron una reducción media del 24 % en el número de puertas de dos qubits y una reducción del 36 % en la profundidad de los circuitos de gran tamaño (más de 100 qubits) al transpilarlos a la topología «heavy-hex» del hardware de l IBM Quantum®. Para obtener más información sobre estas pruebas de rendimiento, consulta este blog.
En este tutorial se analizan las principales ventajas de los «AI passes» y se comparan con los métodos tradicionales.
Requisitos
Antes de empezar este tutorial, asegúrate de tener instalados los siguientes elementos:
- Qiskit SDK v2.0 o posterior, con soporte para visualización
- Qiskit Runtime (
pip install qiskit-ibm-runtime) v0.22 o posterior - Transpilador de Qiskit IBM con modo local de IA (
pip install 'qiskit-ibm-transpiler[ai-local-mode]') - Qiskit Aer (
pip install qiskit-aer)
Configuración
from qiskit import QuantumCircuit
from qiskit.circuit.random import random_circuit
from qiskit.transpiler import generate_preset_pass_manager
from qiskit_ibm_runtime import QiskitRuntimeService, SamplerV2
from qiskit_ibm_transpiler import generate_ai_pass_manager
from qiskit_aer import AerSimulator
from qiskit_aer.noise import NoiseModel, depolarizing_error
import matplotlib.pyplot as plt
from statistics import mean, stdev
import time
import logging
seed = 42
def transpile_with_metrics(pass_manager, circuit):
"""Transpile a circuit and return the result along with key metrics."""
start = time.time()
qc_out = pass_manager.run(circuit)
elapsed = time.time() - start
depth_2q = qc_out.depth(lambda x: x.operation.num_qubits == 2)
gate_count = qc_out.size()
return qc_out, {
"depth_2q": depth_2q,
"gate_count": gate_count,
"time_s": round(elapsed, 3),
}
def remap_to_contiguous(tqc):
"""Remap a transpiled circuit to use contiguous qubit indices.
Transpiled circuits target specific physical qubits (e.g., qubit 45, 67)
on a large backend. This remaps them to 0, 1, 2, ... so Aer only
simulates the active qubits."""
active = sorted(
{tqc.find_bit(q).index for inst in tqc.data for q in inst.qubits}
)
qubit_map = {old: new for new, old in enumerate(active)}
new_qc = QuantumCircuit(len(active))
for inst in tqc.data:
old_indices = [tqc.find_bit(q).index for q in inst.qubits]
new_qc.append(inst.operation, [qubit_map[i] for i in old_indices])
return new_qc
def build_mirror_circuit(tqc, simulate=True):
"""Build a mirror circuit: U followed by U-dagger, with measurements.
The expected output is always |0...0>, so measuring the survival
probability reveals how much noise each transpilation strategy adds.
Args:
tqc: A transpiled circuit.
simulate: If True (default), remap to contiguous qubits so Aer
only simulates the active qubits. If False, keep the full
physical layout for hardware execution."""
if simulate:
tqc = remap_to_contiguous(tqc)
mirror = tqc.compose(tqc.inverse())
mirror.measure_all()
return mirror
def print_summary(results):
"""Print a summary of each metric as mean +/- stdev across all circuits,
along with the mean percentage improvement of AI over Default."""
metrics = [
("Depth 2Q", "Depth 2Q (Default)", "Depth 2Q (AI)"),
("Gate Count", "Gate Count (Default)", "Gate Count (AI)"),
("Time (s)", "Time (Default)", "Time (AI)"),
]
header = (
f"{'Metric':<12}{'Default (mean +/- std)':>24}"
f"{'AI (mean +/- std)':>22}{'AI % improvement':>22}"
)
print(header)
print("-" * len(header))
for label, col_def, col_ai in metrics:
defaults = [r[col_def] for r in results]
ais = [r[col_ai] for r in results]
pct = [(d - a) / d * 100 for d, a in zip(defaults, ais)]
default_str = f"{mean(defaults):.1f} +/- {stdev(defaults):.1f}"
ai_str = f"{mean(ais):.1f} +/- {stdev(ais):.1f}"
pct_str = f"{mean(pct):+.1f}% +/- {stdev(pct):.1f}%"
print(f"{label:<12}{default_str:>24}{ai_str:>22}{pct_str:>22}")
def plot_metrics_and_pct(results, title_prefix):
"""Plot metric comparisons and percentage improvement of AI over Default."""
qubits = [r["Qubits"] for r in results]
metrics = [
("Depth 2Q (Default)", "Depth 2Q (AI)", "Two-Qubit Depth"),
("Gate Count (Default)", "Gate Count (AI)", "Gate Count"),
("Time (Default)", "Time (AI)", "Transpilation Time"),
]
# Row 1: raw metric comparison
fig, axs = plt.subplots(1, 3, figsize=(21, 5))
fig.suptitle(
f"{title_prefix}: Metric Comparison",
fontsize=15,
fontweight="bold",
y=1.02,
)
for ax, (col_def, col_ai, label) in zip(axs, metrics):
ax.plot(qubits, [r[col_def] for r in results], "o-", label="Default")
ax.plot(qubits, [r[col_ai] for r in results], "s-", label="AI")
ax.set_title(label)
ax.set_xlabel("Number of Qubits")
ax.set_ylabel(label)
ax.legend()
plt.tight_layout()
plt.show()
# Row 2: percentage improvement
fig, axs = plt.subplots(1, 3, figsize=(21, 5))
fig.suptitle(
f"{title_prefix}: % Improvement of AI over Default",
fontsize=15,
fontweight="bold",
y=1.02,
)
for ax, (col_def, col_ai, label) in zip(axs, metrics):
pct = [(r[col_def] - r[col_ai]) / r[col_def] * 100 for r in results]
ax.axhline(
0, color="#1f77b4", linewidth=2, label="Default (baseline)"
)
ax.plot(qubits, pct, "s-", color="#ff7f0e", label="AI")
ax.fill_between(qubits, 0, pct, alpha=0.15, color="#ff7f0e")
ax.set_title(label)
ax.set_xlabel("Number of Qubits")
ax.set_ylabel("% Improvement")
ax.legend()
plt.tight_layout()
plt.show()
# Suppress verbose AI-powered transpiler logs
logging.getLogger(
"qiskit_ibm_transpiler.wrappers.ai_local_synthesis"
).setLevel(logging.WARNING)Ejemplo de simulador a pequeña escala
Paso 1: Asignar entradas clásicas a un problema cuántico
Generamos 20 circuitos aleatorios de profundidad 4, en los que el número de qubits oscila entre seis y 25. Estos circuitos nos servirán como casos de prueba para comparar estrategias de transpilación.
num_circuits_sim = 20
depth_sim = 4
qubit_range_sim = list(range(6, 26))
circuits_sim = [
# We have only two qubit gates, as those test how well the
# transpiler can optimize the circuit.
random_circuit(
num_qubits=n,
depth=depth_sim,
max_operands=2,
num_operand_distribution={2: 1},
seed=seed + i,
)
for i, n in enumerate(qubit_range_sim)
]
print(
f"Created {len(circuits_sim)} circuits with qubit counts "
f"from {qubit_range_sim[0]} to {qubit_range_sim[-1]}"
)
circuits_sim[0].draw(output="mpl", fold=-1)Output:
Created 20 circuits with qubit counts from 6 to 25
Paso 2: Optimizar el problema para la ejecución en hardware cuántico
Creamos el gestor de pases predeterminado (SABRE) para el backend seleccionado. Ambas estrategias de transpilación se centran en el mapa de acoplamiento completo del backend. La simulación local sigue siendo manejable porque el paso de simulación utiliza remap_to_contiguous para reasignar cada circuito transpilado únicamente a sus qubits activos, de modo que Aer simula solo esos qubits en lugar de todo el dispositivo.
service = QiskitRuntimeService()
backend = service.least_busy(
min_num_qubits=100, operational=True, simulator=False
)
pm_default_sim = generate_preset_pass_manager(
optimization_level=3,
backend=backend,
seed_transpiler=seed,
)results_sim = []
for i, qc in enumerate(circuits_sim):
n = qubit_range_sim[i]
qc_default, m_default = transpile_with_metrics(pm_default_sim, qc)
# Create a fresh AI pass manager each iteration to avoid stale layout state
pm_ai = generate_ai_pass_manager(
optimization_level=1,
ai_optimization_level=3,
backend=backend,
)
qc_ai, m_ai = transpile_with_metrics(pm_ai, qc)
results_sim.append(
{
"Qubits": n,
"Depth 2Q (Default)": m_default["depth_2q"],
"Depth 2Q (AI)": m_ai["depth_2q"],
"Gate Count (Default)": m_default["gate_count"],
"Gate Count (AI)": m_ai["gate_count"],
"Time (Default)": m_default["time_s"],
"Time (AI)": m_ai["time_s"],
}
)
print_summary(results_sim)Output:
Fetching 4 files: 0%| | 0/4 [00:00<?, ?it/s]
Metric Default (mean +/- std) AI (mean +/- std) AI % improvement
--------------------------------------------------------------------------------
Depth 2Q 33.0 +/- 12.9 26.4 +/- 8.0 +15.8% +/- 17.6%
Gate Count 522.0 +/- 266.0 560.5 +/- 279.1 -9.0% +/- 9.0%
Time (s) 0.0 +/- 0.0 0.2 +/- 0.1 -893.6% +/- 362.9%
La tabla resumen muestra la media y la desviación estándar de cada métrica en los 20 circuitos, junto con el porcentaje medio de mejora del transpiler basado en IA con respecto al predeterminado. Los valores positivos indican que el transpilador basado en IA ha obtenido mejores resultados; los valores negativos indican que el valor por defecto era mejor.
En este ejemplo a pequeña escala, el transpilador basado en IA alcanza una profundidad de dos qubits aproximadamente un 16 % menor de media, pero a costa de un número de puertas aproximadamente un 9 % mayor. Esto pone de relieve una disyuntiva clave a la hora de elegir entre ambas estrategias: el transpilador basado en IA da prioridad a la reducción de la profundidad (menos capas secuenciales de puertas de dos qubits), mientras que el transpilador predeterminado (SABRE) da prioridad a minimizar el número total de puertas (menos inserciones de SWAP). Dependiendo de tu aplicación, puede que una métrica sea más importante que la otra.
plot_metrics_and_pct(results_sim, "Small-Scale Random Circuits")Output:
Profundidad de dos qubits: El transpilador basado en IA suele generar circuitos con una profundidad de dos qubits menor. La profundidad es uno de los principales parámetros que el modelo de enrutamiento basado en IA está entrenado para optimizar, y la mejora es apreciable en la mayoría de los tamaños de circuitos, aunque SABRE la iguala o la supera en circuitos concretos.
Recuento de puertas: Los resultados están muy igualados a esta escala, aunque SABRE mantiene una ligera ventaja en general. La heurística de enrutamiento de SABRE está diseñada para minimizar el número de puertas SWAP insertadas, lo que reduce directamente el número de puertas. Cuando los circuitos son de tamaño reducido, la diferencia es mínima.
Tiempo de transpilación: el tiempo de ejecución de SABRE es prácticamente constante independientemente del número de qubits, por lo que el tamaño del circuito tiene poco efecto sobre su tiempo de transpilación a esta escala. La lógica de enrutamiento principal de SABRE está muy optimizada (implementada en su mayor parte en Rust). El transpilador basado en IA tarda bastante más y su tiempo de ejecución varía en función del tamaño del circuito, aunque los tiempos absolutos siguen siendo razonables para un uso interactivo.
Paso 3: Ejecutar utilizando Qiskit primitives
Para evaluar el impacto de la transpilación en la fidelidad del circuito, construye circuitos espejo a partir del caso de 10 qubits y ejecútalos en el simulador Aer con un modelo de ruido sencillo. La salida esperada de un circuito espejo es siempre la cadena de bits compuesta exclusivamente por ceros, por lo que la probabilidad de obtener un resultado de « » pone de manifiesto en qué medida cada estrategia de transpilación conserva la fidelidad.
# Use the 10-qubit circuit (index where qubits == 10)
idx_10q = qubit_range_sim.index(10)
qc_10q = circuits_sim[idx_10q]
qc_default_10q, _ = transpile_with_metrics(pm_default_sim, qc_10q)
pm_ai = generate_ai_pass_manager(
optimization_level=1,
ai_optimization_level=3,
backend=backend,
)
qc_ai_10q, _ = transpile_with_metrics(pm_ai, qc_10q)
tqc_methods = {
"Default": qc_default_10q,
"AI": qc_ai_10q,
}
print(
f"Default: depth {qc_default_10q.depth()}, gates {qc_default_10q.size()}"
)
print(f"AI: depth {qc_ai_10q.depth()}, gates {qc_ai_10q.size()}")Output:
Default: depth 84, gates 280
AI: depth 91, gates 343
# Build a simple depolarizing noise model
noise_model = NoiseModel()
noise_model.add_all_qubit_quantum_error(
depolarizing_error(0.001, 1),
["sx", "x", "rz"], # ~0.1% per 1Q gate
)
noise_model.add_all_qubit_quantum_error(
depolarizing_error(0.01, 2),
["cx", "ecr"], # ~1% per 2Q gate
)
aer_sim = AerSimulator(noise_model=noise_model)
shots = 10000
survival_probs = {}
for method, tqc in tqc_methods.items():
mirror = build_mirror_circuit(tqc, simulate=True)
sampler = SamplerV2(mode=aer_sim)
job = sampler.run([mirror], shots=shots)
counts = job.result()[0].data.meas.get_counts()
all_zeros = "0" * mirror.num_qubits
survival = counts.get(all_zeros, 0) / shots
survival_probs[method] = survival
print(
f"{method:8s} P(|00...0>) = {survival:.4f} "
f"({counts.get(all_zeros, 0)}/{shots})"
)Output:
Default P(|00...0>) = 0.8460 (8460/10000)
AI P(|00...0>) = 0.8121 (8121/10000)
Simulamos ambos circuitos de espejo en el simulador Aer utilizando un modelo sencillo de ruido despolarizador. La probabilidad de supervivencia, definida como la fracción de intentos que devuelven la cadena de bits compuesta íntegramente por ceros, cuantifica la cantidad de ruido que introduce cada estrategia de transpilación.
Paso 4: Procesamiento posterior y devolución del resultado en el formato clásico deseado
Calculamos la probabilidad de obtener la cadena de bits compuesta exclusivamente por ceros en ambas series. Una mayor probabilidad de supervivencia indica una mayor fidelidad, lo que significa que la transpilación introdujo menos ruido. El gráfico que se muestra a continuación representa el complemento, 1 - P(|0...0>), de modo que una barra más baja indica una mayor fidelidad y permite apreciar más fácilmente pequeñas diferencias en el error.
# Plot 1 - P(|0...0>), the probability of an erroneous (non-zero) outcome.
# A lower bar means the transpilation introduced less noise.
error_probs = {method: 1 - p for method, p in survival_probs.items()}
fig, ax = plt.subplots(figsize=(6, 4))
ax.bar(
error_probs.keys(),
error_probs.values(),
color=["steelblue", "coral"],
)
ax.set_ylabel("1 - P(|0...0>)")
ax.set_title("Mirror Circuit Error (10-qubit, Aer Simulator)")
ax.set_ylim(0, 1)
plt.tight_layout()
plt.show()Output:
En este caso, el transpilador predeterminado generó un circuito tanto menos profundo como más pequeño para esta instancia concreta de 10 qubits, por lo que cabe esperar que su fidelidad sea mayor. Los resultados varían según el circuito: tal y como muestra la tabla resumen anterior, la ventaja del transpilador basado en IA radica en una menor profundidad media de dos qubits, no en cada circuito concreto. La estrategia que ofrezca una mayor fidelidad depende de la magnitud de la diferencia en cada parámetro, de las características de ruido del hardware y de la estructura del circuito. En un modelo de ruido despolarizante uniforme, el número total de puertas suele tener un impacto más directo en el error acumulado que la profundidad por sí sola.
Ejemplo de hardware a gran escala
Pasos 1-4
Aquí, todos estos detalles se integran en un flujo de trabajo claro a mayor escala, que luego se ejecuta en hardware cuántico real.
El código siguiente genera 25 circuitos aleatorios con una profundidad de 8, en los que el número de qubits oscila entre 26 y 50. A continuación, estos circuitos se transpilan con ambas estrategias y se recopilan las mismas métricas. A continuación, construimos circuitos espejo a partir del caso de 26 qubits y los enviamos al backend real.
# -------------------------Step 1-------------------------
num_circuits_hw = 25
depth_hw = 8
qubit_range_hw = list(range(26, 51))
circuits_hw = [
# We have only two qubit gates, as those test how well the
# transpiler can optimize the circuit.
random_circuit(
num_qubits=n,
depth=depth_hw,
max_operands=2,
num_operand_distribution={2: 1},
seed=seed + i,
)
for i, n in enumerate(qubit_range_hw)
]
print(
f"Created {len(circuits_hw)} circuits with qubit counts "
f"from {qubit_range_hw[0]} to {qubit_range_hw[-1]}"
)Output:
Created 25 circuits with qubit counts from 26 to 50
# -------------------------Step 2-------------------------
pm_default = generate_preset_pass_manager(
optimization_level=3,
backend=backend,
seed_transpiler=seed,
)
results_hw = []
for i, qc in enumerate(circuits_hw):
n = qubit_range_hw[i]
qc_default, m_default = transpile_with_metrics(pm_default, qc)
# Create a fresh AI pass manager each iteration to avoid stale layout state
pm_ai = generate_ai_pass_manager(
optimization_level=1,
ai_optimization_level=3,
backend=backend,
)
qc_ai, m_ai = transpile_with_metrics(pm_ai, qc)
results_hw.append(
{
"Qubits": n,
"Depth 2Q (Default)": m_default["depth_2q"],
"Depth 2Q (AI)": m_ai["depth_2q"],
"Gate Count (Default)": m_default["gate_count"],
"Gate Count (AI)": m_ai["gate_count"],
"Time (Default)": m_default["time_s"],
"Time (AI)": m_ai["time_s"],
}
)
print_summary(results_hw)Output:
Metric Default (mean +/- std) AI (mean +/- std) AI % improvement
--------------------------------------------------------------------------------
Depth 2Q 217.4 +/- 50.4 191.0 +/- 35.6 +10.9% +/- 10.7%
Gate Count 4513.3 +/- 1394.3 5227.1 +/- 1536.4 -16.4% +/- 5.8%
Time (s) 0.1 +/- 0.0 3.5 +/- 1.5 -3588.2% +/- 643.6%
plot_metrics_and_pct(results_hw, "Large-Scale Random Circuits")Output:
# -------------------------Step 3-------------------------
# Build mirror circuits from the 26-qubit case
idx_26q = qubit_range_hw.index(26)
qc_26q = circuits_hw[idx_26q]
qc_default_26q, _ = transpile_with_metrics(pm_default, qc_26q)
pm_ai = generate_ai_pass_manager(
optimization_level=1,
ai_optimization_level=3,
backend=backend,
)
qc_ai_26q, _ = transpile_with_metrics(pm_ai, qc_26q)
mirror_default_hw = build_mirror_circuit(qc_default_26q, simulate=False)
mirror_ai_hw = build_mirror_circuit(qc_ai_26q, simulate=False)
# Re-transpile to basis gates (the inverse can introduce gates like sxdg)
pm_basis = generate_preset_pass_manager(
optimization_level=0,
backend=backend,
)
mirror_default_hw = pm_basis.run(mirror_default_hw)
mirror_ai_hw = pm_basis.run(mirror_ai_hw)
print(
f"Mirror circuit (Default): depth {mirror_default_hw.depth()}, "
f"gates {mirror_default_hw.size()}"
)
print(
f"Mirror circuit (AI): depth {mirror_ai_hw.depth()}, "
f"gates {mirror_ai_hw.size()}"
)
# Submit to real hardware
sampler_hw = SamplerV2(mode=backend)
sampler_hw.options.environment.job_tags = ["TUT_AITI"]
shots_hw = 500000
job_hw = sampler_hw.run([mirror_default_hw, mirror_ai_hw], shots=shots_hw)
print(f"Job submitted: {job_hw.job_id()}")Output:
Mirror circuit (Default): depth 1577, gates 9672
Mirror circuit (AI): depth 1235, gates 11092
Job submitted: d8gt7vm6983c73dqbg0g
# -------------------------Step 4-------------------------
result_hw = job_hw.result()
survival_probs_hw = {}
for i, method in enumerate(["Default", "AI"]):
counts = result_hw[i].data.meas.get_counts()
mirror = [mirror_default_hw, mirror_ai_hw][i]
all_zeros = "0" * mirror.num_qubits
survival = counts.get(all_zeros, 0) / shots_hw
survival_probs_hw[method] = survival
print(
f"{method:8s} P(|00...0>) = {survival:.4f} "
f"({counts.get(all_zeros, 0)}/{shots_hw})"
)
# Plot 1 - P(|0...0>), the probability of an erroneous (non-zero) outcome.
# A lower bar means the transpilation introduced less noise.
error_probs_hw = {method: 1 - p for method, p in survival_probs_hw.items()}
fig, ax = plt.subplots(figsize=(6, 4))
ax.bar(
error_probs_hw.keys(),
error_probs_hw.values(),
color=["steelblue", "coral"],
)
ax.set_ylabel("1 - P(|0...0>)")
ax.set_title(f"Mirror Circuit Error (26-qubit, {backend.name})")
ax.set_ylim(0, 1)
plt.tight_layout()
plt.show()Output:
Default P(|00...0>) = 0.0005 (239/500000)
AI P(|00...0>) = 0.0050 (2516/500000)
Análisis de los resultados
Los resultados a gran escala refuerzan las tendencias observadas en el ejemplo a pequeña escala, ahora en un contexto más exigente.
Profundidad de dos qubits: El transpilador basado en IA sigue ofreciendo una profundidad de dos qubits notablemente menor en toda la gama de tamaños de circuitos. La optimización de la profundidad es uno de los principales objetivos para los que se ha entrenado el modelo de enrutamiento basado en IA, y la ventaja es más notable cuando el número de qubits es mayor, ya que el problema de enrutamiento se vuelve más complejo para los métodos heurísticos.
Número de puertas: El transpilador predeterminado (SABRE) genera sistemáticamente circuitos con menos puertas en todos los tamaños de circuito de este rango. La heurística de SABRE está diseñada específicamente para minimizar el número de puertas lógicas, y a esta escala la ventaja es clara y uniforme.
Tiempo de transpilación: La diferencia en el tiempo de transpilación se acentúa a escalas mayores. SABRE se mantiene prácticamente constante, mientras que el tiempo de ejecución del transpilador basado en IA aumenta de forma más pronunciada. A pesar de ello, el tiempo de ejecución del transpilador basado en IA sigue siendo viable para la mayoría de los flujos de trabajo.
Precisión del circuito espejo: Ambos métodos arrojan probabilidades de supervivencia muy por debajo del 1 % a esta escala, lo que deja poca señal útil. Con un número total de puertas de alrededor de 10 000 y profundidades de dos qubits que superan los 1 000, el ruido despolarizador acumulado a lo largo del circuito de espejos anula la mayor parte de la señal. Esto pone de manifiesto una limitación clave del enfoque del circuito espejo: aunque es sencillo y no requiere simulación clásica, no se adapta bien a circuitos grandes o profundos, en los que ambos métodos se ven empujados cerca del umbral de ruido y la débil señal que sobrevive queda dominada por el error acumulado.
Aunque estos resultados ponen de relieve la eficacia del transpilador basado en inteligencia artificial, es importante señalar sus limitaciones. El método de síntesis mediante IA solo está disponible actualmente para determinados mapas de acoplamiento, lo que podría limitar su aplicabilidad general. Esta limitación debe tenerse en cuenta a la hora de evaluar su uso en diferentes situaciones.
Próximos pasos
Si este trabajo te ha parecido interesante, quizá te interese el siguiente material: