アルゴリズムにおける期待値の計算¶
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
プリミティブ ( Sampler
と Estimator
) を介して実際のバックエンドとリモート シミュレーターにアクセスします。 ローカル シミュレーションを実行するには、 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.opflow
と backend.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] opflow
と backend.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チュートリアル を参照してください。
ランタイム・プリミティブ を使用してノイズの多いシミュレーションを実行する方法の詳細については、この トピック を参照してください。