Mapeo (Mapping)
Mira el video sobre mapeo de Olivia Lanes, o ábrelo en una ventana separada en YouTube.
Introducción
En esta lección nos centraremos en el primer y a menudo más difícil paso para definir un programa cuántico: mapear un problema a un computador cuántico. Este paso describe cómo un usuario comienza con un problema computacional y lo traduce en algo que puede resolverse en un computador cuántico.
En las lecciones 2 y 3 de este curso, mencionamos que la fase de mapeo es el primero de cuatro pasos generales en el marco de Qiskit Patterns. De esas lecciones, quizás recuerdes que el objetivo del mapeo es traducir o reescribir un problema computacional en una función de costo o un valor esperado que podamos evaluar con un computador cuántico.
En la lección 3, discutimos un ejemplo concreto con Max-Cut, un problema computacionalmente difícil pero muy común en la optimización combinatoria. En ese ejemplo, pasamos por varios pasos para traducir el problema inicial del grafo en uno que pueda resolverse en un computador cuántico. Transformamos el problema de encontrar el número máximo de cortes en el grafo en una función de costo, reescribimos esa función de costo como un hamiltoniano y luego preparamos un estado cuántico de prueba cuyo estado fundamental corresponde al corte máximo. Finalmente, construimos un circuito cuántico que representa el estado de prueba de interés y luego añadimos las puertas específicas para permitir la evolución temporal del estado. Esta secuencia de pasos fue toda parte del mapeo. Mientras que los pasos exactos eran únicos para el problema Max-Cut, el mismo procedimiento general puede aplicarse a muchas otras aplicaciones, como la química cuántica y las simulaciones cuánticas.
El mapeo puede ser difícil. No hay una estrategia única para cada problema individual, por lo que puede ser intimidante. En esta lección, veremos algunas consideraciones generales para el mapeo y luego profundizaremos en algunos problemas de ejemplo representativos para demostrar las diferentes formas de mapear un problema a un computador cuántico.
Consideraciones generales
Mientras que la estrategia exacta que se utiliza para mapear un problema a un computador cuántico depende del problema en cuestión, en general cumplen con algunas cosas principales.
Primero, es posible que necesites simplificar el problema para hacerlo factible. Esto no es exclusivo de la computación cuántica -- todas las disciplinas científicas utilizan modelos simplificados para estudiar fenómenos que les interesan mientras ignoran detalles irrelevantes. En la física, hay una expresión famosa que lleva este principio al extremo: "Supongamos que la vaca es una esfera." A menudo es demasiado difícil describir un sistema exactamente como aparece, pero en su lugar podemos hacer simplificaciones razonables que aún pueden conducir a soluciones útiles. Algunos ejemplos de cómo podríamos hacer esto en la computación cuántica son limitar el tamaño o la profundidad del circuito eligiendo un ansatz eficiente en hardware, truncar evoluciones temporales complejas o despreciar términos del hamiltoniano que contribuyen poco a la energía final de un estado cuántico.
Segundo, el mapeo implica escribir el problema de una manera que un computador cuántico pueda entender. Esto a menudo implica hacerse estas tres preguntas:
- ¿Qué representarán nuestros qubits en nuestro modelo?
- ¿Es continuo nuestro problema? Dado que los computadores cuánticos son digitales, si el problema es continuo, necesitamos encontrar una forma de discretizarlo.
- Finalmente: ¿Coincide la topología del problema con la topología del hardware? Si no, es posible que necesitemos implementar algunos trucos para que funcione.
Abordemos la primera pregunta, que está en el centro de muchas dificultades al entender el mapeo: ¿Qué puede representar un qubit?
Los qubits pueden usarse para representar muchas cosas. Lo primero y quizás lo más simple es un nodo en un grafo. Los grafos se utilizan para mostrar la conectividad en muchos tipos diferentes de problemas matemáticos, y los nodos son un elemento fundamental que representa un punto o entidad en una red. Dependiendo de lo que represente la red completa, eso podría ser una ciudad, una persona o un ferromagneto en una red.
Los qubits también pueden usarse para representar bosones y fermiones, aunque debo advertir aquí que un solo qubit no corresponde exactamente a un bosón o un fermión -- es algo más complicado que eso, como discutiremos más adelante en la lección.
Ahora los ejemplos se vuelven un poco más complicados. Con estos modelos, ya no tiene sentido hablar de qubits individuales; en su lugar, necesitamos grupos de ellos para producir algo físico. Por ejemplo, un grupo de qubits, aquí representados en una topología Heavy-Hex, puede usarse para representar posiciones geométricas de aminoácidos; cadenas de polímeros. Otro ejemplo es la simulación de dispersión de hadrones en modelos de física de altas energías, que puede hacerse simulando la evolución temporal de un paquete de ondas hadrónico. En este caso, un registro de qubits puede usarse para codificar diferentes estados de un campo cuántico; el estado de vacío de ese campo o un paquete de ondas propagándose sobre ese vacío.
Pero a este punto hemos hablado de manera suficientemente abstracta sobre el desafío que tenemos por delante. Veamos estos ejemplos en detalle.
Ejemplos de mapeo
Max-Cut
Comencemos con nuestro primer ejemplo. Uno de los problemas de mapeo más simples es el que ya hemos tratado en profundidad: el ejemplo de Max-Cut. En ese problema, el mapeo fue relativamente fácil para nosotros, ya que un qubit correspondía a un nodo en nuestro grafo.
Recuerda: para mapear el problema de Max-Cut, expresamos la función de costo como un hamiltoniano usando la formulación QUBO. Una función de costo hamiltoniana es una función que codifica la solución óptima del problema en el estado fundamental del hamiltoniano. Para construir el hamiltoniano de costo, usamos la clase SparsePauliOp en Qiskit para especificar la conectividad de nuestro grafo, y la fase de mapeo a los operadores cuánticos estaba completa. Y el circuito cuántico era simplemente el ansatz QAOA. Como repaso, consulta la lección Utility-Scale QAOA, donde repasamos todo esto con mucho más detalle.
En esa lección, la conectividad del grafo en el ejemplo de 100 qubits a escala de utilidad ya coincidía con la topología de nuestro hardware superconductor. Así que no tuvimos que preocuparnos por cómo manejar diferentes topologías. Pero eso no siempre es el caso. Si tuviéramos un grafo más complicado o más densamente conectado que los ejemplos destacados hasta ahora, necesitaríamos implementar una serie de puertas SWAP para cambiar la conectividad efectiva del hardware. Esto se maneja en el segundo paso de Qiskit Patterns, la transpilación, pero debería tenerse en mente ya en el paso de mapeo.
Plegamiento de proteínas
A continuación, veamos un ejemplo que fue modelado en el artículo "Resource-efficient quantum algorithm for protein folding", escrito por IBM® y colaboradores de la University of New South Wales.
Un poco de contexto bioquímico: las proteínas son macromoléculas compuestas por largas cadenas de aminoácidos. Estas cadenas se pliegan en estructuras complejas que realizan una variedad de funciones biológicas. La determinación de la estructura proteica en el espacio tridimensional y la comprensión de las relaciones entre estructura y función están entre los problemas más desafiantes en la bioquímica actual. Las proteínas se pliegan en estructuras útiles debido a las interacciones entre aminoácidos. Cuando una estructura gira y se pliega, aminoácidos que están muy separados a lo largo de la cadena pueden quedar directamente uno al lado del otro e interactuar fuertemente.
Para modelar esto en un computador cuántico, necesitamos un hamiltoniano que describa todas estas interacciones entre aminoácidos. Luego podemos predecir la estructura final encontrando el estado que minimiza la energía de nuestro hamiltoniano. Aquí nos centraremos en cómo las cadenas de aminoácidos pueden modelarse en un computador cuántico y cómo podemos obtener distancias inter-aminoácidos para calcular las energías de interacción. Con eso tendremos todas las contribuciones necesarias al hamiltoniano para simularlo en un computador cuántico.
En las proteínas reales, los aminoácidos pueden ocupar un continuo de posiciones posibles. Sin embargo, usaremos una simplificación y los restringiremos con un modelo de red, donde cada aminoácido ocupa un punto en una red. Aquí, los autores usaron una red tetraédrica. Nota breve: aquí codificamos la dirección de las aristas, no los nodos mismos como en el problema Max-Cut. Cada qubit representa un posible camino de un solo paso a lo largo de la red tetraédrica. Observa que los sitios de red adyacentes se han etiquetado como A o B, debido a sus diferentes orientaciones en la red.
La cadena de proteínas se representa como una serie de giros o direcciones en esta red. Cada giro entre aminoácidos puede ir en una de cuatro direcciones, correspondientes a las aristas del tetraedro. Estos cuatro giros posibles se codifican con cuatro qubits en los estados 0001, 0010, 0100 o 1000.

