Japanese
言語
English
Japanese
Spanish

アルゴリズムにおける期待値の計算

Estimator プリミティブは、期待値を計算するアルゴリズムを設計するために使用されます。

背景

Estimator プリミティブの役割は 2 つあります: 量子デバイスまたはシミュレータへの エントリーポイント として機能し、Backend インターフェイス (一般に backend.run( ) )を置き換えます。さらに、これは期待値計算の アルゴリズムによる抽象化 であるため、最終的な期待値回路を手動で構築する必要はありません。 これにより、コードの複雑さが大幅に軽減され、アルゴリズム設計がよりコンパクトになります。

注釈

Backend.run() モデル: このモデルでは、 qiskit-ibmq-provider モジュール (現在は qiskit-ibm-provider に移行されています) を使用して、実際のバックエンドとリモートシミュレーターにアクセスします。 ローカル シミュレーションを実行するには、 qiskit-aer から特定のバックエンドをインポートできます。 それらはすべて backend.run() インターフェイスに従います。

Code example for qiskit-ibmq-provider & backend.run()
from qiskit import IBMQ

# Select provider
provider = IBMQ.get_provider(hub="ibm-q", group="open", project="main")

# Get backend
backend = provider.get_backend("ibmq_qasm_simulator") # cloud simulator

# Run
result = backend.run(expectation_circuits)

Code example for qiskit-aer & backend.run()
from qiskit_aer import AerSimulator # former import: from qiskit import Aer

# Get local simulator backend
backend = AerSimulator()

# Run
result = backend.run(expectation_circuits)

プリミティブ・モデル: qiskit-ibm-runtime プリミティブ ( SamplerEstimator ) を介して実際のバックエンドとリモート シミュレーターにアクセスします。 ローカル シミュレーションを実行するには、 qiskit_aer.primitives および qiskit.primitives から特定の ローカル プリミティブをインポートできます。 それらはすべて BaseSampler および BaseEstimator インターフェースに従いますが、 Runtime プリミティブのみが、Runtime サービス、セッション、および組み込みのエラー軽減策へのアクセスを提供します

Code example for Runtime Estimator
from qiskit_ibm_runtime import QiskitRuntimeService, Estimator

# Define service
service = QiskitRuntimeService()

# Get backend
backend = service.backend("ibmq_qasm_simulator") # cloud simulator

# Define Estimator
estimator = Estimator(backend=backend)

# Run Expectation value calculation
result = estimator.run(circuits, observables).result()

Code example for Aer Estimator
from qiskit_aer import Estimator

# Get local simulator Estimator
estimator = Estimator()

# Run expectation value calculation
result = estimator.run(circuits, observables).result()

あなたのコードが以前に backend.run() を使って期待値を計算した場合、オペレータと状態関数を処理するために qiskit.opflow モジュールを使用した可能性が最も高いでしょう。 このシナリオをサポートするために、次の移行例は (qiskit.opflowbackend.run()) ワークフローを Estimator ベースのワークフローに置き換える方法を示しています。

エンド・ツー・エンドの例

1. 問題定義

ある演算子に対する量子状態(回路)の期待値を計算したい。 この例では、H2 分子と任意の回路を量子状態として使用しています。

from qiskit import QuantumCircuit
from qiskit.quantum_info import SparsePauliOp

# Step 1: Define operator
op = SparsePauliOp.from_list(
    [
        ("II", -1.052373245772859),
        ("IZ", 0.39793742484318045),
        ("ZI", -0.39793742484318045),
        ("ZZ", -0.01128010425623538),
        ("XX", 0.18093119978423156),
    ]
)

# Step 2: Define quantum state
state = QuantumCircuit(2)
state.x(0)
state.x(1)

1.a. [Legacy] 問題を opflow に変換

qiskit.opflow は演算子と量子状態の両方を表す独自のクラスを提供したため、上で定義した問題は次のようにラップされます。

from qiskit.opflow import CircuitStateFn, PauliSumOp

opflow_op = PauliSumOp(op)
opflow_state = CircuitStateFn(state)

Primitive を使用する場合、この手順は不要になります。

注釈

qiskit.opflow から移行する手順については、opflow 移行ガイド を参照してください。

2. 実デバイスまたはクラウドシミュレーターで期待値を計算する

