Saltar al contenido principal

Reducción de la profundidad de circuitos con retropropagación de operadores

La retropropagación de operadores es una técnica que consiste en absorber operaciones desde el final de un circuito cuántico hacia un operador de Pauli, reduciendo generalmente la profundidad del circuito a costa de términos adicionales en el operador. El objetivo es retropropagar la mayor parte posible del circuito sin permitir que el operador crezca demasiado.

Una forma de permitir una retropropagación más profunda en el circuito, evitando al mismo tiempo que el operador crezca demasiado, es truncar los términos con coeficientes pequeños en lugar de añadirlos al operador. Truncar términos puede resultar en menos circuitos cuánticos a ejecutar, pero hacerlo introduce cierto error en el cálculo final del valor esperado, proporcional a la magnitud de los coeficientes de los términos truncados. En este tutorial implementaremos un patrón de Qiskit para simular la dinámica cuántica de una cadena de espines de Heisenberg usando retropropagación de operadores:

  • Paso 1: Mapear al problema cuántico
    • Mapear el Hamiltoniano con evolución temporal a un circuito cuántico
  • Paso 2: Optimizar el problema
    • Dividir el circuito en slices
    • Retropropagar slices del circuito hacia un observable de Pauli
    • Combinar los slices restantes en un único circuito
    • Transpilar el circuito para el Backend
  • Paso 3: Ejecutar experimentos
    • Calcular el valor esperado usando el circuito reducido y el observable expandido con un StatevectorEstimator por simplicidad en este notebook
  • Paso 4: Reconstruir resultados
    • N.A.

Nota: Qiskit describe informalmente las capas como particiones de profundidad 1 del circuito sobre todos los qubits. Este paquete usa el término slices para describir capas de profundidad arbitraria. La función qiskit_addon_obp.backpropagate está diseñada para retropropagar slices completos a la vez, por lo que la elección de cómo dividir el circuito cuántico puede tener un impacto importante en el rendimiento de la retropropagación para un problema dado. Aprenderás más sobre los slices a continuación.

Paso 1: Mapear al problema cuántico

Mapear la evolución temporal de un modelo cuántico de Heisenberg a un experimento cuántico.

El paquete qiskit_addon_utils proporciona algunas funcionalidades reutilizables para diversos propósitos.

Su módulo qiskit_addon_utils.problem_generators ofrece funciones para generar Hamiltonianos tipo Heisenberg sobre un grafo de conectividad dado. Este grafo puede ser un rustworkx.PyGraph o un CouplingMap, lo que facilita su uso en flujos de trabajo centrados en Qiskit.

A continuación, primero generamos un CouplingMap heavy-hex del que extraemos una cadena lineal de 10 qubits. Ten en cuenta que los índices de este nuevo reduced_coupling_map vuelven a comenzar desde cero.

# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-addon-obp qiskit-addon-utils qiskit-ibm-runtime rustworkx
from qiskit.transpiler import CouplingMap

coupling_map = CouplingMap.from_heavy_hex(3, bidirectional=False)

# Choose a 10-qubit linear chain on this coupling map
reduced_coupling_map = coupling_map.reduce([0, 13, 1, 14, 10, 16, 5, 12, 8, 18])
from rustworkx.visualization import graphviz_draw

graphviz_draw(reduced_coupling_map.graph, method="circo")

Code output

A continuación, generamos un operador de Pauli que modela un Hamiltoniano de Heisenberg XYZ.

undefined