結果タイプのリスト - Amazon Braket

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

結果タイプのリスト

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 ファイルを参照してください。

オブザーバブル

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)))

パラメータ

回路には自由パラメータを組み込むことができます。これらの自由パラメータは、勾配の計算に使用でき、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)

随伴勾配

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})