Docs
Ir a plataforma

Productos Compositor

Funcionamiento del Compositor: arquitectura, compilación y análisis de circuitos cuánticos

El Compositor es el entorno integrado de diseño, compilación y ejecución de circuitos cuánticos dentro del ecosistema PlanQ. A diferencia de un editor gráfico convencional, constituye un sistema de ingeniería de experimentos cuánticos que abarca desde la especificación abstracta del circuito —definida sobre un espacio de Hilbert \(\mathcal{H} = (\mathbb{C}^2)^{\otimes n}\)— hasta la obtención, almacenamiento y análisis estadístico de las muestras de medición devueltas por un backend simulado o físico.

Esta guía describe el Compositor como un sistema técnico: qué entidades modela, cómo convierte una descripción de alto nivel en un job ejecutable, y cómo interpretar los resultados que devuelve un backend. El objetivo no es documentar la interfaz como secuencia de clics, sino articular el porqué formal de cada componente para que el experimentador pueda diseñar, reproducir y auditar circuitos con rigor científico.

El flujo completo implementa una tubería determinista: modelado del circuito (registros, puertas, mediciones y metadatos), compilación a un conjunto nativo de instrucciones, ejecución gestionada por un runtime con trazabilidad de jobs, y análisis que transforma distribuciones de bitstrings en métricas cuantitativas. Cada etapa introduce restricciones y transformaciones cuya comprensión es indispensable para interpretar correctamente los resultados.

Anatomía del Compositor

El Compositor organiza su interfaz en paneles especializados que reflejan las etapas de la tubería de ejecución. El siguiente esquema identifica cada región funcional y su correspondencia con las entidades descritas a lo largo de este artículo.

Barra de menú Archivo  ·  Editar  ·  Ver  ·  Ayuda
Navegación Compositor Backend APIKeys Compatibilidad Tutoriales
Lienzo del circuito
q₀HM
q₁M
q₂XM
q₃RZM
Biblioteca de operaciones
RXRYRZ HXY ZST CXCZ SW
Panel de código
1 creg q[4]; 2 h q[0]; 3 cx q[0], q[1]; 4 x q[2]; 5 rz(π/4) q[3]; 6 measure q → c;
Resultados
00
01
10
11
Figura 1. Esquema funcional del Compositor: navegación lateral, lienzo del circuito con líneas de cúbits y puertas, biblioteca de operaciones, panel de código serializado, visualizaciones de resultados (esfera de Bloch e histograma) y chat contextual.

Arquitectura lógica

El Compositor implementa una tubería (pipeline) con cuatro responsabilidades claramente delimitadas. La separación en etapas no es un detalle de implementación sino una decisión de diseño con implicaciones directas sobre la reproducibilidad experimental: cada capa produce un artefacto inmutable que sirve de entrada a la siguiente, permitiendo auditar retrospectivamente cualquier punto de la cadena.

Modelo de circuito

La primera capa mantiene una representación interna del circuito como un grafo acíclico dirigido (DAG) en el que los nodos representan operaciones unitarias o mediciones y las aristas codifican dependencias temporales sobre registros compartidos. Formalmente, un circuito sobre \(n\) cúbits es una secuencia ordenada de operaciones \(\{U_1, U_2, \ldots, U_d\}\) donde cada \(U_k \in \mathrm{U}(2^n)\) actúa sobre un subconjunto de los \(n\) cúbits. La profundidad \(d\) del circuito —número de capas temporales con operaciones paralelizables— es una métrica crítica porque determina la exposición acumulada a decoherencia.

El DAG admite optimizaciones topológicas: dos operaciones que actúan sobre cúbits disjuntos pueden reordenarse sin alterar la unitaria global \(U = U_d \cdots U_2 U_1\), lo que permite al compilador reducir la profundidad efectiva mediante planificación (scheduling) sin modificar la semántica del experimento.

Compilación y transpilación

La segunda capa transforma el circuito abstracto en un circuito nativo compatible con el backend seleccionado. Este proceso involucra descomposición de puertas, enrutamiento de cúbits (qubit routing) y, opcionalmente, optimizaciones de cancelación de puertas adyacentes. La sección dedicada a compilación desarrolla estos aspectos en profundidad.

Runtime de ejecución

