Hello Pulse の使用方法 - Amazon Braket

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Hello Pulse の使用方法

このセクションでは、Rigetti デバイスでパルスを使用して 1 つの量子ビットゲートを特性評価して直接構築する方法について説明します。量子ビットに電磁場を適用すると、Rabi 振動が発生し、量子ビットが 0 状態と 1 状態の間で切り替わります。パルスの長さと位相がキャリブレーションされている場合、Rabi 振動により 1 量子ビットのゲートを計算できます。ここでは、より複雑なパルスシーケンスの構築に使用される基本ブロックである 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 の <noloc>Amazon リソースネーム</noloc> (ARN) を使用して新しい Braket デバイスをインスタンス化します。次のコマンドブロックでは、Rigetti Ankaa-3 が使用されています。

device = AwsDevice(Devices.Rigetti.Ankaa3)

次のパルスシーケンスには、波形の再生と量子ビットの測定という 2 つの構成要素が含まれています。通常、パルスシーケンスはフレームに適用できます。障害や遅延など、一部の例外は、量子ビットに適用できます。パルスシーケンスを構築する前に、使用可能なフレームを取得する必要があります。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)

最後に、これらを1つのパルスシーケンスとしてまとめます。パルスシーケンスにおいて、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 ns です。したがって、pi/2 回転ゲートは、長さが 38.5 ns のパルスシーケンスに対応します。

パルス持続時間 (秒) に対する励起集団の量を示す折れ線グラフ。このグラフには 2 つのピークと 1 つの谷があります。

OpenPulse によるパルス入門

OpenPulse は、一般的な量子デバイスのパルスレベルの制御を指定するための言語であり、OpenQASM 3.0 仕様の一部です。OpenPulse は OpenQASM 3.0 の表現を用いてパルスを直接プログラミングするための機能であり、Amazon Braket によってサポートされています。

Braket は、ネイティブ命令でパルスを表現するための基盤となる中間表現として OpenPulse を使用します。OpenPulse は、defcal (「define calibration」の略) 宣言の形式で命令のキャリブレーション結果を追加できます。この宣言により、低レベルの制御文法を使用してゲート命令の実装を指定できます。

OpenPulse の Braket PulseSequence プログラムを表示するには、次のコマンドを使用します。

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)