Codificación de correlación de Pauli para reducir los requisitos de max-cut
Estimación de uso: 35 minutos en un procesador Eagle r3 (NOTA: Esto es solo una estimación. Tu tiempo de ejecución puede variar.)
Resultados del aprendizaje
Al completar este tutorial, los usuarios deberían obtener los siguientes resultados:
- Comprender los principios teóricos detrás de la Codificación de Correlación de Pauli (PCE), incluyendo cómo las cadenas de Pauli de múltiples cuerpos permiten la compresión polinomial de problemas de optimización clásicos.
- Implementar PCE en la práctica para codificar y resolver tareas de optimización a gran escala en hardware cuántico de corto plazo.
Requisitos previos
Recomendamos familiaridad con los siguientes temas antes de abordar este tutorial:
Contexto
Este tutorial presenta la Codificación de Correlación de Pauli (PCE, por sus siglas en inglés) [1], un enfoque diseñado para codificar problemas de optimización en qubits con mayor eficiencia para la computación cuántica. La PCE mapea variables clásicas en problemas de optimización a correlaciones de matrices de Pauli de múltiples cuerpos, lo que resulta en una compresión polinomial de los requisitos de espacio del problema. Al emplear PCE, se reduce el número de qubits necesarios para la codificación, lo que la hace particularmente ventajosa para dispositivos cuánticos de corto plazo con recursos de qubits limitados. Además, se demuestra analíticamente que la PCE mitiga inherentemente las mesetas estériles, ofreciendo una resiliencia superpolinomial contra este fenómeno. Esta característica incorporada permite un rendimiento sin precedentes en solucionadores de optimización cuántica.
Descripción general
El enfoque PCE consta de tres pasos principales, como se ilustra en la Figura 1 de [1] a continuación:
- Codificación del problema de optimización en un espacio de correlación de Pauli.
- Resolución del problema utilizando un solucionador de optimización cuántico-clásico.
- Decodificación de la solución de vuelta al espacio de optimización original.
El enfoque PCE es adaptable a cualquier solucionador de optimización cuántica capaz de procesar matrices de correlación de Pauli.
En la Figura 1 de [1], se utiliza el problema max-cut como ejemplo para ilustrar el enfoque PCE. El problema max-cut con nodos se codifica en un espacio de correlación de Pauli, representando el problema de optimización como una matriz de correlación — específicamente, correlaciones de matrices de Pauli de dos cuerpos a través de qubits . Los colores de los nodos indican la cadena de Pauli utilizada para cada nodo codificado.
Por ejemplo, el nodo 1, que corresponde a la variable binaria , se codifica mediante el valor esperado de , mientras que se codifica mediante .
Esto corresponde a comprimir las variables del problema en qubits. De manera más general, las correlaciones de cuerpos permiten compresiones polinomiales de orden , con . El conjunto de Pauli elegido comprende tres subconjuntos de cadenas de Pauli mutuamente conmutativas, lo que permite estimar experimentalmente todas las correlaciones con solo tres configuraciones de medición.
Se construye una función de pérdida de valores esperados de Pauli que imita la función objetivo original de max-cut. La función de pérdida se optimiza luego utilizando un solucionador de optimización cuántico-clásico, como el Eigensolver Cuántico Variacional (VQE).
Una vez completada la optimización, la solución se decodifica de vuelta al espacio de optimización original, proporcionando la solución óptima de max-cut.
Requisitos
Antes de comenzar este tutorial, asegúrese de tener instalado lo siguiente:
- Qiskit SDK v1.0 o posterior, con soporte de visualización
- Qiskit Runtime v0.22 o posterior (
pip install qiskit-ibm-runtime)
Configuración
# Added by doQumentation — required packages for this notebook
!pip install -q networkx numpy qiskit qiskit-aer qiskit-ibm-runtime rustworkx scipy
from itertools import combinations
import numpy as np
import rustworkx as rx
import networkx as nx
from scipy.optimize import minimize, OptimizeResult
from qiskit.circuit.library import efficient_su2
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
from qiskit.quantum_info import SparsePauliOp
from qiskit_ibm_runtime import EstimatorV2 as Estimator
from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit_ibm_runtime import Session
from rustworkx.visualization import mpl_draw
from qiskit_aer import AerSimulator
def calc_cut_size(graph, partition0, partition1):
"""Calculate the cut size of the given partitions of the graph."""
cut_size = 0
for edge0, edge1 in graph.edge_list():
if edge0 in partition0 and edge1 in partition1:
cut_size += 1
elif edge0 in partition1 and edge1 in partition0:
cut_size += 1
return cut_size
Ejemplo a pequeña escala con simulador
service = QiskitRuntimeService()
real_backend = service.least_busy(
operational=True, simulator=False, min_num_qubits=156
)
backend = AerSimulator.from_backend(real_backend)
print(f"We are using the {backend.name}")
We are using the aer_simulator_from(ibm_pittsburgh)
Paso 1: Mapear entradas clásicas a un problema cuántico
El problema max-cut
El problema max-cut es un problema de optimización combinatoria que se define sobre un grafo , donde es el conjunto de vértices y es el conjunto de aristas. El objetivo es particionar los vértices en dos conjuntos, y , de tal manera que se maximice el número de aristas entre los dos conjuntos. Para una descripción detallada del problema max-cut, consulta el tutorial Quantum approximate optimization algorithm. El problema max-cut también se utiliza como ejemplo en el tutorial Advanced techniques for QAOA. En esos tutoriales, se utiliza el algoritmo QAOA para resolver el problema max-cut.
Grafo -> Hamiltoniano
Consideremos primero un grafo aleatorio con 100 nodos.
num_nodes = 100 # Number of nodes in graph
seed = 42
graph = rx.undirected_gnp_random_graph(num_nodes, 0.1, seed=seed)
mpl_draw(graph)

nx_graph = nx.Graph()
nx_graph.add_nodes_from(range(num_nodes))
for edge in graph.edge_list():
nx_graph.add_edge(edge[0], edge[1])
curr_cut_size, partition = nx.approximation.one_exchange(nx_graph, seed=1)
print(f"Initial cut size: {curr_cut_size}")
Initial cut size: 345
Codificamos el grafo con 100 nodos en correlaciones de matrices de Pauli de dos cuerpos a través de nueve qubits (ver la explicación más abajo). El grafo se representa como una matriz de correlación, donde cada nodo se codifica mediante una cadena de Pauli. El signo del valor esperado de la cadena de Pauli indica la partición del nodo. Por ejemplo, el nodo 0 se codifica mediante una cadena de Pauli, . El signo del valor esperado de esta cadena de Pauli indica la partición del nodo 0. Definimos una Codificación de Correlación de Pauli (PCE) relativa a como
donde es la partición del nodo y es el valor esperado de la cadena de Pauli que codifica el nodo sobre un estado cuántico