

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

# 結果タイプのリスト
<a name="braket-result-types"></a>

Amazon Braket は、`ResultType` を使用して回路を測定すると、異なるタイプの結果を返すことができます。回路が返すことができる結果のタイプは次のとおりです。
+  `AdjointGradient` は、指定されたオブザーバブルの期待値の勾配 (ベクトルの導関数) を返します。このオブザーバブルは、指定されたパラメータに関して随伴微分法を用いて、提供されたターゲットに作用します。この微分法は、shots=0 の場合にのみ使用できます。
+  `Amplitude` は、出力波動関数の指定された量子状態の振幅を返します。これは、SV1 およびローカルシミュレーターでのみ使用できます。
+  `Expectation` は、指定されたオブザーバブルの期待値を返します。この値は後ほどこの章内で紹介する `Observable` クラスで指定できます。オブザーバブルの測定に使用されるターゲット qubits を指定する必要があります。また、指定された qubits の数は、オブザーバブルが作用する量子ビットの数と等しくなければなりません。ターゲットが指定されていない場合、オブザーバブルは 1 qubit でのみ動作し、すべての qubits に並列に適用されます。
+  `Probability` は、計算基底状態を測定する確率を返します。ターゲットが指定されていない場合、`Probability` はすべての基底状態を測定する確率を返します。ターゲットが指定されている場合、指定された qubits の基底ベクトルの周辺確率のみが返されます。マネージドシミュレーターと QPU は最大 15 量子ビットに制限され、ローカルシミュレーターはシステムのメモリサイズに制限されます。
+  `Reduced density matrix` は、qubits のシステムから、指定されたターゲット qubits のサブシステムの密度マトリックスを返します。この結果タイプのサイズを制限するため、Braket はターゲット qubits の数を最大 8 に制限しています。
+  `StateVector` は、完全な状態ベクトルを返します。ローカルシミュレーターで利用できます。
+  `Sample` は、指定されたターゲット qubit セットおよびオブザーバブルの測定カウントを返します。ターゲットが指定されていない場合、オブザーバブルは 1 qubit でのみ動作し、すべての qubits に並列に適用されます。ターゲットが指定されている場合、指定されたターゲットの数は、オブザーバブルが作用する qubits の数と等しくなければなりません。
+  `Variance` は、指定されたターゲット qubit セットおよび要求された結果タイプとしてのオブザーバブルの分散 (`mean([x-mean(x)]2)`) を返します。ターゲットが指定されていない場合、オブザーバブルは 1 qubit でのみ動作し、すべての qubits に並列に適用されます。それ以外の場合、指定するターゲットの数は、オブザーバブルを適用できるqubitsの数と等しくなければなりません。

 **さまざまなプロバイダーでサポートされている結果タイプ:** 


|  |  |  |  |  |  |  |  |  | 
| --- |--- |--- |--- |--- |--- |--- |--- |--- |
|  | ローカルシム |  SV1  |  DM1  |  TN1  |  AQT  |  IonQ  |  IQM  |  Rigetti  | 
| 随伴勾配 | いいえ | はい | N | N | N | N | N | いいえ | 
| Amplitude | はい | Y | N | N | N | N | N | いいえ | 
| 期待値 | はい | Y | Y | Y | Y | Y | Y | はい | 
| 確率:  | はい | Y | Y | いいえ | Y | Y | Y | はい | 
| 縮約密度マトリックス | はい | いいえ | はい | N | N | N | N | いいえ | 
| 状態ベクトル | はい | N | N | N | N | N | N | いいえ | 
| サンプル | はい | Y | Y | Y | Y | Y | Y | はい | 
| 分散 | はい | Y | Y | Y | Y | Y | Y | はい | 

サポートされている結果タイプを確認するには、次の例に示すように、デバイスのプロパティを調べます。

```
from braket.aws import AwsDevice

device = AwsDevice("arn:aws:braket:us-west-1::device/qpu/rigetti/Ankaa-3")

# Print the result types supported by this device
for iter in device.properties.action['braket.ir.openqasm.program'].supportedResultTypes:
    print(iter)
```

```
name='Sample' observables=['x', 'y', 'z', 'h', 'i'] minShots=10 maxShots=50000
name='Expectation' observables=['x', 'y', 'z', 'h', 'i'] minShots=10 maxShots=50000
name='Variance' observables=['x', 'y', 'z', 'h', 'i'] minShots=10 maxShots=50000
name='Probability' observables=None minShots=10 maxShots=50000
```

`ResultType` を呼び出すには、次の例に示すように、結果タイプを回路に追加します。

```
from braket.circuits import Circuit, Observable

circ = Circuit().h(0).cnot(0, 1).amplitude(state=["01", "10"])
circ.probability(target=[0, 1])
circ.probability(target=0)
circ.expectation(observable=Observable.Z(), target=0)
circ.sample(observable=Observable.X(), target=0)
circ.state_vector()
circ.variance(observable=Observable.Z(), target=0)

# Print one of the result types assigned to the circuit
print(circ.result_types[0])
```

