

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

# さまざまな Braket デバイスでの OpenQASM のサポート
<a name="braket-openqasm-device-support"></a>

OpenQASM 3.0 をサポートするデバイスの場合、[`action`] フィールドは、 Rigetti および IonQ デバイスの次の例に示すように、`GetDevice` レスポンスによって新しいアクションをサポートします。

```
//OpenQASM as available with the Rigetti device capabilities
{
    "braketSchemaHeader": {
        "name": "braket.device_schema.rigetti.rigetti_device_capabilities",
        "version": "1"
    },
    "service": {...},
    "action": {
        "braket.ir.jaqcd.program": {...},
        "braket.ir.openqasm.program": {
            "actionType": "braket.ir.openqasm.program",
            "version": [
                "1"
            ],
            ….
        }
    }
}

//OpenQASM as available with the IonQ device capabilities
{
    "braketSchemaHeader": {
        "name": "braket.device_schema.ionq.ionq_device_capabilities",
        "version": "1"
    },
    "service": {...},
    "action": {
        "braket.ir.jaqcd.program": {...},
        "braket.ir.openqasm.program": {
            "actionType": "braket.ir.openqasm.program",
            "version": [
                "1"
            ],
            ….
        }
    }
}
```

パルス制御をサポートするデバイスの場合、[`pulse`] フィールドが [`GetDevice`] レスポンスに表示されます。次の例は、Rigetti デバイスの [`pulse`] フィールドを示しています。

```
// Rigetti
{
  "pulse": {
    "braketSchemaHeader": {
      "name": "braket.device_schema.pulse.pulse_device_action_properties",
      "version": "1"
    },
    "supportedQhpTemplateWaveforms": {
      "constant": {
        "functionName": "constant",
        "arguments": [
          {
            "name": "length",
            "type": "float",
            "optional": false
          },
          {
            "name": "iq",
            "type": "complex",
            "optional": false
          }
        ]
      },
      ...
    },
    "ports": {
      "q0_ff": {
        "portId": "q0_ff",
        "direction": "tx",
        "portType": "ff",
        "dt": 1e-9,
        "centerFrequencies": [
          375000000
        ]
      },
      ...
    },
    "supportedFunctions": {
      "shift_phase": {
        "functionName": "shift_phase",
        "arguments": [
          {
            "name": "frame",
            "type": "frame",
            "optional": false
          },
          {
            "name": "phase",
            "type": "float",
            "optional": false
          }
        ]
      },
     ...
    },
    "frames": {
      "q0_q1_cphase_frame": {
        "frameId": "q0_q1_cphase_frame",
        "portId": "q0_ff",
        "frequency": 462475694.24460185,
        "centerFrequency": 375000000,
        "phase": 0,
        "associatedGate": "cphase",
        "qubitMappings": [
          0,
          1
        ]
      },
      ...
    },
    "supportsLocalPulseElements": false,
    "supportsDynamicFrames": false,
    "supportsNonNativeGatesWithPulses": false,
    "validationParameters": {
      "MAX_SCALE": 4,
      "MAX_AMPLITUDE": 1,
      "PERMITTED_FREQUENCY_DIFFERENCE": 400000000
    }
  }
}
```

以下のようなフィールドが先行しています。

 **ポート (ports):** 

指定したポートの関連プロパティに加えて、QPU で宣言されている事前作成の外部 (`extern`) デバイスポートを記述するものです。この構造にリストされているすべてのポートは、ユーザーが送信した `OpenQASM 3.0` プログラム内で有効な識別子として事前に宣言されています。ポートの追加プロパティは次のとおりです。
+ ポート ID (portId)
  + OpenQASM 3.0 で識別子として宣言されたポート名。
+ 方向 (direction)
  + ポートの方向。ドライブポートはパルスを送信し (方向は「tx」)、測定ポートはパルスを受信します (方向は「rx」)。
+ ポートタイプ (portType)
  + このポートが担当するアクションのタイプ (ドライブ、キャプチャ、ff [高速磁束制御] など)。
+ Dt (dt)
  + 指定したポートの 1 つのサンプル時間ステップを表す秒単位の時間。
+ 量子ビットマッピング (qubitMappings)
  + 指定したポートに関連付ける量子ビット。
+ 中心周波数 (centerFrequencies)
  + ポート上のすべての事前宣言済みフレームまたはユーザー定義済みのフレームに関連する中心周波数のリスト。詳細については、「フレーム」を参照してください。
+ QHP 固有のプロパティ (qhpSpecificProperties)
  + QHP に固有のポートに関する既存のプロパティの詳細を示す、オプションのマップ。

 **フレーム (frames):** 

