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

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

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

يتضمن هذا الـ primitive عدة تقنيات مضمَّنة لـ تخفيف الأخطاء وتثبيطها, بما فيها الفصل الديناميكي، وتدوير Pauli، وتدوير البوابات ZNE، وPEA، وPEC. كما يدعم خيار resilience_level الذي يتيح لك ضبط توازن التكلفة والدقة بسهولة. توضح الخطوات في هذا الموضوع كيفية إعداد Estimator، واستكشاف الخيارات التي يمكنك استخدامها لتهيئته، واستدعائه في برنامج.

إصدارات الحزم

تم تطوير الكود في هذه الصفحة باستخدام المتطلبات التالية. نوصي باستخدام هذه الإصدارات أو أحدث.

qiskit[all]~=2.5.2
qiskit-ibm-runtime~=0.47.0
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime

خطوات استخدام Estimator primitive​

1. تهيئة الحساب​

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

اتبع الخطوات في إعداد حساب IBM Cloud الخاص بك إن لم يكن لديك حساب بعد.

البوابات الكسرية

لاستخدام البوابات الكسرية المدعومة حديثًا، اضبط use_fractional_gates=True عند طلب Backend من نسخة QiskitRuntimeService. على سبيل المثال:

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. تهيئة IBM Quantum Estimator​

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

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: dab7lfurrl7c7386gjn0
>>> 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: 28.60306448415693
> Metadata: {'shots': 4096, 'target_precision': 0.015625, 'circuit_metadata': {}, 'resilience': {}, 'num_randomizations': 32}

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

توصيات