Veamos un ejemplo en la figura de arriba. Coloquemos nuestro primer aminoácido en el punto etiquetado "B", que está circulado en rojo en nuestra red tetraédrica. La dirección del primer aminoácido al segundo es arbitraria, ya que el sistema siempre puede rotarse para que esta arista apunte en cualquier dirección. Así podemos colocar nuestro segundo aminoácido en el punto debajo del primero, etiquetado "A". No es fácil de ver, pero el camino del segundo al tercero también es arbitrario. Las tres opciones resultarían en tener dos aristas con un ángulo de aproximadamente 109,5 grados entre ellas. La selección de esta segunda arista simplemente determina la orientación de nuestra proteína en el espacio. Sin pérdida de generalidad, podemos elegir los dos primeros giros simplemente como 0001 y 0010.
Con estas simplificaciones, la configuración de la cadena de aminoácidos viene dada por esta expresión:
Hasta ahora hemos mapeado las aristas del tetraedro a qubits, y nuestro circuito cuántico será un ansatz. Ahora necesitamos considerar cómo codificamos la energía del problema en un hamiltoniano, de modo que su estado fundamental nos dé el patrón de plegamiento óptimo.
Para cada configuración dada, hay una energía asociada debido a las interacciones entre los aminoácidos. Estas interacciones son más fuertes cuando los dos aminoácidos están cerca uno del otro. Obviamente, los aminoácidos adyacentes en la columna vertebral de la cadena siempre interactuarán entre sí. Pero debido a que la proteína puede girar y plegarse, otros pares de aminoácidos también pueden interactuar. Los aminoácidos 10 y 20 podrían, por ejemplo, terminar en sitios adyacentes después de que la proteína se pliega. Así que necesitamos una fórmula para describir la distancia entre los aminoácidos y usando la información codificada en los qubits de configuración. De esta manera, podemos usar su distancia de separación para determinar cuán fuertemente interactúan.
Primero, introducimos una función que indica si una arista se usa para el giro en el aminoácido o no. Aquí puede tomar una de las cuatro direcciones posibles. Basándonos en la configuración con la que comenzamos arriba, podemos escribir estas funciones:
Luego podemos definir una diferencia en el número de giros marcados con en las redes A y B desde el índice hasta el índice como :