メインコンテンツへスキップ

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、ジョブ実行モードに対してそれぞれ batchsession、または 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}

次のステップ

おすすめ