使用 Hello Pulse - Amazon Braket

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 Hello Pulse

在本节中,您将学习如何使用脉冲直接表征和构造单个量子比特门 Rigetti 设备。对量子比特施加电磁场会导致 Rabi 振荡,在量子比特的 0 状态和 1 状态之间切换。通过校准脉冲的长度和相位,Rabi 振荡可以计算出单个量子比特门。在这里,我们将确定测量 pi/2 脉冲的最佳脉冲长度,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

接下来,使用实例化一个新的 Braket 设备 Amazon Resource Name (ARN) 的QPU。以下代码块使用 Rigetti Ankaa-2.

device = AwsDevice(Devices.Rigetti.Ankaa2)

以下脉冲序列包括两个部分:播放波形和测量量子比特。脉冲序列通常可以应用于帧。除了一些例外,例如屏障和延迟,它们可以应用于量子比特。在构造脉冲序列之前,必须检索可用的帧。驱动框架用于施加脉冲以进行 Rabi 振荡,读出帧用于测量量子比特状态。此示例使用量子比特 25 的帧。有关帧的更多信息,请参阅帧和端口的作用

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

现在,创建将在驱动器帧中播放的波形。目标是描述量子比特在不同脉冲长度下的行为。每次你将播放长度不同的波形。与其每次都实例化一个新的波形,不如在脉冲序列中使用 Braket 支持的自由参数。您可以使用自由参数创建一次波形和脉冲序列,然后使用不同的输入值运行相同的脉冲序列。

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.

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 ]

量子比特测量的统计数据显示了在 0 状态和 1 状态之间振荡的量子比特的振荡动力学。从测量数据中,您可以提取 Rabi 频率并微调脉冲长度以实现特定的 1 量子比特门。例如,根据下图中的数据,周期约为 154 ns。因此,pi/2 旋转门将对应于长度为 38.5ns 的脉冲序列。

以秒为单位显示脉冲持续时间的数量的折线图。图表中有两个峰值和一个低谷。

你好 Pulse 使用 OpenPulse

OpenPulse是一种用于指定通用量子器件脉冲电平控制的语言,是 Open QASM 3.0 规范的一部分。亚马逊 Braket 支持 OpenPulse 用于使用 Open QASM 3.0 表示法直接对脉冲进行编程。

支架用途 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=qasm_script) device = AwsDevice(Devices.Rigetti.Ankaa2) task = device.run(program, shots=100)