La tercera capa empaqueta el circuito compilado junto con los parámetros experimentales (número de shots, semilla pseudoaleatoria, modelo de ruido) en un job serializado, lo envía al backend y gestiona el ciclo de vida del trabajo (en cola → ejecutando → completado/fallido). El artefacto de entrada se preserva íntegramente para garantizar la trazabilidad: dado un identificador de job, siempre es posible reconstruir el circuito exacto que se ejecutó.

Capa de análisis

La cuarta capa recibe las muestras de medición \(\{x_1, x_2, \ldots, x_{N_{\text{shots}}}\}\) con \(x_i \in \{0,1\}^n\) y las transforma en distribuciones de probabilidad empíricas, histogramas, métricas derivadas y, cuando el backend lo permite, representaciones del vector de estado o la matriz de densidad. La distinción entre resultados muestrales y estados idealizados es fundamental para evitar sobreinterpretaciones en presencia de ruido.

Entidades del sistema

El Compositor organiza la información del experimento en entidades semánticamente diferenciadas. Cada entidad corresponde a un panel de la interfaz, pero su significado trasciende la disposición visual: define un dominio formal con invariantes propios. A continuación se describe cada una con el formalismo necesario para interpretar su comportamiento y sus limitaciones.

Registros cuánticos y clásicos

Un registro cuántico \(\mathbf{q} = (q_0, q_1, \ldots, q_{n-1})\) indexa los \(n\) grados de libertad cuánticos del sistema. Cada \(q_i\) se inicializa en \(|0\rangle\) por convención; el estado global del registro es el producto tensorial \(|0\rangle^{\otimes n}\). Las puertas del circuito actúan exclusivamente sobre este registro.

Un registro clásico \(\mathbf{c} = (c_0, c_1, \ldots, c_{m-1})\) almacena los resultados de las mediciones proyectivas. La separación explícita entre \(\mathbf{q}\) y \(\mathbf{c}\) refleja la distinción fundamental entre información cuántica (coherente, no clonable, sujeta a superposición) e información clásica (copiable, persistente, determinista una vez registrada). Confundir ambos registros conduce a errores conceptuales graves: no es posible aplicar una puerta sobre un bit clásico ni retroalimentar un resultado de medición al registro cuántico sin operaciones condicionales explícitas.

El número de bits clásicos \(m\) puede diferir de \(n\): no todos los cúbits requieren medición, y ciertos protocolos (p. ej., teleportación) miden solo un subconjunto del registro cuántico.

Lienzo del circuito

El lienzo (canvas) es la representación visual del DAG del circuito. Cada línea horizontal corresponde a un cúbit; el eje horizontal codifica el tiempo lógico (de izquierda a derecha). Las puertas se disponen en columnas temporales (moments) que agrupan operaciones paralelizables, es decir, operaciones que actúan sobre conjuntos disjuntos de cúbits y pueden ejecutarse simultáneamente sin violar causalidad.

Las puertas controladas se representan mediante líneas verticales que conectan el cúbit de control con el cúbit objetivo. La notación visual sigue las convenciones estándar de la literatura: un punto sólido (●) indica control, un símbolo ⊕ indica el objetivo de una CNOT, y las cajas etiquetadas representan rotaciones parametrizadas o puertas compuestas.

El lienzo no es meramente decorativo: su estructura determina la profundidad del circuito, parámetro que el compilador intentará minimizar durante la transpilación. Toda reorganización manual de puertas en el lienzo modifica potencialmente la profundidad y, por tanto, la fidelidad esperada del experimento en backends ruidosos.

Biblioteca de operaciones

La biblioteca expone el conjunto universal de puertas disponibles, organizadas por categoría: puertas de un cúbit (rotaciones de Pauli \(R_X(\theta)\), \(R_Y(\theta)\), \(R_Z(\theta)\); Hadamard \(H\); fase \(S\), \(T\)), puertas de dos cúbits (CNOT, CZ, SWAP) y operaciones especiales (medición, barreras, reset).

Cada operación tiene una firma que especifica su aridad (número de cúbits sobre los que actúa), parámetros continuos (ángulos de rotación) y, en su caso, cúbits de control. La inserción de una puerta en el lienzo modifica el DAG del circuito: se crea un nuevo nodo con aristas hacia los registros afectados, respetando el orden temporal.

La universalidad del conjunto de puertas garantiza que cualquier operación unitaria \(U \in \mathrm{U}(2^n)\) puede aproximarse con precisión arbitraria mediante una secuencia finita de puertas de la biblioteca, resultado formalizado por el teorema de Solovay–Kitaev. En la práctica, el compilador se encarga de esta descomposición cuando el usuario emplea puertas que no pertenecen al conjunto nativo del backend.