QPU で宣言された事前作成済みの外部フレームと、それらのフレームのプロパティを記述します。この構造にリストされているすべてのフレームは、ユーザーが送信した `OpenQASM 3.0` プログラム内で有効な識別子として事前に宣言されています。フレームの追加プロパティは次のとおりです。
+ フレーム ID (frameId)
  + OpenQASM 3.0 で識別子として宣言されたフレーム名。
+ ポート ID (portId)
  + フレームに関連付けられたハードウェアポート。
+ 周波数 (frequency)
  + フレームのデフォルトの初期周波数。
+ 中心周波数 (centerFrequency)
  + フレームの周波数帯域幅の中心。通常、フレームは中心周波数の周りの特定の帯域幅にのみ調整できます。この結果、周波数調整は中心周波数からの所定のデルタ内にとどまる必要があります。帯域幅の値は検証パラメータで確認できます。
+ 位相 (phase)
  + フレームのデフォルトの初期位相。
+ 関連付けるゲート (associatedGate)
  + 指定したフレームに関連付けるゲート。
+ 量子ビットマッピング (qubitMappings)
  + 指定したフレームに関連付ける量子ビット。
+ QHP 固有のプロパティ (qhpSpecificProperties)
  + QHP に固有のフレームに関する既存のプロパティの詳細を示す、オプションのマップ。

 **SupportsDynamicFrames:** 

OpenPulse `newframe` 関数を通じてフレームを `cal` または `defcal` ブロックで宣言できるかどうかを記述するものです。false の場合、フレーム構造にリストされているフレームのみをプログラム内で使用できます。

 **SupportedFunctions:** 

