Estimator クイックスタート
Estimatorプリミティブは、量子回路によって生成された状態に関して、1つまたは複数の観測量の期待値を計算します。 パラメータ値がプリミティブへの入力としても指定されている限り、回路をパラメータ化することができます。
このプリミティブには、動的デカップリング、パウリ・トゥワーリング、ゲート・フォールディングZNE、PEA、PECなど、いくつかの組み込みのエラー軽減および抑制手法が備わっています。 また、コストと精度のバランスを簡単に調整できるオプション resilience_level もサポートしています。
このトピックの手順では、Estimator のセットアップ方法、設定に使用できるオプションの確認方法、およびプログラム内での呼び出し方法について説明します。
このページのコードは、以下の要件に基づいて開発されました。 これらのバージョン以降のご利用をお勧めします。
qiskit[all]~=2.5.1 qiskit-ibm-runtime~=0.47.0
「Estimator」プリミティブの使用手順
1. アカウントを初期化する
まず、アカウントを初期化する必要があります。 その後、期待値の計算に使用するQPUを選択できます。
まだアカウントをお持ちでない場合は、「 IBM Cloud アカウントの設定」の手順に従ってください。
新たにサポートされたフラクショナル・ゲートを使用するには、インスタンス QiskitRuntimeService からバックエンドをリクエストする際に を use_fractional_gates=True 設定してください。 例:
service = QiskitRuntimeService()
fractional_gate_backend = service.least_busy(use_fractional_gates=True)これは実験的な機能であり、今後変更される可能性があります。
from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()
backend = service.least_busy(
operational=True, simulator=False, min_num_qubits=127
)
print(backend.name)Output:
ibm_fez
2. 回路と観測可能変数を作成する
Estimatorプリミティブへの入力として、少なくとも1つの回路と1つの観測変数が必要です。
from qiskit.circuit.library import qaoa_ansatz
from qiskit.quantum_info import SparsePauliOp
entanglement = [tuple(edge) for edge in backend.coupling_map.get_edges()]
observable = SparsePauliOp.from_sparse_list(
[("ZZ", [i, j], 0.5) for i, j in entanglement],
num_qubits=backend.num_qubits,
)
circuit = qaoa_ansatz(observable, reps=2)
# The circuit is parametrized, so we will define the parameter values for execution
param_values = [0.1, 0.2, 0.3, 0.4]回路と観測量は、QPUがサポートする命令のみを使用するように変換する必要があります( これは命令セットアーキテクチャ(ISA) 回路と呼ばれます)。 これを行うには、トランスパイラーを使用してください。
from qiskit.transpiler import generate_preset_pass_manager
pm = generate_preset_pass_manager(optimization_level=1, backend=backend)
isa_circuit = pm.run(circuit)
isa_observable = observable.apply_layout(isa_circuit.layout)
print(f">>> Circuit ops (ISA): {isa_circuit.count_ops()}")Output:
>>> Circuit ops (ISA): OrderedDict([('rz', 4472), ('sx', 1884), ('cz', 1120)])
3. IBM Quantum 推定器を初期化する
Estimator を初期化する際は、 mode パラメータを使用して、実行したいモードを指定してください。 取り得る値は batch、バッチ実行モード、セッション実行モード、ジョブ実行モードに対して、それぞれ、 session、または backend オブジェクトです。 詳細については、 「 IBM Quantum Compute Service の実行モードの概要」 を参照してください なお、Open Planのユーザーはセッションジョブを送信することはできません。
from qiskit_ibm_runtime import EstimatorV2 as Estimator
estimator = Estimator(mode=backend)4. Estimatorを実行して結果を取得する
次に、この run() メソッドを呼び出して、入力回路および観測量の期待値を計算します。 回路、観測可能パラメータ、およびオプションのパラメータ値のセットは*、プリミティブ統一ブロック* ( PUB )のタプルとして入力されます。
job = estimator.run([(isa_circuit, isa_observable, param_values)])
print(f">>> Job ID: {job.job_id()}")
print(f">>> Job Status: {job.status()}")Output:
>>> Job ID: d9mq9tnurbec73e67aj0
>>> Job Status: QUEUED
result = job.result()
print(f">>> {result}")
print(f" > Expectation value: {result[0].data.evs}")
print(f" > Metadata: {result[0].metadata}")Output:
>>> PrimitiveResult([PubResult(data=DataBin(evs=np.ndarray(<shape=(), dtype=float64>), stds=np.ndarray(<shape=(), dtype=float64>), ensemble_standard_error=np.ndarray(<shape=(), dtype=float64>)), metadata={'shots': 4096, 'target_precision': 0.015625, 'circuit_metadata': {}, 'resilience': {}, 'num_randomizations': 32})], metadata={'dynamical_decoupling': {'enable': False, 'sequence_type': 'XX', 'extra_slack_distribution': 'middle', 'scheduling_method': 'alap'}, 'twirling': {'enable_gates': False, 'enable_measure': True, 'num_randomizations': 'auto', 'shots_per_randomization': 'auto', 'interleave_randomizations': True, 'strategy': 'active-accum'}, 'resilience': {'measure_mitigation': True, 'zne_mitigation': False, 'pec_mitigation': False}, 'version': 2})
> Expectation value: 29.745702323497138
> Metadata: {'shots': 4096, 'target_precision': 0.015625, 'circuit_metadata': {}, 'resilience': {}, 'num_randomizations': 32}
次のステップ
- 量子コンピュータで実行する前に、 ローカル環境でテストする方法をご紹介します。
- 具体的な例を確認してください。
- IBM Quantum Learning の「 Cost関数 」のレッスンに取り組んで、プリミティブ型の扱い方を練習しましょう。
- 「トランスパイル 」のセクションで、ローカルでのトランスパイル方法について学びましょう。
- 「トランスパイラ設定の比較」 ガイドをお試しください。
- プリミティブ・オプションの使い方を学びましょう。
- 「Estimator 」のオプションに関するAPIを参照してください。