2.a. [Legacy] opflowbackend.run() を使用する

従来のワークフローでは、期待値を計算するために多くのステップが必要でした:

注釈

ibmq_qasm_simulator をデバイス名に置き換えて、実際のデバイスの完全なワークフローを確認してください。

from qiskit.opflow import StateFn, PauliExpectation, CircuitSampler
from qiskit import IBMQ

# Define the state to sample
measurable_expression = StateFn(opflow_op, is_measurement=True).compose(opflow_state)

# Convert to expectation value calculation object
expectation = PauliExpectation().convert(measurable_expression)

# Define provider and backend
provider = IBMQ.get_provider(hub="ibm-q", group="open", project="main")
backend = provider.get_backend("ibmq_qasm_simulator")

# Inject backend into circuit sampler
sampler = CircuitSampler(backend).convert(expectation)

# Evaluate
expectation_value = sampler.eval().real
>>> print("expectation: ", expectation_value)
expectation:  -1.065734058826613

2.b [New] Estimator Runtime primitiveを使用する

Estimator はユーザーサイドの構文を簡素化し、アルゴリズム設計に便利なツールです。

注釈

ibmq_qasm_simulator をデバイス名に置き換えて、実際のデバイスの完全なワークフローを確認してください。

from qiskit_ibm_runtime import QiskitRuntimeService, Estimator

service = QiskitRuntimeService(channel="ibm_quantum")
backend = service.backend("ibmq_qasm_simulator")

estimator = Estimator(backend=backend)

expectation_value = estimator.run(state, op).result().values

Estimator はバッチによる評価を行うことができるため、値のリストを返すことに注意してください。

>>> print("expectation: ", expectation_value)
expectation:  [-1.06329149]

Estimator Runtime プリミティブは一連の機能とチューニング・オプションを提供します。これらのオプションには移行元のレガシーな代替手段はありませんが、パフォーマンスと結果を改善するのに役立ちます。 詳細については、次を参照してください。

3. その他の実行代替 ( 実行時以外 )

このセクションでは、非Runtimeプリミティブを使用し、ローカル シミュレーションを使用してアルゴリズムをテストする方法について説明します。 上で定義した問題をローカル状態ベクトル・シミュレーションで解決するとします。

3.a [Legacy] Qiskit Aer シミュレーターの使用

from qiskit.opflow import StateFn, PauliExpectation, CircuitSampler
from qiskit_aer import AerSimulator

# Define the state to sample
measurable_expression = StateFn(opflow_op, is_measurement=True).compose(opflow_state)

# Convert to expectation value calculation object
expectation = PauliExpectation().convert(measurable_expression)

# Define statevector simulator
simulator = AerSimulator(method="statevector", shots=100)

# Inject backend into circuit sampler
circuit_sampler = CircuitSampler(simulator).convert(expectation)

# Evaluate
expectation_value = circuit_sampler.eval().real
>>> print("expectation: ", expectation_value)
expectation:  -1.0636533500290943

3. b . [New] 参照 Estimator` ` または Aer ``Estimator プリミティブの使用

Reference Estimator は、 qiskit.quantum_info モジュール内の Statevector クラスに基づいて、正確またはショット・ベースのノイズ・シミュレーションを実行することができます。

from qiskit.primitives import Estimator

estimator = Estimator()

expectation_value = estimator.run(state, op).result().values

# for shot-based simulation:
expectation_value = estimator.run(state, op, shots=100).result().values
>>> print("expectation: ", expectation_value)
expectation:  [-1.03134297]

専用の Estimator を介して Aer Simulator に引き続きアクセスできます。 これは、ノイズ モデルでシミュレーションを実行する場合に便利です。 この例では、3.a の結果と一致するようにシミュレーション メソッドが更新されています。

from qiskit_aer.primitives import Estimator # import change!!!

estimator = Estimator(run_options= {"method": "statevector"})

expectation_value = estimator.run(state, op, shots=100).result().values
>>> print("expectation: ", expectation_value)
expectation:  [-1.06365335]

Aer プリミティブの使用に関する詳細については、 VQEチュートリアル を参照してください。

ランタイム・プリミティブ を使用してノイズの多いシミュレーションを実行する方法の詳細については、この トピック を参照してください。