翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
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 の Amazon Resource Name (ARN) を使用して新しい Braket デバイスをインスタンス化します。次のコードブロックは を使用しますRigetti Ankaa-2。
device = AwsDevice(Devices.Rigetti.Ankaa2)
次のパルスシーケンスには、波形の再生と量子ビットの測定の 2 つのコンポーネントが含まれています。通常、パルスシーケンスはフレームに適用できます。障壁や遅延などの一部の例外を除き、量子ビットに適用できます。パルスシーケンスを構築する前に、使用可能なフレームを取得する必要があります。ドライブフレームは Rabi 振動のパルスを適用するのに使用され、読み取りフレームは量子ビット状態の測定に使用されます。この例では、 は量子ビット 25 のフレームを使用します。フレームの詳細については、「フレームとポートのロール」を参照してください。
drive_frame = device.frames["Transmon_25_charge_tx"] readout_frame = device.frames["Transmon_25_readout_rx"]
次に、ドライブフレームで再生される波形を作成します。目標は、さまざまなパルス長の量子ビットの動作を特徴付けることです。毎回異なる長さの波形を再生します。毎回新しい波形をインスタンス化する代わりに、Braket がサポートするフリーパラメータをパルスシーケンスで使用します。フリーパラメータを使用して波形とパルスシーケンスを 1 回作成し、同じパルスシーケンスを異なる入力値で実行できます。
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.5 ns のパルスシーケンスに対応します。

OpenPulse を使用した Hello OpenPulse
OpenPulse
Braket は、ネイティブ命令でパルスを表現するための基盤となる中間表現OpenPulseとして を使用します。 は、defcal
(「キャリブレーションの定義」の略) 宣言の形式で命令キャリブレーションの追加OpenPulseをサポートしています。これらの宣言を使用すると、下位レベルの制御文法内でゲート命令の実装を指定できます。
Braket の OpenPulse プログラムを表示するには、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=qasm_script) device = AwsDevice(Devices.Rigetti.Ankaa2) task = device.run(program, shots=100)