Estimator クイックスタート
Estimator プリミティブは、量子回路によって準備された状態に関して、1 つまたは複数のオブザーバブルの期待値を計算します。パラメーター値も入力として提供される限り、回路はパラメーター化されていても構いません。
このプリミティブには、ダイナミカル・デカップリング、Pauli ツワーリング、ゲート・フォールディング ZNE、PEA、PEC など、いくつかの組み込みのエラー緩和と抑制技術があります。また、コストと精度のトレードオフを簡単に設定できる resilience_level オプションもサポートしています。
このトピックのステップでは、Estimator のセットアップ方法、設定に使用できるオプション、およびプログラムでの呼び出し方法を説明します。
パッケージ・バージョン
このページのコードは、以下の要件を使用して開発されました。 これらのバージョン以降の使用をお勧めします。
qiskit[all]~=2.4.0
qiskit-ibm-runtime~=0.46.1
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime
```json
{/*Verified the v2 examples 2/29/24 - updated 10/29/24*/}
## Estimator プリミティブを使用するステップ \{#steps-to-use-the-estimator-primitive}
### 1. アカウントの初期化 \{#1-initialize-the-account}
Qiskit Runtime はマネージド・サービスであるため、まずアカウントを初期化する必要があります。その後、期待値の計算に使用する QPU を選択できます。
アカウントをまだセットアップしていない場合は、[IBM Cloud アカウントのセットアップ](cloud-setup)の手順に従ってください。
:::note[分数ゲート]
新しくサポートされた[分数ゲート](/guides/fractional-gates)を使用するには、`QiskitRuntimeService` インスタンスから Backend を要求する際に `use_fractional_gates=True` を設定します。例:
```python
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)
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()}")
>>> Circuit ops (ISA): OrderedDict([('rz', 4472), ('sx', 1884), ('cz', 1120)])
3. Qiskit Runtime Estimator の初期化
Estimator を初期化するときは、mode パラメーターを使用して実行するモードを指定します。可能な値は、バッチ、Session、ジョブ実行モードに対してそれぞれ batch、session、または backend オブジェクトです。詳細については、Qiskit Runtime 実行モードの概要を参照してください。なお、オープン・プランのユーザーは Session ジョブを送信できません。
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()}")
>>> Job ID: d82869ntjchs73bnokog
>>> Job Status: QUEUED
result = job.result()
print(f">>> {result}")
print(f" > Expectation value: {result[0].data.evs}")
print(f" > Metadata: {result[0].metadata}")
>>> 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: 30.60337496305257
> Metadata: {'shots': 4096, 'target_precision': 0.015625, 'circuit_metadata': {}, 'resilience': {}, 'num_randomizations': 32}
次のステップ
- 量子コンピューターで実行する前にローカルでテストする方法を学びます。
- 詳細な例を確認します。
- IBM Quantum Learning のコスト関数レッスンを通じてプリミティブを練習します。
- トランスパイルセクションでローカル・トランスパイルの方法を学びます。
- トランスパイラー設定の比較ガイドを試してみてください。
- プリミティブ・オプションの使用方法を学びます。
- Estimator オプションの API を参照します。
- V2 プリミティブへの移行を読みます。