

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

# Braket はどのような OpenQASM 機能をサポートしていますか?
<a name="braket-openqasm-supported-features"></a>

以下のセクションでは、Braket でサポートされている OpenQASM 3.0 のデータ型、ステートメント、およびプラグマ命令を示します。

**Topics**
+ [サポートされている OpenQASM データ型](#braket-openqasm-supported-features-datatypes)
+ [サポートされている OpenQASM ステートメント](#braket-openqasm-supported-features-statements)
+ [Braket OpenQASM プラグマ](#braket-openqasm-supported-features-pragmas)
+ [LocalSimulator での OpenQASM の高度な機能のサポート](#braket-openqasm-supported-features-advanced-feature-local-simulator)
+ [OpenPulse でサポートされているオペレーションと文法](#braket-openpulse-supported-operations-grammar)

## サポートされている OpenQASM データ型
<a name="braket-openqasm-supported-features-datatypes"></a>

Amazon Braket では以下の OpenQASM データ型がサポートされています。
+ 非負の整数は (仮想および物理) 量子ビットのインデックスに使用されます。
  +  `cnot q[0], q[1];` 
  +  `h $0;` 
+ 浮動小数点数や定数は、ゲート回転角度に使用できます。
  +  `rx(-0.314) $0;` 
  +  `rx(pi/4) $0;` 

**注記**  
pi は OpenQASM の組み込み定数であり、パラメータ名として使用することはできません。
+ 複素数の配列 (虚部については OpenQASM では「`im`」と表記) は、一般エルミートオブザーバブルを定義するための結果タイププラグマ、およびユニタリプラグマで使用できます。
  +  `#pragma braket unitary [[0, -1im], [1im, 0]] q[0]` 
  +  `#pragma braket result expectation hermitian([[0, -1im], [1im, 0]]) q[0]` 

## サポートされている OpenQASM ステートメント
<a name="braket-openqasm-supported-features-statements"></a>

Amazon Braket では、以下の OpenQASM ステートメントがサポートされています。
+  `Header: OPENQASM 3;` 
+ 古典ビット宣言:
  +  `bit b1;` (等価: `creg b1;`)
  +  `bit[10] b2;` (等価: `creg b2[10];`)
+ 量子ビット宣言:
  +  `qubit b1;` (等価: `qreg b1;`)
  +  `qubit[10] b2;` (等価: `qreg b2[10];`)
+ 配列内のインデックス作成: `q[0]` 
+ 入力: `input float alpha;` 
+ 物理qubitsの指定: `$0` 
+ デバイスでサポートされているゲートとオペレーション:
  +  `h $0;` 
  +  `iswap q[0], q[1];` 

**注記**  
デバイスでサポートされているゲートは、OpenQASM アクションのデバイスプロパティにあります。これらのゲートを使用するのにゲート定義は必要ありません。
+ 逐語的なボックスステートメント。現在、ボックス期間表記はサポートされていません。逐語的なボックスには、ネイティブゲートと物理 qubits が必要です。

```
#pragma braket verbatim
box{
    rx(0.314) $0;
}
```
+ qubitsまたはqubitレジスタ全体の測定と測定の割り当て。
  +  `measure $0;` 
  +  `measure q;` 
  +  `measure q[0];` 
  +  `b = measure q;` 
  +  `measure q → b;` 
+ 障壁ステートメントは、障壁の境界を越えてゲートの順序変更と最適化を防止することで、回路のコンパイルと実行を明示的に制御します。また、実行中に厳密な時間順序を適用し、後続のオペレーションが開始される前に障壁が完了する前にすべてのオペレーションを保証します。
  +  `barrier;` 
  +  `barrier q[0], q[1];` 
  +  `barrier $3, $6;` 

## Braket OpenQASM プラグマ
<a name="braket-openqasm-supported-features-pragmas"></a>

Amazon Braket でサポートされている OpenQASM プラグマ命令は、以下のとおりです。
+ ノイズプラグマ
  +  `#pragma braket noise bit_flip(0.2) q[0]` 
  +  `#pragma braket noise phase_flip(0.1) q[0]` 
  +  `#pragma braket noise pauli_channel` 
+ 逐語的なプラグマ
  +  `#pragma braket verbatim` 
+ 結果タイププラグマ
  + 基底不変な結果タイプ:
    + 状態ベクトル: `#pragma braket result state_vector` 
    + 密度マトリックス: <code>\#pragma braket result density\_matrix</code> 
  + 勾配計算プラグマ:
    + 随伴勾配: <code>\#pragma braket result adjoint\_gradient expectation(2.2 \* x[0] @ x[1]) all</code> 
  + Z基底による結果タイプ:
    + 振幅: `#pragma braket result amplitude "01"` 
    + 確率: `#pragma braket result probability q[0], q[1]` 
  + 基底回転結果タイプ
    + 期待値: `#pragma braket result expectation x(q[0]) @ y([q1])` 
    + 分散: `#pragma braket result variance hermitian([[0, -1im], [1im, 0]]) $0` 
    + 標本: `#pragma braket result sample h($1)` 

**注記**  
OpenQASM 3.0 は OpenQASM 2.0 と下位互換性があるため、2.0 を使用して記述されたプログラムは Braket で実行できます。ただし、Braket でサポートされている OpenQASM 3.0 の機能には、`qreg` と `creg` の違いや `qubit` と `bit` の違いなど、構文の小さな違いがあります。測定構文にも違いがあり、これらの違いには正しい構文で対応する必要があります。

## LocalSimulator での OpenQASM の高度な機能のサポート
<a name="braket-openqasm-supported-features-advanced-feature-local-simulator"></a>

`LocalSimulator` は、Braket の QPU またはオンデマンドシミュレーターの構成要素として提供されていない高度な OpenQASM 機能をサポートしています。`LocalSimulator` でのみサポートされている機能を次にリストします。
+ ゲート修飾子
+ OpenQASM 組み込みゲート
+ クラシカル変数
+ クラシカルオペレーション
+ カスタムゲート
+ クラシカル制御
+ QASM ファイル
+ サブルーチン

高度な各機能の例については、「[sample notebook](https://github.com/aws/amazon-braket-examples/blob/main/examples/braket_features/Simulating_Advanced_OpenQASM_Programs_with_the_Local_Simulator.ipynb)」を参照してください。OpenQASM の完全な仕様については、[OpenQASM のウェブサイト](https://openqasm.com/language/index.html)を参照してください。

## OpenPulse でサポートされているオペレーションと文法
<a name="braket-openpulse-supported-operations-grammar"></a>

 **サポートされている OpenPulse データ型** 

Cal ブロック:

```
cal {
    ...
}
```

Defcal ブロック:

```
// 1 qubit
defcal x $0 {
...
}

// 1 qubit w. input parameters as constants
defcal my_rx(pi) $0 {
...
}

// 1 qubit w. input parameters as free parameters
defcal my_rz(angle theta) $0 {
...
}

// 2 qubit (above gate args are also valid)
defcal cz $1, $0 {
...
}
```

フレーム (frame):

```
frame my_frame = newframe(port_0, 4.5e9, 0.0);
```

波形 (waveform):

```
// prebuilt
waveform my_waveform_1 = constant(1e-6, 1.0);

//arbitrary
waveform my_waveform_2 = {0.1 + 0.1im, 0.1 + 0.1im, 0.1, 0.1};
```

 **カスタムゲートキャリブレーションの例:** 

```
cal {
    waveform wf1 = constant(1e-6, 0.25);
}

defcal my_x $0 {
   play(wf1, q0_rf_frame);
}

defcal my_cz $1, $0 {
    barrier q0_q1_cz_frame, q0_rf_frame;
    play(q0_q1_cz_frame, wf1);
    delay[300ns] q0_rf_frame
    shift_phase(q0_rf_frame, 4.366186381749424);
    delay[300ns] q0_rf_frame;
    shift_phase(q0_rf_frame.phase, 5.916747563126659);
    barrier q0_q1_cz_frame, q0_rf_frame;
    shift_phase(q0_q1_cz_frame, 2.183093190874712);
}

bit[2] ro;
my_x $0;
my_cz $1,$0;
c[0] = measure $0;
```

 **任意パルスの例:** 

```
bit[2] ro;
cal {
    waveform wf1 = {0.1 + 0.1im, 0.1 + 0.1im, 0.1, 0.1};
    barrier q0_drive, q0_q1_cross_resonance;
    play(q0_q1_cross_resonance, wf1);
    delay[300ns] q0_drive;
    shift_phase(q0_drive, 4.366186381749424);
    delay[300dt] q0_drive;
   barrier q0_drive, q0_q1_cross_resonance;
   play(q0_q1_cross_resonance, wf1);
    ro[0] = capture_v0(r0_measure);
    ro[1] = capture_v0(r1_measure);
}
```