\[ U = e^{i\alpha} R_Z(\beta)\, R_Y(\gamma)\, R_Z(\delta), \qquad R_K(\theta) = e^{-i\theta K/2},\quad K \in \{X, Y, Z\}. \]

La descomposición ZYZ anterior muestra que cualquier puerta de un cúbit puede expresarse con tres rotaciones y una fase global (irrelevante para la medición). Para puertas de dos cúbits, la descomposición KAK generaliza este resultado al grupo \(\mathrm{SU}(4)\).

Panel de código

El panel de código presenta la representación serializada del circuito en el formato del SDK activo (HarmoniQ para Swift, Kotlin, React/TypeScript o Python). Esta serialización no es una vista auxiliar sino el artefacto de referencia del experimento: contiene la secuencia exacta de instrucciones, los parámetros numéricos de cada puerta y la configuración del backend.

La trazabilidad científica exige que el experimento pueda reconstruirse íntegramente a partir de esta descripción. Por ello, el Compositor mantiene sincronización bidireccional: toda modificación en el lienzo se refleja en el código, y toda edición del código actualiza el lienzo. El hash del artefacto serializado se incluye en los metadatos del job para verificar integridad.

Panel de resultados y visualización

Tras la ejecución, el panel de resultados presenta la distribución empírica de bitstrings. Para \(N_{\text{shots}}\) muestras y un espacio de \(2^n\) estados posibles, la probabilidad estimada de cada estado \(x\) es el estimador de frecuencia relativa:

\[ \hat{p}(x) = \frac{N(x)}{N_{\text{shots}}}, \qquad \sigma[\hat{p}(x)] = \sqrt{\frac{\hat{p}(x)(1 - \hat{p}(x))}{N_{\text{shots}}}}. \]

El histograma muestra \(\hat{p}(x)\) para cada bitstring observado. La barra de error asociada (desviación estándar binomial) decrece como \(\mathcal{O}(1/\sqrt{N_{\text{shots}}})\), lo que justifica la práctica de incrementar shots para mejorar la resolución estadística.

Para sistemas de un solo cúbit, el Compositor ofrece adicionalmente la representación en la esfera de Bloch. En simulación ideal, el vector de estado \(|\psi\rangle\) se proyecta directamente sobre la esfera; en backends ruidosos, la representación corresponde al estado ideal teórico y debe interpretarse con las reservas correspondientes.

El panel también muestra la tabla de conteos con los valores absolutos \(N(x)\), el estado más frecuente (most frequent bitstring), y métricas derivadas como la entropía de Shannon de la distribución empírica:

\[ H(\hat{p}) = -\sum_{x} \hat{p}(x) \log_2 \hat{p}(x). \]

Un circuito que produce un estado de producto (sin entrelazamiento) sobre \(n\) cúbits tendrá \(H \le n\) bits; un estado entrelazado máximamente (como una superposición uniforme de \(2^n\) estados) alcanza \(H = n\). La comparación entre la entropía observada y la teórica es un diagnóstico rápido de la calidad del experimento.

Selector de backend

El Compositor permite seleccionar el backend de ejecución entre los simuladores disponibles (Hopper, Hermann) y, en el futuro, dispositivos físicos. Cada backend define su propio conjunto nativo de puertas, topología de conectividad entre cúbits y modelo de ruido. La elección del backend no es neutral: un mismo circuito abstracto puede producir resultados cualitativamente distintos según el nivel de fidelidad del simulador seleccionado.

Hopper implementa un modelo de ruido depolarizante con fidelidades de puerta de \(F_{1Q} = 0.998\) y \(F_{2Q} = 0.985\); Hermann ofrece \(F_{2Q} = 0.979\) con un modelo de ruido más realista que incluye errores de lectura (readout errors). El experimentador debe reportar siempre el backend utilizado como parte de los metadatos del resultado.

Compilación: de puertas lógicas a instrucciones ejecutables

La compilación traduce un circuito abstracto a un conjunto nativo de instrucciones, respetando las restricciones impuestas por el backend: conjunto de puertas nativas, topología de conectividad entre cúbits y parámetros de calibración. Este proceso es análogo a la compilación de código fuente a código máquina en computación clásica, pero con una diferencia crítica: cada transformación del circuito modifica la profundidad y, por tanto, la exposición a decoherencia.

Descomposición de puertas

