プリミティブを使ってみる
新しい実行モデルのベータリリースが利用可能になりました。指向型実行モデルは、エラー緩和ワークフローをカスタマイズする際の柔軟性を高めます。詳 細については、指向型実行モデルガイドを参照してください。
このドキュメントではQiskit Runtimeのプリミティブを使用しており、IBM®のバックエンドを利用できます。ただし、代わりにバックエンドプリミティブを使用することで、任意のプロバイダーでプリミティブを実行できます。また、リファレンスプリミティブを使用してローカルの状態ベクトルシミュレーター上で実行することも可能です。詳細については、Qiskitプリミティブによる厳密なシミュレーションを参照してください。
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-ibm-runtime
このトピックの手順では、プリミティブのセットアップ方法、設定に使用できるオプションの確認、およびプログラム内での呼び出し方法について説明します。
新しくサポートされたフラクショナルゲートを使用するには、QiskitRuntimeServiceインスタンスからバックエンドを要求する際にuse_fractional_gates=Trueを設定します。例えば:
service = QiskitRuntimeService()
fractional_gate_backend = service.least_busy(use_fractional_gates=True)
これは実験的な機能であり、将来変更される 可能性があることに注意してください。
パッケージのバージョン
このページのコードは以下の要件を使用して開発されました。 これらのバージョン以降の使用を推奨します。
qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1
Estimatorを使ってみる
1. アカウントの初期化
Qiskit Runtime EstimatorはマネージドサービスであるためEstimatorはマネージドサービスであるため、まずアカウントを初期化する必要があります。その後、期待値の計算に使用するQPUを選択できます。
アカウントをまだ持っていない場合は、インストールとセットアップのトピックの手順に従ってください。
from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()
backend = service.least_busy(
operational=True, simulator=False, min_num_qubits=127
)
print(backend.name)
ibm_torino
2. Circuit(回路)とオブザーバブルの作成
Estimatorプリミティブへの入力として、少なくとも1つのCircuitと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]
print(f">>> Observable: {observable.paulis}")
>>> Observable: ['IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...',
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...', ...]
CircuitとオブザーバブルはQPUがサポートする命令のみを使用するように変換する必要があります(*命令セットアーキテクチャ(ISA)*回路と呼ばれます)。これにはTranspilerを使用します。
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', 3826), ('sx', 1601), ('cz', 968)])