デバイスでサポートされている OpenPulse 関数に加えて、それらの関数に関連する引数、引数タイプ、戻り値タイプを記述します。OpenPulse 関数の使用例については、「[OpenPulse specification](https://openqasm.com/language/openpulse.html)」を参照してください。現時点では、Braket は以下をサポートしています。
+ shift\$1phase
  + フレームの位相を指定した値だけシフトします。
+ set\$1phase
  + フレームの位相を指定した値に設定します。
+ swap\$1phases
  + 2 つのフレーム間で位相をスワップします。
+ shift\$1frequency
  + フレームの周波数を指定した値だけシフトします。
+ set\$1frequency
  + フレームの周波数を指定した値に設定します。
+ play
  + 波形をスケジュールします。
+ capture\$1v0
  + キャプチャフレームの値をビットレジスタに返します。

 **SupportedQhpTemplateWaveforms:** 

デバイスで使用できる構築済みの波形関数、およびそれらに関連する引数とタイプを記述します。デフォルトでは、Braket Pulse はすべてのデバイスで構築済みの波形ルーチンを提供します。それらのルーチンは以下のとおりです。

 ** *Constant* ** 

![\[パラメータ t、τ、iq を持ち、出力が常に iq と等しい定数関数を示す数式。\]](http://docs.aws.amazon.com/ja_jp/braket/latest/developerguide/images/ConstantFunction.png)


 `τ` は波形の長さで、`iq` は複素数です。

```
def constant(length, iq)
```

 ** *ガウシアン*** 

![\[パラメータ t、τ、σ、A=1、ZaE=0 を持ったガウス関数を示す数式。\]](http://docs.aws.amazon.com/ja_jp/braket/latest/developerguide/images/GaussianFunction.png)


 `τ`は波形の長さ、`σ`はガウシアンの幅、`A` は振幅です。`ZaE` を `True` に設定すると、ガウシアンにオフセットが生じ、波形の開始時と終了時にゼロに等しくなるように再スケールされ、最大で `A` になります。

```
def gaussian(length, sigma, amplitude=1, zero_at_edges=False)
```

 ** *DRAG ガウシアン* ** 

![\[パラメータ t、τ、σ、β、A=1、ZaE=0 を持った DRAG ガウス分布の数式。\]](http://docs.aws.amazon.com/ja_jp/braket/latest/developerguide/images/DRAGGaussianFunction.png)


 `τ`は波形の長さ、`σ`はガウシアンの幅、`β`は自由パラメータ、`A` は振幅です。`ZaE` を `True` に設定すると、断熱ゲートによる微分除去 (DRAG) ガウシアンにオフセットが生じ、波形の開始時と終了時にゼロに等しくなるように再スケールされ、実部が最大で `A` になります。DRAG 波形の詳細については、文書「[Simple Pulses for Elimination of Leakage in Weakly Nonlinear Qubits](https://doi.org/10.1103/PhysRevLett.103.110501)」を参照してください。

```
def drag_gaussian(length, sigma, beta, amplitude=1, zero_at_edges=False)
```

 ** *誤差関数平滑化方形パルス* ** 

![\[パラメータ t、L (長さ)、W (幅)、σ、A=1、ZaE=0 を持った、誤差関数平滑化分布の数式。\]](http://docs.aws.amazon.com/ja_jp/braket/latest/developerguide/images/ErfSquareFunction.PNG)


ここで、`L` と `W` はそれぞれ波形の長さと幅、`σ`はエッジの立ち上がりと立ち下がりの速度、`t1​=(L−W)/2`、`t22=(L+W)/2`、`A` は振幅です。`ZaE` を `True` に設定すると、ガウシアンにオフセットが生じ、波形の開始時と終了時にゼロに等しくなるように再スケールされ、最大で `A` になります。次の式は、波形の再スケールされたバージョンです。

![\[パラメータ ZaE=1 で再スケールされた誤差関数平滑化分布の数式。\]](http://docs.aws.amazon.com/ja_jp/braket/latest/developerguide/images/RescaledErfSquareFunction.PNG)


ここで、`a=erf(W/2σ)` であり、`b=erf(-t1​/σ)/2+erf(t2​/σ)/2` です。

```
def erf_square(length, width, sigma, amplitude=1, zero_at_edges=False)
```

 **SupportsLocalPulseElements:** 

ポート、フレーム、波形などのパルス要素を`defcal` ブロックでローカルに定義できるかどうかを記述します。値が `false` の場合、要素は `cal` ブロックで定義する必要があります。

 **SupportsNonNativeGatesWithPulses:** 

パルスプログラムと組み合わせて非ネイティブゲートを使用できるかどうかを記述します。例えば、最初に使用済み量子ビットに対して `defcal` を使用してゲートを定義することなく、プログラム内で `H` ゲートのような非ネイティブゲートを使用することはできません。ネイティブゲートの `nativeGateSet` キーのリストは、[デバイス機能] にあります。

 **ValidationParameters:** 

以下を含む、パルス要素の検証境界を記述します。
+ 波形の最大スケール/最大振幅値 (任意および構築済み)
+ Hz 単位で指定された中心周波数の最大周波数帯域幅
+ 最小パルス長/持続時間 (秒単位)
+ 最小パルス長/持続時間 (秒単位)

## OpenQASM でサポートされているオペレーション、結果、結果タイプ
<a name="braket-openqasm-supported-operations-results-result-types"></a>

各デバイスがサポートする OpenQASM 3.0 の機能を確認するには、デバイス機能の出力で [`action`] フィールド内の `braket.ir.openqasm.program` キーを参照してください。例えば、Braket 状態ベクトルシミュレーター SV1 でサポートされているオペレーションと結果タイプを次に示します。

```
...
  "action": {
    "braket.ir.jaqcd.program": {
      ...
    },
 "braket.ir.openqasm.program": {
      "version": [
        "1.0"
      ],
      "actionType": "braket.ir.openqasm.program",
      "supportedOperations": [
        "ccnot",
        "cnot",
        "cphaseshift",
        "cphaseshift00",
        "cphaseshift01",
        "cphaseshift10",
        "cswap",
        "cy",
        "cz",
        "h",
        "i",
        "iswap",
        "pswap",
        "phaseshift",
        "rx",
        "ry",
        "rz",
        "s",
        "si",
        "swap",
        "t",
        "ti",
        "v",
        "vi",
        "x",
        "xx",
        "xy",
        "y",
        "yy",
        "z",
        "zz"
      ],
      "supportedPragmas": [
        "braket_unitary_matrix"
      ],
      "forbiddenPragmas": [],
      "maximumQubitArrays": 1,
      "maximumClassicalArrays": 1,
      "forbiddenArrayOperations": [
        "concatenation",
        "negativeIndex",
        "range",
        "rangeWithStep",
        "slicing",
        "selection"
      ],
      "requiresAllQubitsMeasurement": true,
      "supportsPhysicalQubits": false,
      "requiresContiguousQubitIndices": true,
      "disabledQubitRewiringSupported": false,
      "supportedResultTypes": [
        {
          "name": "Sample",
          "observables": [
            "x",
            "y",
            "z",
            "h",
            "i",
            "hermitian"
          ],
          "minShots": 1,
          "maxShots": 100000
        },
        {
          "name": "Expectation",
          "observables": [
            "x",
            "y",
            "z",
            "h",
            "i",
            "hermitian"
          ],
          "minShots": 0,
          "maxShots": 100000
        },
        {
          "name": "Variance",
          "observables": [
            "x",
            "y",
            "z",
            "h",
            "i",
            "hermitian"
          ],
          "minShots": 0,
          "maxShots": 100000
        },
        {
          "name": "Probability",
          "minShots": 1,
          "maxShots": 100000
        },
        {
          "name": "Amplitude",
          "minShots": 0,
          "maxShots": 0
        }
        {
          "name": "AdjointGradient",
          "minShots": 0,
          "maxShots": 0
        }
      ]
    }
  },
...
```