Cuando el circuito contiene puertas que no pertenecen al conjunto nativo del backend, el compilador aplica identidades de descomposición. Para puertas de un cúbit, la descomposición ZYZ garantiza que cualquier \(U \in \mathrm{SU}(2)\) puede expresarse con tres rotaciones. Para puertas de dos cúbits, la descomposición KAK expresa cualquier \(U \in \mathrm{SU}(4)\) como producto de rotaciones locales y a lo sumo tres puertas CNOT:

\[ U = (A_1 \otimes A_2) \cdot \exp\!\left(-i\sum_{k=1}^{3} \theta_k \sigma_k \otimes \sigma_k\right) \cdot (B_1 \otimes B_2), \]

donde \(A_j, B_j \in \mathrm{SU}(2)\) son rotaciones locales y \(\sigma_k\) son las matrices de Pauli. El número de CNOTs requerido depende de los valores de \(\theta_k\): si alguno es nulo, la descomposición puede reducirse a dos o incluso una CNOT.

Enrutamiento de cúbits

Si el backend impone una topología de conectividad limitada (no todos los pares de cúbits pueden interactuar directamente), el compilador debe insertar puertas SWAP para mover la información cuántica entre cúbits adyacentes. Cada SWAP equivale a tres CNOTs, incrementando la profundidad en tres capas adicionales por cada reubicación.

El problema de enrutamiento óptimo es NP-difícil en general; el compilador emplea heurísticas (algoritmos voraces, simulated annealing) que buscan un compromiso entre profundidad adicional y número total de puertas de dos cúbits. El Compositor reporta la profundidad del circuito compilado junto a la del circuito abstracto, permitiendo al experimentador evaluar el overhead de transpilación.

Optimización de circuito

Tras la descomposición y el enrutamiento, el compilador aplica pasadas de optimización: cancelación de puertas adyacentes inversas (\(H \cdot H = I\), \(X \cdot X = I\)), fusión de rotaciones consecutivas sobre el mismo eje (\(R_Z(\alpha) \cdot R_Z(\beta) = R_Z(\alpha + \beta)\)), y eliminación de identidades. Estas optimizaciones preservan la unitaria global pero reducen la profundidad y el número total de puertas, mejorando la fidelidad esperada.

Ejecución: jobs, shots y estados del runtime

La ejecución transforma un circuito compilado en datos experimentales. El Compositor empaqueta el circuito junto con los parámetros experimentales en un job: un objeto inmutable que contiene toda la información necesaria para reproducir la ejecución.

Número de shots y estadística de muestreo

El parámetro \(N_{\text{shots}}\) determina cuántas veces se prepara, evoluciona y mide el sistema cuántico. Cada shot produce un bitstring \(x_i \in \{0,1\}^n\) muestreado de la distribución de probabilidad \(p(x) = |\langle x | U | 0 \rangle^{\otimes n}|^2\). La incertidumbre estadística del estimador de frecuencia relativa decrece como:

\[ \Delta \hat{p}(x) \sim \frac{1}{\sqrt{N_{\text{shots}}}}. \]

Para un circuito con \(k\) estados equiprobables, distinguir entre distribuciones con resolución \(\epsilon\) requiere \(N_{\text{shots}} \gtrsim k / \epsilon^2\). En la práctica, \(1024\) shots ofrecen una resolución de aproximadamente 3 % para distribuciones sobre 4 estados; \(8192\) shots reducen la incertidumbre a menos de 1 %.

Es fundamental distinguir la incertidumbre estadística (reducible con más shots) del error sistemático (introducido por ruido de puerta, errores de lectura y decoherencia, no reducible con más shots). El Compositor muestra ambas fuentes de error cuando el backend las modela.

Ciclo de vida del job

El runtime gestiona el job a través de una máquina de estados con las transiciones:

Creado → En cola → Ejecutando → Completado (flujo nominal), con una transición alternativa a Fallido si el backend rechaza el circuito (profundidad excesiva, cúbits no disponibles) o si ocurre un error de comunicación. Cada transición se registra con marca temporal, lo que permite calcular latencias y diagnosticar cuellos de botella.

El artefacto de entrada (circuito compilado + parámetros) se almacena junto con el resultado, garantizando que cualquier job completado pueda auditarse sin dependencia del estado actual del Compositor. Esta propiedad es esencial para la reproducibilidad: dos ejecuciones del mismo artefacto deben producir distribuciones estadísticamente compatibles (dentro de las barras de error) si el backend no ha cambiado su calibración.

