

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 Hello Pulse
<a name="braket-hello-pulse"></a>

在本節中，您將了解如何直接使用Rigetti裝置上的脈衝來描述和建構單一 qubit 閘道。將電磁欄位套用至 qubit 會導致 Rabi 振盪，並在其 0 狀態和 1 狀態之間切換 qubit。使用經過校正的脈衝長度和階段，Rabi 振盪可以計算單一 qubit 閘道。在這裡，我們將決定測量 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)
```

下列脈衝序列包含兩個元件：播放波形和測量 qubit。脈衝序列通常可以套用至影格。除了一些例外狀況，例如障礙和延遲，這些例外狀況可以套用至 qubit。在建構脈衝序列之前，您必須擷取可用的影格。驅動框架用於套用 Rabi 振盪的脈衝，而讀取框架用於測量 qubit 狀態。此範例使用 qubit 25 的影格。

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

現在，建立將在驅動影格中播放的波形。目標是描述不同脈衝長度的 qubit 行為。您每次都會播放不同長度的波形。使用脈衝序列`FreeParameter`中支援的 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。在 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
]
```

qubit 測量的統計資料會顯示在 0 狀態和 1 狀態之間振盪的 qubit 振盪動態。從測量資料中，您可以擷取 Rabi 頻率，並微調脈衝的長度，以實作特定的 1-qubit 閘道。例如，根據下圖中的資料，週期性約為 154 ns。因此，pi/2 輪換閘道會對應至長度 = 38.5ns 的脈衝序列。

![\[折線圖，顯示脈衝持續時間的母體數量，以秒為單位。圖形中有兩個峰值和一個波谷。\]](http://docs.aws.amazon.com/zh_tw/braket/latest/developerguide/images/Rabi-frequency.png)


## 使用 OpenPulse 的 Hello Pulse
<a name="braket-hello-pulse-openpulse"></a>

 [OpenPulse](https://openqasm.com/language/openpulse.html) 是一種用於指定一般量子裝置的脈衝層級控制的語言，也是 OpenQASM 3.0 規格的一部分。Amazon Braket 支援使用 OpenQASM 3.0 表示法OpenPulse直接程式設計脈衝。

 Braket 使用 OpenPulse做為基礎中繼表示法，以在原生指示中表達脈衝。 OpenPulse支援以 `defcal`(「定義校正」的簡稱） 宣告形式新增指令校正。透過這些宣告，您可以在較低層級的控制文法中指定閘道指令的實作。

您可以使用`PulseSequence`下列命令檢視 Braket 的 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)
```