انتقل إلى المحتوى الرئيسي

البداية السريعة مع Estimator

يحسب Estimator primitive قيم التوقع لمراقب واحد أو أكثر بالنسبة للحالات المُعدَّة بواسطة الـ Circuits الكمية. يمكن أن تكون الـ Circuits ذات معاملات، طالما أن قيم المعاملات مُقدَّمة أيضًا كمدخل للـ primitive.

يتضمن هذا الـ primitive عدة تقنيات مضمَّنة لـ تخفيف الأخطاء وتثبيطها، بما فيها الفصل الديناميكي، وتدوير 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 primitive \{#steps-to-use-the-estimator-primitive}

### 1. تهيئة الحساب \{#1-initialize-the-account}

بما أن Qiskit Runtime خدمة مُدارة، تحتاج أولاً إلى تهيئة حسابك. يمكنك بعد ذلك اختيار وحدة المعالجة الكمية (QPU) التي تريد استخدامها لحساب قيمة التوقع.

اتبع الخطوات في [إعداد حساب IBM Cloud الخاص بك](cloud-setup) إن لم يكن لديك حساب بعد.

:::note[البوابات الكسرية]

لاستخدام [البوابات الكسرية](/guides/fractional-gates) المدعومة حديثًا، اضبط `use_fractional_gates=True` عند طلب Backend من نسخة `QiskitRuntimeService`. على سبيل المثال:
```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 primitive.

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]

يجب تحويل الـ دائرة والمراقب ليستخدما فقط التعليمات المدعومة من قِبَل وحدة المعالجة الكمية (المُشار إليها بـ دوائر مجموعة تعليمات المعمارية (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', 4472), ('sx', 1884), ('cz', 1120)])

3. تهيئة Qiskit Runtime Estimator

عند تهيئة Estimator، استخدم المعامل mode لتحديد الوضع الذي تريده أن يعمل فيه. القيم الممكنة هي batch أو session أو كائنات backend لأوضاع تنفيذ الدُّفعة والجلسة والمهمة على التوالي. لمزيد من المعلومات، راجع مقدمة إلى أوضاع تنفيذ Qiskit Runtime. لاحظ أن مستخدمي الخطة المجانية لا يمكنهم إرسال مهام جلسات.

from qiskit_ibm_runtime import EstimatorV2 as Estimator

estimator = Estimator(mode=backend)

4. استدعاء Estimator والحصول على النتائج

بعد ذلك، استدعِ الطريقة run() لحساب قيم التوقع للـ Circuits والمراقبات المُدخَلة. تُدخَل الـ دائرة والمراقب ومجموعات قيم المعاملات الاختيارية كصفوف كتلة موحدة للـ Primitive (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}

الخطوات التالية

توصيات