Análisis: de bitstrings a métricas cuantitativas

La capa de análisis del Compositor transforma las cuentas brutas \(\{N(x)\}\) en información interpretable. El proceso sigue una jerarquía de abstracción creciente: distribución empírica, métricas de primer orden, comparación con distribuciones teóricas y, cuando el backend lo permite, reconstrucción del estado cuántico.

Distribución empírica y métricas de primer orden

El estimador primario es la frecuencia relativa \(\hat{p}(x) = N(x) / N_{\text{shots}}\). A partir de ella se derivan: el estado más frecuente (mode), la entropía de Shannon \(H(\hat{p})\), y las probabilidades marginales de cada cúbit individual:

\[ \hat{p}_k(1) = \sum_{x:\, x_k = 1} \hat{p}(x), \qquad k = 0, 1, \ldots, n-1. \]

Las marginales son útiles para detectar asimetrías: si un cúbit debería estar en superposición uniforme pero \(\hat{p}_k(1)\) se desvía significativamente de \(0.5\), esto indica error de puerta, error de lectura o un defecto en el diseño del circuito.

Comparación con distribuciones teóricas

Cuando se dispone de la distribución teórica \(p_{\text{ideal}}(x)\) (calculada por simulación exacta del circuito), el Compositor puede calcular la distancia de variación total (TVD) y la fidelidad clásica entre la distribución observada y la ideal:

\[ \mathrm{TVD} = \frac{1}{2}\sum_x |\hat{p}(x) - p_{\text{ideal}}(x)|, \qquad F_{\text{cl}} = \left(\sum_x \sqrt{\hat{p}(x)\, p_{\text{ideal}}(x)}\right)^{\!2}. \]

Una TVD cercana a cero indica alta concordancia entre experimento y teoría; \(F_{\text{cl}}\) cercana a 1 indica fidelidad alta. Estas métricas permiten cuantificar objetivamente la calidad del experimento y comparar el desempeño de distintos backends sobre el mismo circuito.

Observables y valores esperados

Para algoritmos variacionales y aplicaciones en química cuántica, el resultado de interés no es una distribución de bitstrings sino el valor esperado de un observable \(\hat{O}\). Si \(\hat{O}\) es diagonal en la base computacional, su estimación es directa:

\[ \langle \hat{O} \rangle \approx \sum_x O(x)\, \hat{p}(x), \qquad \sigma[\langle \hat{O} \rangle] = \sqrt{\frac{\mathrm{Var}[\hat{O}]}{N_{\text{shots}}}}. \]

Para observables no diagonales (p. ej., operadores de Pauli \(\sigma_X\), \(\sigma_Y\)), es necesario rotar la base de medición antes del paso de medición. El Compositor facilita esta operación permitiendo especificar la base de medición por cúbit, insertando automáticamente las rotaciones de cambio de base necesarias antes de las mediciones en base \(Z\).

Referencias y lecturas recomendadas

La selección siguiente orienta al lector hacia monografías y recursos cuya rigurosidad ha sido contrastada por la comunidad científica.

Bibliografía citada

  1. [1]
    Nielsen, M. A., & Chuang, I. L. (2010). Quantum Computation and Quantum Information. Cambridge University Press. Cap. 4 (Circuitos cuánticos).
  2. [2]
    Dawson, C. M., & Nielsen, M. A. (2006). The Solovay-Kitaev algorithm. Quantum Information & Computation, 6(1), 81–95.
  3. [3]
    Cross, A. W., Bishop, L. S., Smolin, J. A., & Gambetta, J. M. (2017). Open Quantum Assembly Language. arXiv:1707.03429.
  4. [4]
    Zulehner, A., Paler, A., & Wille, R. (2019). An efficient methodology for mapping quantum circuits to the IBM QX architectures. IEEE Transactions on Computer-Aided Design of Integrated Circuits and Systems, 38(7), 1226–1236.
  5. [5]
    Vatan, F., & Williams, C. (2004). Optimal quantum circuits for general two-qubit gates. Physical Review A, 69(3), 032315.

Descargar artículo

Título
Funcionamiento del Compositor: arquitectura, compilación y análisis de circuitos cuánticos
Fecha de elaboración
Creador
Noguerón Méndez José Antonio
Noguerón Méndez José Antonio Head of Quantum Product
Diseñador
RM
Raúl Meza Head of Design
Descargar artículo