البداية السريعة مع Estimator
يحسب Estimator primitive قيم التوقع لمراقب واحد أو أكثر بالنسبة للحالات المُعدَّة بواسطة الدوائر الكمية. يمكن أن تكون الدوائر ذات معاملات، طالما أن قيم المعاملات مُقدَّمة أيضًا كمدخل للـ primitive.
يتضمن هذا الـ primitive عدة تقنيات مضمَّنة لـ تخفيف الأخطاء وتثبيطها, بما فيها فك الاقتران الديناميكي، وتفتيل Pauli (Pauli twirling)، وZNE بطي البوابات (gate-folding ZNE)، وPEA، وPEC. كما يدعم خيار resilience_level الذي يتيح لك ضبط توازن التكلفة والدقة بسهولة.
توضح الخطوات في هذا الموضوع كيفية إعداد Estimator، واستكشاف الخيارات التي يمكنك استخدامها لتهيئته، واستدعائه في برنامج.
تم تقديم تطبيقات جديدة لواجهتي Qiskit SamplerV2 وEstimatorV2 في qiskit-ibm-runtime الإصدار v0.50.0. تقوم هذه الـ primitives من جانب العميل بمعظم عمليات المعالجة المسبقة واللاحقة على جانب العميل، وتفوض التنفيذ إلى primitive الخاص بـ Executor. يوفر التشغيل على جانب العميل شفافية أكبر، واستجابة أسرع لتصحيح الأخطاء، وتحكماً أدق.
نظراً لأنها تطبق نفس واجهة API، فإن هذه الـ primitives من جانب العميل هي في معظمها بدائل جاهزة للاستخدام محل primitives القديمة من جانب الخادم، ولا يلزم سوى تغيير عبارة الاستيراد. راجع الترحيل من Sampler وEstimator من جانب الخادم إلى جانب العميل لمزيد من المعلومات.
إصدارات الحزم
تم تطوير الكود في هذه الصفحة باستخدام المتطلبات التالية. نوصي باستخدام هذه الإصدارات أو أحدث.
qiskit[all]~=2.5.2
qiskit-ibm-runtime~=0.47.0
خطوات استخدام Estimator primitive
1. تهيئة الحساب
تحتاج أولاً إلى تهيئة حسابك. يمكنك بعد ذلك اختيار وحدة المعالجة الكمية (QPU) التي تريد استخدامها لحساب قيمة التوقع.
اتبع الخطوات في إعداد حساب IBM Cloud الخاص بك إن لم يكن لديك حساب بعد.
لاستخدام البوابات الكسرية المدعومة حديثًا، اضبط use_fractional_gates=True عند طلب Backend من نسخة QiskitRuntimeService. على سبيل المثال:
service = QiskitRuntimeService()
fractional_gate_backend = service.least_busy(use_fractional_gates=True)
هذه ميزة تجريبية وقد تتغير في المستقبل.
# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util
_needed = {"qiskit": "qiskit", "qiskit_ibm_runtime": "qiskit-ibm-runtime"}
_missing = [pip for module, pip in _needed.items()
if importlib.util.find_spec(module) is None]
# One at a time, so a package that fails to install does not block the others
for _pip in _missing:
%pip install -q {_pip}
if not _missing:
print("\u2713 All required packages are installed")
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. لاحظ أن مستخدمي الخطة المجانية لا يمكنهم إرسال مهام جلسات.
# Legacy server-side primitive before qiskit-ibm-runtime 0.50.0
# from qiskit_ibm_runtime import Estimator
# Client-side primitive introduced in qiskit-ibm-runtime 0.50.0
from qiskit_ibm_runtime.executor_estimator import 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}
الخطوات التالية
- تعرَّف على كيفية الاختبار محليًا قبل التشغيل على الحواسيب الكمية.
- راجع أمثلة تفصيلية.
- تدرَّب على الـ Primitives من خلال درس دالة التكلفة في IBM Quantum Learning.
- تعرَّف على كيفية إجراء الـ Transpile محليًا في قسم الـ Transpile.
- جرِّب دليل مقارنة إعدادات الـ Transpiler.
- تعرَّف على كيفية استخدام خيارات الـ Primitive.
- اطَّلع على API لخيارات Estimator.