Trabalhando com o Hello Pulse - Amazon Braket

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Trabalhando com o Hello Pulse

Nesta seção, você aprenderá como caracterizar e construir uma única porta de qubit diretamente usando pulse em um Rigetti dispositivo. A aplicação de um campo eletromagnético a um qubit leva à oscilação Rabi, alternando os qubits entre seu estado 0 e 1 estado. Com o comprimento e a fase calibrados do pulso, a oscilação Rabi pode calcular portas de um único qubit. Aqui, determinaremos o comprimento de pulso ideal para medir um pulso pi/2, um bloco elementar usado para criar sequências de pulso mais complexas.

Primeiro, para criar uma sequência de pulsos, importe a PulseSequence classe.

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

Em seguida, instancie um novo dispositivo Braket usando o Amazon Resource Name (ARN) doQPU. O seguinte bloco de código usa Rigetti Ankaa-2.

device = AwsDevice(Devices.Rigetti.Ankaa2)

A sequência de pulsos a seguir inclui dois componentes: reproduzir uma forma de onda e medir um qubit. A sequência de pulsos geralmente pode ser aplicada aos quadros. Com algumas exceções, como barreira e atraso, que podem ser aplicados aos qubits. Antes de construir a sequência de pulsos, você deve recuperar os quadros disponíveis. A estrutura de acionamento é usada para aplicar o pulso para a oscilação Rabi e a estrutura de leitura é para medir o estado do qubit. Este exemplo usa os quadros do qubit 25. Para obter mais informações sobre quadros, consulte Funções de quadros e portas.

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

Agora, crie a forma de onda que será reproduzida na estrutura da unidade. O objetivo é caracterizar o comportamento dos qubits para diferentes comprimentos de pulso. Você reproduzirá uma forma de onda com comprimentos diferentes a cada vez. Em vez de instanciar uma nova forma de onda a cada vez, use o parâmetro livre suportado por Braket na sequência de pulsos. Você pode criar a forma de onda e a sequência de pulso uma vez com parâmetros livres e, em seguida, executar a mesma sequência de pulso com valores de entrada diferentes.

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

Por fim, coloque-os juntos como uma sequência de pulsos. Na sequência de pulsos, play reproduz a forma de onda especificada na estrutura da unidade e capture_v0 mede o estado a partir da estrutura de leitura.

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

Escaneie uma faixa de comprimento de pulso e envie-os para QPU o.

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

As estatísticas da medição do qubit exibem a dinâmica oscilatória do qubit que oscila entre o estado 0 e o estado 1. A partir dos dados de medição, você pode extrair a frequência Rabi e ajustar o comprimento do pulso para implementar uma porta específica de 1 qubit. Por exemplo, a partir dos dados na figura abaixo, a periodicidade é de cerca de 154 ns. Portanto, uma porta de rotação pi/2 corresponderia à sequência de pulso com comprimento = 38,5 ns.

Gráfico de linhas que mostra a quantidade de população em relação à duração do pulso em segundos. Há dois picos e uma depressão no gráfico.

Hello Pulse usando OpenPulse

OpenPulseé uma linguagem para especificar o controle de nível de pulso de um dispositivo quântico geral e faz parte da especificação Open QASM 3.0. O Amazon Braket oferece suporte OpenPulse para programar pulsos diretamente usando a representação Open QASM 3.0.

Usos do braket OpenPulse como representação intermediária subjacente para expressar pulsos em instruções nativas. OpenPulse suporta a adição de calibrações de instruções na forma de declarações defcal (abreviação de “definir calibração”). Com essas declarações, você pode especificar a implementação de uma instrução gate dentro de uma gramática de controle de nível inferior.

Você pode visualizar o OpenPulse programa de um Braket PulseSequence usando o comando a seguir.

print(pulse_sequence.to_ir())

Você também pode construir um OpenPulse programa diretamente.

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); } """

Crie um Program objeto com seu script. Em seguida, envie o programa para umQPU.

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