**注記**  
結果は、量子デバイスによって異なる形式で提供されます。例えば、Rigetti デバイスは測定値を返すのに対し、IonQ デバイスは確率を提供します。Amazon Braket SDK は、どの結果についても測定値プロパティを提供します。ただし、確率を返すデバイスの場合、ショットごとの測定値は得られないため、これらの測定値は確率に基づいて事後計算されます。結果が事後計算されたかどうかを判断するには、結果オブジェクトの `measurements_copied_from_device` を確認します。このオペレーションの詳細については、Amazon Braket SDK GitHub リポジトリの [gate\_model\_quantum\_task\_result.py](https://github.com/aws/amazon-braket-sdk-python/blob/ca5b08dada4839ca31c012ff50aa20b656fd1879/src/braket/tasks/gate_model_quantum_task_result.py#L70-L72) ファイルを参照してください。

## オブザーバブル
<a name="braket-result-types-observables"></a>

Amazon Braket の `Observable` クラスでは、特定のオブザーバブルを測定できます。

各 qubit には、一意の非同一性オブザーバブルを 1 つのみ適用できます。同じ qubit に 2 つ以上の異なる非同一性オブザーバブルを指定すると、エラーが表示されます。この目的のために、テンソル積の各因子は個々のオブザーバブルとしてカウントされます。つまり、qubitに作用する因子が同じである限り、同じ qubit に複数のテンソル積を持つことができます。

オブザーバブルはスケールでき、他のオブザーバブル (スケールするかどうかは問わない) を追加できます。これにより、`AdjointGradient` 結果タイプで使用できる `Sum` が作成されます。

`Observable` クラスには次のオブザーバブルが含まれています。

```
import numpy as np

Observable.I()
Observable.H()
Observable.X()
Observable.Y()
Observable.Z()

# Get the eigenvalues of the observable
print("Eigenvalue:", Observable.H().eigenvalues)
# Or rotate the basis to be computational basis
print("Basis rotation gates:", Observable.H().basis_rotation_gates)

# Get the tensor product of the observable for the multi-qubit case
tensor_product = Observable.Y() @ Observable.Z()
# View the matrix form of an observable by using
print("The matrix form of the observable:\n", Observable.Z().to_matrix())
print("The matrix form of the tensor product:\n", tensor_product.to_matrix())

# Factorize an observable in the tensor form
print("Factorize an observable:", tensor_product.factors)

# Self-define observables, given it is a Hermitian
print("Self-defined Hermitian:", Observable.Hermitian(matrix=np.array([[0, 1], [1, 0]])))

print("Sum of other (scaled) observables:", 2.0 * Observable.X() @ Observable.X() + 4.0 * Observable.Z() @ Observable.Z())
```

```
Eigenvalue: [ 1. -1.]
Basis rotation gates: (Ry('angle': -0.7853981633974483, 'qubit_count': 1),)
The matrix form of the observable:
 [[ 1.+0.j  0.+0.j]
 [ 0.+0.j -1.+0.j]]
The matrix form of the tensor product:
 [[ 0.+0.j  0.+0.j  0.-1.j  0.+0.j]
 [ 0.+0.j -0.+0.j  0.+0.j  0.+1.j]
 [ 0.+1.j  0.+0.j  0.+0.j  0.+0.j]
 [ 0.+0.j  0.-1.j  0.+0.j -0.+0.j]]
Factorize an observable: (Y('qubit_count': 1), Z('qubit_count': 1))
Self-defined Hermitian: Hermitian('qubit_count': 1, 'matrix': [[0.+0.j 1.+0.j], [1.+0.j 0.+0.j]])
Sum of other (scaled) observables: Sum(TensorProduct(X('qubit_count': 1), X('qubit_count': 1)), TensorProduct(Z('qubit_count': 1), Z('qubit_count': 1)))
```

## パラメータ
<a name="braket-result-types-parameters"></a>

回路には自由パラメータを組み込むことができます。これらの自由パラメータは、勾配の計算に使用でき、1 回だけ構築すれば何回でも実行できます。

各自由パラメータが使用する文字列エンコードされた名前は、以下の目的に使用されます。
+ パラメータ値を設定する
+ 使用するパラメータを特定する

```
from braket.circuits import Circuit, FreeParameter, observables
from braket.parametric import FreeParameter

theta = FreeParameter("theta")
phi = FreeParameter("phi")
circ = Circuit().h(0).rx(0, phi).ry(0, phi).cnot(0, 1).xx(0, 1, theta)
```

## 随伴勾配
<a name="braket-result-types-adjoint-gradient"></a>

SV1 デバイスは、多項ハミルトニアンを含む、オブザーバブルの期待値の随伴勾配を計算します。パラメータを区別するには、名前 (文字列形式) または直接参照で指定します。

```
from braket.aws import AwsDevice
from braket.devices import Devices

device = AwsDevice(Devices.Amazon.SV1)

circ.adjoint_gradient(observable=3 * Observable.Z(0) @ Observable.Z(1) - 0.5 * observables.X(0), parameters = ["phi", theta])
```

固定パラメータ値を引数としてパラメータ化された回路に渡すと、自由パラメータが削除されます。この回路を `AdjointGradient` で実行すると、自由パラメータが存在しなくなっているため、エラーが発生します。次のコード例は、正しい使用方法と誤った使用方法を示しています。

```
# Will error, as no free parameters will be present
#device.run(circ(0.2), shots=0)

# Will succeed
device.run(circ, shots=0, inputs={'phi': 0.2, 'theta': 0.2})
```