本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 Hello Pulse
在本节中,您将了解如何使用 Rigetti 设备上的 Pulse 直接表征和构造单个量子比特门。对量子比特施加电磁场会导致 Rabi 振荡,在量子比特的 0 状态和 1 状态之间切换。通过校准脉冲的长度和相位,Rabi 振荡可以计算出单个量子比特门。在这里,我们将确定测量 pi/2 脉冲的最佳脉冲长度,该脉冲是用于构建更复杂的脉冲序列的基本模块。
首先,要构建脉冲序列,请导入 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
接下来,使用 QPU 的 Amazon Resource Name(ARN)实例化一台新的 Braket 设备。以下命令块使用 Rigetti Ankaa-3:
device = AwsDevice(Devices.Rigetti.Ankaa3)
以下脉冲序列包括两个部分:播放波形和测量量子比特。脉冲序列通常可以应用于帧。有一些例外,如屏障和延迟,可以应用于量子比特。在构造脉冲序列之前,必须检索可用的帧。驱动框架用于施加脉冲以实现 Rabi 振荡,读出帧用于测量量子比特状态。此示例使用量子比特 25 的帧。
drive_frame = device.frames["Transmon_25_charge_tx"] readout_frame = device.frames["Transmon_25_readout_rx"]
现在,创建要在驱动器帧中播放的波形。这样做的目的是描述量子比特在不同脉冲长度下的行为。每次您将播放一个长度不同的波形。不是每次都实例化一个新波形,而是在脉冲序列中使用 Braket 支持的 FreeParameter。您可以使用自由参数创建一次波形和脉冲序列,然后使用不同的输入值运行相同的脉冲序列。
waveform = GaussianWaveform(FreeParameter("length"), FreeParameter("length") * 0.25, 0.2, False)
最后,将它们组合成脉冲序列。在脉冲序列中,play 播放驱动器帧上的指定波形,capture_v0 测量读出帧的状态。
pulse_sequence = ( PulseSequence() .play(drive_frame, waveform) .capture_v0(readout_frame) )
扫描一定范围的脉冲长度,然后将其提交给 QPU。在 QPU 上执行脉冲序列之前,请绑定自由参数的值。
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 ]
量子比特测量的统计数据显示了在 0 状态和 1 状态之间振荡的量子比特的振荡动力学。从测量数据中,您可以提取 Rabi 频率并微调脉冲长度以实现特定的 1 量子比特门。例如,根据下图中的数据,周期约为 154 纳米。因此,pi/2 旋转门对应于长度为 38.5 纳米的脉冲序列。
你好 Pulse 使用 OpenPulse
OpenPulse
Braket 使用 OpenPulse 在原生指令中表达脉冲的底层中间表示形式。OpenPulse 支持以 defcal(“定义校准”的缩写)声明形式添加指令校准。通过这些声明,您可以在较低级别的控制语法中指定门指令的实现。
您可以使用以下命令查看 Brake PulseSequence t 的 OpenPulse 程序。
print(pulse_sequence.to_ir())
您也可以直接构造 OpenPulse 程序。
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); } """
使用脚本创建 Program 对象。然后,将该程序提交给 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)