結果タイプ - Amazon Braket

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

結果タイプ

Amazon Braket は、 を使用して回路を測定すると、さまざまなタイプの結果を返すことができますResultType。回路は次のタイプの結果を返すことができます。

  • AdjointGradient は、指定されたオブザーバブルの期待値の勾配 (ベクトル派生) を返します。このオブザーバビリティは、結合区別方法を使用して、指定されたパラメータに関して指定されたターゲットで動作します。このメソッドは、shots=0 の場合にのみ使用できます。

  • Amplitude は、出力ウェーブ関数で指定された量子状態の振幅を返します。これは、 SV1およびローカルシミュレーターでのみ使用できます。

  • Expectation は、特定のオブザーバビリティの期待値を返します。この値は、この章で後ほど紹介した Observable クラスで指定できます。オブザーバブルの測定qubitsに使用されるターゲットを指定する必要があります。また、指定されたターゲットの数は、オブザーバブルが動作する の数qubitsと等しくなければなりません。ターゲットを指定しない場合、オブザーバブルは 1 でのみ動作qubitし、すべての に並行qubitsして適用されます。

  • Probability は、計算基準の状態を測定する確率を返します。ターゲットが指定されていない場合、Probability はすべての基底状態を測定する確率を返します。ターゲットが指定されている場合、指定されたベースベクトルのわずかな確率のみqubitsが返されます。

  • 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

Rigetti

IonQ

OQC

結合グラデーション

N

Y

N

N

N

N

N

Amplitude

Y

Y

N

N

N

N

N

期待

Y

Y

Y

Y

Y

Y

Y

見込み

Y

Y

Y

N

Y*

Y

Y

低密度マトリックス

Y

N

Y

N

N

N

N

状態ベクトル

Y

N

N

N

N

N

N

サンプル

Y

Y

Y

Y

Y

Y

Y

分散

Y

Y

Y

Y

Y

Y

Y

注記

* は、最大 40 の確率結果タイプRigettiのみをサポートしますqubits。

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

device = AwsDevice("arn:aws:braket:us-west-1::device/qpu/rigetti/Aspen-M-3") # print the result types supported by this device for iter in device.properties.action['braket.ir.jaqcd.program'].supportedResultTypes: print(iter)
name='Sample' observables=['x', 'y', 'z', 'h', 'i'] minShots=10 maxShots=100000 name='Expectation' observables=['x', 'y', 'z', 'h', 'i'] minShots=10 maxShots=100000 name='Variance' observables=['x', 'y', 'z', 'h', 'i'] minShots=10 maxShots=100000 name='Probability' observables=None minShots=10 maxShots=100000

を呼び出すにはResultType、次の例に示すように、回路に追加します。

from braket.circuits import 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や など) を提供するデバイスもありますOQC。SDK は結果に測定プロパティを提供しますが、確率を返すデバイスについては、計算後に行われます。したがって、 IonQや によって提供されるようなデバイスはOQC、ショットごとの測定値が返されないため、確率によって決定された測定値を持ちます。このファイル に示すように、結果オブジェクトmeasurements_copied_from_deviceで を表示することで、結果がポストコンピューティングされているかどうかを確認できます。

オブザーバブル

Amazon Braket には、測定するオブザーバブルを指定するために使用できる Observable クラスが含まれています。

各 には、最大 1 つの一意の非 ID オブザーバブルを適用できますqubit。同じ に 2 つ以上の異なる非 ID オブザーバビリティを指定するとqubit、エラーが表示されます。この目的のために、テンソル製品の各要素は個々のオブザーバビリティとしてカウントされるため、同じ で動作する複数のテンソル製品を持つことは許可されます。ただしqubit、その で動作する要素qubitが同じである場合に限ります。

オブザーバブルをスケーリングし、オブザーバブル (スケーリングの有無にかかわらず) を追加することもできます。これにより、AdjointGradient結果タイプSumで使用できる が作成されます。

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

Observable.I() Observable.H() Observable.X() Observable.Y() Observable.Z() # get the eigenvalues of the observable print("Eigenvalue:", Observable.H().eigenvalues) # or whether to rotate the basis to be computational basis print("Basis rotation gates:",Observable.H().basis_rotation_gates) # get the tensor product of 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()) # also 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, Observable theta = FreeParameter("theta") phi = FreeParameter("phi") circ = Circuit().h(0).rx(0, phi).ry(0, phi).cnot(0, 1).xx(0, 1, theta) circ.adjoint_gradient(observable=Observable.Z() @ Observable.Z(), target=[0, 1], parameters = ["phi", theta]

区別するパラメータには、名前 (文字列) または直接参照を使用して指定します。AdjointGradient 結果タイプを使用した勾配の計算は、観測可能な の期待値に関して行われることに注意してください。

注: パラメータ化された回路に引数として渡して空きパラメータの値を修正した場合、結果タイプAdjointGradientとして とパラメータを指定して回路を実行するとエラーが発生します。これは、 との区別に使用しているパラメータが存在しないためです。次の例を参照してください。

device.run(circ(0.2), shots=0) # will error, as no free parameters will be present device.run(circ, shots=0, inputs={'phi'=0.2, 'theta'=0.2) # will succeed