Circuitos parametrizados con primitivas¶
Los circuitos parametrizados son una herramienta de uso común para el diseño de algoritmos cuánticos. Debido a que backend.run() no aceptaba circuitos parametrizados, el paso de vinculación de parámetros tenía que integrarse en el flujo de trabajo del algoritmo. Las primitivas pueden realizar el paso de vinculación de parámetros internamente, lo que resulta en una simplificación de la lógica del lado del algoritmo.
El siguiente ejemplo resume el nuevo flujo de trabajo para la gestión de circuitos parametrizados.
Ejemplo¶
Definamos un circuito parametrizado:
from qiskit.circuit import QuantumCircuit, ParameterVector
n = 3
thetas = ParameterVector('θ',n)
qc = QuantumCircuit(n, 1)
qc.h(0)
for i in range(n-1):
qc.cx(i, i+1)
for i,t in enumerate(thetas):
qc.rz(t, i)
for i in reversed(range(n-1)):
qc.cx(i, i+1)
qc.h(0)
qc.measure(0, 0)
qc.draw()
Queremos asignar los siguientes valores de parámetros al circuito:
import numpy as np
theta_values = [np.pi/2, np.pi/2, np.pi/2]
Previamente¶
Anteriormente, los valores de los parámetros tenían que vincularse a sus respectivos parámetros de circuito antes de llamar a backend.run().
from qiskit import Aer
bound_circuit = qc.bind_parameters(theta_values)
bound_circuit.draw()
backend = Aer.get_backend('aer_simulator')
job = backend.run(bound_circuit)
counts = job.result().get_counts()
print(counts)
Primitivas¶
Ahora, las primitivas toman los circuitos parametrizados directamente, junto con los valores de los parámetros, y la operación de asignación de parámetros se puede realizar de manera más eficiente en el lado del servidor de la primitiva.
Esta característica es particularmente interesante cuando se trabaja con algoritmos iterativos porque el circuito parametrizado permanece sin cambios entre llamadas mientras cambian los valores de los parámetros. Las primitivas pueden transpilar una vez y luego almacenar en caché el circuito no vinculado, utilizando los recursos clásicos de manera más eficiente. Además, solo los parámetros actualizados se transfieren a la nube, lo que ahorra ancho de banda adicional.
from qiskit.primitives import Sampler
sampler = Sampler()
job = sampler.run(qc, theta_values)
result = job.result().quasi_dists
print(result)