Trabajar con Hello Pulse - Amazon Braket

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Trabajar con Hello Pulse

En esta sección, aprenderá a caracterizar y construir una única puerta de qubit directamente mediante pulso en un dispositivo Rigetti. Al aplicar un campo electromagnético a un qubit, se produce una oscilación de Rabi, que cambia los qubits entre su estado 0 y 1. Con la longitud y la fase del pulso calibradas, la oscilación de Rabi puede calcular las puertas de un solo qubit. Aquí, determinaremos la longitud de pulso óptima para medir un pulso de pi/2, un bloque elemental que se utiliza para construir secuencias de pulsos más complejas.

En primer lugar, para crear una secuencia de pulsos, importe la clase PulseSequence.

from braket.aws import AwsDevice from braket.circuits import FreeParameter from braket.devices import Devices from braket.pulse import PulseSequence, GaussianWaveform import numpy as np

A continuación, cree una instancia de un nuevo dispositivo Braket utilizando el Amazon Resource Name (ARN) de la QPU. El siguiente bloque de comandos usa Rigetti Ankaa-3.

device = AwsDevice(Devices.Rigetti.Ankaa3)

La siguiente secuencia de pulsos incluye dos componentes: reproducir una forma de onda y medir un qubit. La secuencia de pulsos normalmente se puede aplicar a marcos. Con algunas excepciones, como la barrera y el retardo, que se pueden aplicar a los qubits. Antes de construir la secuencia de pulsos, debe recuperar los marcos disponibles. El marco de accionamiento se utiliza para aplicar el pulso para la oscilación de Rabi y el marco de lectura sirve para medir el estado del qubit. En este ejemplo, se utilizan los marcos del qubit 25.

drive_frame = device.frames["Transmon_25_charge_tx"] readout_frame = device.frames["Transmon_25_readout_rx"]

Ahora, cree la forma de onda que se reproducirá en el marco de accionamiento. El objetivo es caracterizar el comportamiento de los qubits para diferentes longitudes de pulso. Reproducirá una forma de onda con diferentes longitudes cada vez. En lugar de crear una nueva forma de onda cada vez, utilice el FreeParameter compatible con Braket en la secuencia de pulsos. Puede crear la forma de onda y la secuencia de pulsos una vez con parámetros libres y, a continuación, ejecutar la misma secuencia de pulsos con valores de entrada diferentes.

waveform = GaussianWaveform(FreeParameter("length"), FreeParameter("length") * 0.25, 0.2, False)

Por último, póngalos juntos como una secuencia de pulsos. En la secuencia de pulsos, play reproduce la forma de onda especificada en el marco de accionamiento y, a continuación, capture_v0 mide el estado desde el marco de lectura.

pulse_sequence = ( PulseSequence() .play(drive_frame, waveform) .capture_v0(readout_frame) )

Escanee un intervalo de longitud de pulso y envíelo a la QPU. Antes de ejecutar las secuencias de pulsos en una QPU, vincule el valor de los parámetros libres.

start_length = 12e-9 end_length = 2e-7 lengths = np.arange(start_length, end_length, 12e-9) N_shots = 100 tasks = [ device.run(pulse_sequence(length=length), shots=N_shots) for length in lengths ] probability_of_zero = [ task.result().measurement_counts['0']/N_shots for task in tasks ]

Las estadísticas de la medición de qubits muestran la dinámica oscilatoria del qubit que oscila entre el estado 0 y el estado 1. A partir de los datos de medición, puede extraer la frecuencia de Rabi y refinar la longitud del pulso para implementar una puerta de 1 qubit concreta. Por ejemplo, a partir de los datos de la figura siguiente, la periodicidad es de aproximadamente 154 ns. Por lo tanto, una puerta de rotación pi/2 correspondería a la secuencia de pulsos con una longitud = 38,5 ns.

Gráfico lineal que muestra la cantidad de población en función de la duración del pulso en segundos. Hay dos picos y un valle en el gráfico.

Hello Pulse usando OpenPulse

OpenPulsees un lenguaje para especificar el control a nivel de pulso de un dispositivo cuántico general y forma parte de la especificación OpenQASM 3.0. Amazon Braket admite OpenPulse para la programación directa de pulsos mediante la representación OpenQASM 3.0.

Braket utiliza OpenPulse como representación intermedia subyacente para expresar los pulsos en instrucciones nativas. OpenPulse admite la adición de calibraciones de instrucción en forma de declaraciones defcal (abreviatura de «definir calibración»). Con estas declaraciones, puede especificar la implementación de una instrucción de puerta dentro de una gramática de control de nivel inferior.

Puede ver el OpenPulse programa de un PulseSequence Braket con el siguiente comando.

print(pulse_sequence.to_ir())

También puede crear un OpenPulse programa directamente.

from braket.ir.openqasm import Program openpulse_script = """ OPENQASM 3.0; cal { bit[1] psb; waveform my_waveform = gaussian(12.0ns, 3.0ns, 0.2, false); play(Transmon_25_charge_tx, my_waveform); psb[0] = capture_v0(Transmon_25_readout_rx); } """

Cree un objeto Program con su script. A continuación, envíe el programa a una QPU.

from braket.aws import AwsDevice from braket.devices import Devices from braket.ir.openqasm import Program program = Program(source=openpulse_script) device = AwsDevice(Devices.Rigetti.Ankaa3) task = device.run(program, shots=100)