Gate Cutting para Reducir el Ancho del Circuit
En este notebook, seguiremos los pasos de un patrón de Qiskit usando circuit cutting para reducir el número de Qubits en un Circuit. Cortaremos Gates para poder reconstruir el valor esperado de un Circuit de cuatro Qubits usando solo experimentos de dos Qubits.
Estos son los pasos que seguiremos:
- Paso 1: Mapear el problema a circuits cuánticos y operadores:
- Mapear el hamiltoniano a un Circuit cuántico.
- Paso 2: Optimizar para el hardware objetivo [Usa el cutting addon]:
- Cortar el Circuit y el observable.
- Transpilar los subexperimentos para el hardware.
- Paso 3: Ejecutar en el hardware objetivo:
- Ejecutar los subexperimentos obtenidos en el Paso 2 usando una primitiva
Sampler.
- Ejecutar los subexperimentos obtenidos en el Paso 2 usando una primitiva
- Paso 4: Post-procesar los resultados [Usa el cutting addon]:
- Combinar los resultados del Paso 3 para reconstruir el valor esperado del observable en cuestión.
Paso 1: Mapear
Crear un Circuit para cortar
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-addon-cutting qiskit-aer qiskit-ibm-runtime
from qiskit.circuit.library import efficient_su2
qc = efficient_su2(4, entanglement="linear", reps=2)
qc.assign_parameters([0.4] * len(qc.parameters), inplace=True)
qc.draw("mpl", scale=0.8)

Especificar un observable
from qiskit.quantum_info import SparsePauliOp
observable = SparsePauliOp(["ZZII", "IZZI", "-IIZZ", "XIXI", "ZIZZ", "IXIX"])
Paso 2: Optimizar
Separar el Circuit y el observable según una partición de Qubits especificada
Cada etiqueta en partition_labels corresponde al Qubit del circuit en el mismo índice. Los Qubits que comparten una etiqueta de partición común se agruparán, y los Gates no locales que abarquen más de una partición serán cortados.
Nota: El argumento observables de partition_problem es de tipo PauliList. Los coeficientes y las fases de los términos del observable se ignoran durante la descomposición del problema y la ejecución de los subexperimentos. Pueden volver a aplicarse durante la reconstrucción del valor esperado.
from qiskit_addon_cutting import partition_problem
partitioned_problem = partition_problem(
circuit=qc, partition_labels="AABB", observables=observable.paulis
)
subcircuits = partitioned_problem.subcircuits
subobservables = partitioned_problem.subobservables
bases = partitioned_problem.bases
Visualizar el problema descompuesto
subobservables
{'A': PauliList(['II', 'ZI', 'ZZ', 'XI', 'ZZ', 'IX']),
'B': PauliList(['ZZ', 'IZ', 'II', 'XI', 'ZI', 'IX'])}
subcircuits["A"].draw("mpl", scale=0.8)