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

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

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

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

qiskit[all]~=2.4.0
qiskit-ibm-runtime~=0.46.1
samplomatic~=0.18.0
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime samplomatic

على غرار Sampler primitive، يأخذ Executor عينات من سجلات الإخراج من تنفيذ الـ دائرة الكمية، لكنه لا يتضمن أي تثبيط أو تخفيف مضمَّن للأخطاء. بدلاً من ذلك، فهو جزء من نموذج التنفيذ الموجَّه الذي يوفر المكونات اللازمة لالتقاط نوايا التصميم على جانب العميل، وينقل العبء المكلِّف لتوليد متغيرات الـ دائرة إلى جانب الخادم. يتبع Executor التوجيهات المُقدَّمة في تعليقات الـ دائرة والخيارات، ويولِّد قيم المعاملات ويربطها، وينفِّذ الـ Circuits المرتبطة على الأجهزة، ويُعيد نتائج التنفيذ والبيانات الوصفية. لا يتخذ أي قرارات ضمنية نيابةً عنك ويمنحك تحكمًا كاملاً وشفافية.

ملاحظة

حزمة Qiskit لا تمتلك بعد فئة أساسية لـ Executor primitive.

قبل البدء

بعض أمثلة الكود في هذه الصفحة تستخدم samplex، وهو جزء من حزمة Samplomatic. لذلك، قبل تشغيل تلك الكتل البرمجية، يجب تثبيت Samplomatic كما هو موضح في الكتلة البرمجية التالية. لمزيد من المعلومات، راجع وثائق Samplomatic.

pip install samplomatic

# For visualization support, include the visualization dependencies.
# pip install samplomatic[vis]

خطوات استخدام Executor primitive

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

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

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

from qiskit_ibm_runtime import QiskitRuntimeService, Executor
from qiskit_ibm_runtime.quantum_program import QuantumProgram
from qiskit.circuit import QuantumCircuit
from qiskit.transpiler import generate_preset_pass_manager
from samplomatic.transpiler import generate_boxing_pass_manager
from samplomatic import build

# Initialize the service and choose a backend
service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)
print(backend)
<IBMBackend('ibm_fez')>

2. إنشاء دائرة وعمل الـ Transpile

تحتاج إلى دائرة واحدة على الأقل لاستخدام Executor primitive. يمكن أن تحتوي اختياريًا على معاملات.

# Generate the circuit
circuit = QuantumCircuit(2)
circuit.h(0)
circuit.h(1)
circuit.cz(0, 1)
circuit.h(1)

# Using `measure_all` automatically creates the necessary
# classical registers.
circuit.measure_all()

يجب تحويل الـ دائرة لتستخدم فقط التعليمات المدعومة من قِبَل وحدة المعالجة الكمية (المُشار إليها بـ دوائر مجموعة تعليمات المعمارية (ISA)). استخدم الـ Transpiler للقيام بذلك.

# Transpile the circuit
preset_pass_manager = generate_preset_pass_manager(
backend=backend, optimization_level=0
)
isa_circuit = preset_pass_manager.run(circuit)

3. تهيئة QuantumProgram

هيِّئ QuantumProgram مع حمل العمل الخاص بك. يتكون QuantumProgram من QuantumProgramItems. عادةً ما يتضمن كل عنصر Circuit ومجموعة قيم معاملات وربما samplex لعشوائية محتوى الـ دائرة. للاطلاع على التفاصيل الكاملة، راجع مدخلات ومخرجات Executor.

الخلية التالية تُهيِّئ QuantumProgram وتُحدِّد إجراء 25 تشغيلاً. بعد ذلك، تُلحِق الـ دائرة المستهدفة بعد الـ Transpile.

# Initialize an empty program
program = QuantumProgram(shots=25)

# Append the circuit to the program
program.append_circuit_item(isa_circuit)

4. اختياري: تجميع البوابات والقياسات في صناديق مُعلَّقة

تجميع التعليمات في صناديق وتعليقها هو الطريقة الأساسية لتحديد نيتك. في المثال التالي، نستخدم generate_boxing_pass_manager ومعاملات التدوير الخاصة به لتجميع بوابات ثنائية الـ qubit والقياسات في صناديق وتطبيق تعليق التدوير.

# Generate a boxing pass manager to group gates
# and measurements into boxes and add
# a`Twirl` annotation.
boxes_pm = generate_boxing_pass_manager(
# Add gate twirling
enable_gates=True,
# Add measurement twirling
enable_measures=True,
)

boxed_circuit = boxes_pm.run(isa_circuit)
boxed_circuit.draw("mpl", idle_wires=False)

Output of the previous code cell

5. اختياري: بناء دائرة نموذجية وsamplex وإضافتهما إلى البرنامج

بعد ذلك، استخدم طريقة build في Samplomatic لتوليد زوج الـ دائرة النموذجية و_samplex_. الـ دائرة النموذجية مكافئة هيكليًا للـ دائرة الأصلية. غير أن بواباتها أحادية الـ qubit تُستبدَل ببوابات ذات معاملات لتطبيق التعليقات المُوصوفة (تدوير البوابات والقياسات في هذا المثال). يُرمِّز الـ samplex جميع المعلومات المطلوبة لتوليد معاملات عشوائية للـ دائرة النموذجية.

بعد توليد زوج الـ دائرة النموذجية والـ samplex، استخدم الطريقة append_samplex_item لإضافة الزوج إلى البرنامج.

راجع وثائق API في Samplomatic للاطلاع على التفاصيل الكاملة حول samplomatic.samplex.Samplex وحججه.

# Build the template circuit and the samplex
template_circuit, samplex = build(boxed_circuit)

# Append the template circuit and samplex as a `samplex_item`
program.append_samplex_item(
template_circuit,
samplex=samplex,
shape=(num_randomizations := 20,),
)

6. استدعاء Executor والحصول على النتائج

شغِّل QuantumProgram على Backend من IBM® باستخدام Executor primitive مع الخيارات الافتراضية. راجع خيارات Executor للاطلاع على الخيارات المتاحة.

# Initialize an Executor with the default options
executor = Executor(mode=backend)

# Submit the job
job = executor.run(program)
job
<RuntimeJobV2('d8286580bvlc73d1vmsg', 'executor')>
# Retrieve the result
result = job.result()

النتيجة من النوع QuantumProgramResult. راجع مدخلات ومخرجات Executor للاطلاع على كائن النتيجة.

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

توصيات