تصوير الدوائر الكمومية
إصدارات الحزم
تم تطوير الكود في هذه الصفحة باستخدام المتطلبات التالية. نوصي باستخدام هذه الإصدارات أو أحدث منها.
qiskit[all]~=2.3.0
كثيرًا ما يكون من المفيد رؤية الدوائر التي تبنيها. استخدم الخيارات التالية لعرض دوائر Qiskit.
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit
from qiskit import QuantumCircuit
رسم دائرة كمومية
تدعم فئة QuantumCircuit رسم الدوائر من خلال الدالة draw()، أو عبر طباعة كائن الدائرة. بشكل افتراضي، تُنتج كلتا الطريقتين تمثيلًا نصيًا بأسلوب فن ASCII لمخطط الدائرة.
لاحظ أن print تُعيد None لكنّ تأثيرها الجانبي هو ط باعة المخطط، في حين أن QuantumCircuit.draw تُعيد المخطط دون أي تأثيرات جانبية. بما أن دفاتر Jupyter تعرض ناتج السطر الأخير في كل خلية، فإن الطريقتين تبدوان متماثلتي الأثر.
# Build a quantum circuit
circuit = QuantumCircuit(3, 3)
circuit.x(1)
circuit.h(range(3))
circuit.cx(0, 1)
circuit.measure(range(3), range(3));
print(circuit)
┌───┐ ┌─┐
q_0: ┤ H ├───────■──┤M├───
├───┤┌───┐┌─┴─┐└╥┘┌─┐
q_1: ┤ X ├┤ H ├┤ X ├─╫─┤M├
├───┤└┬─┬┘└───┘ ║ └╥┘
q_2: ┤ H ├─┤M├───────╫──╫─
└───┘ └╥┘ ║ ║
c: 3/═══════╩════════╩══╩═
2 0 1
circuit.draw()
┌───┐ ┌─┐
q_0: ┤ H ├───────■──┤M├───
├───┤┌───┐┌─┴─┐└╥┘┌─┐
q_1: ┤ X ├┤ H ├┤ X ├─╫─┤M├
├───┤└┬─┬┘└───┘ ║ └╥┘
q_2: ┤ H ├─┤M├───────╫──╫─
└───┘ └╥┘ ║ ║
c: 3/═══════╩════════╩══╩═
2 0 1
المُصيِّرات البديلة
الناتج النصي مفيد لرؤية الناتج بسرعة أثناء تطوير الدائرة، لكنّه لا يوفر أقصى قدر من المرونة. يتوفر مُصيِّران بديلان لدوائر Quantum؛ أحدهما يستخدم Matplotlib والآخر يستخدم LaTeX. يتطلب مُصيِّر LaTeX وجود حزمة qcircuit. اختر هذين المُصيِّرين بضبط وسيط "output" على السلسلتين mpl وlatex.
يمكن لمستخدمي OSX الحصول على حزم LaTeX المطلوبة من خلال حزمة mactex.
# Matplotlib drawing
circuit.draw(output="mpl")
# Latex drawing
circuit.draw(output="latex")
حفظ الناتج
قد يكون رسم دائرة كبيرة بشكل مضمّن داخل دفتر Jupyter بطيئًا أو غير مقروء. يمكنك حفظ المخطط مباشرةً في ملف، ثم فتحه في عارض صور والتكبير حسب الحاجة.
# Save as an image using the Matplotlib drawer
circuit.draw(output="mpl", filename="circuit-mpl.jpeg")
# Or save a LaTeX rendering
circuit.draw(output="latex", filename="circuit-latex.pdf")
التحكم في رسم الدوائر
بشكل افتراضي، تُعيد دالة draw() الصورة المُصيَّرة ككائن ولا تطبع أي شيء. تعتمد الفئة الدقيقة التي يُعاد إرجاعها على الناتج المحدد: 'text' (الافتراضي) يُعيد كائن TextDrawer، و'mpl' يُعيد كائن matplotlib.Figure، وlatex يُعيد كائن PIL.Image. تفهم دفاتر Jupyter هذه الأنواع المُعادة وتعرضها بشكل صحيح، لكن عند التشغيل خارج Jupyter لن تُعرض الصور تلقائيًا.
تتوفر لدالة draw() وسيطات اختيارية لعرض الناتج أو حفظه. عند تحديده، يأخذ الوسيط filename مسارًا يحفظ فيه الناتج المُصيَّر. بدلًا من ذلك، إن كنت تستخدم ناتج mpl أو latex، يمكنك استخدام الوسيط interactive لفتح الصورة في نافذة جديدة (قد لا يعمل هذا دائمًا من داخل دفتر الملاحظات).
تخصيص الناتج
بحسب نوع الناتج، تتوفر خيارات إضافية لتخصيص مخطط الدائرة.
تعطيل رسم الحواجز وعكس ترتيب البتات
الخياران الأولان مشتركان بين الـ backends الثلاثة. يتيحان لك ضبط ترتيب البتات وتحديد ما إذا كنت ستَرسم الحواجز أم لا. يمكن ضبطهما عبر الوسيط reverse_bits والوسيط plot_barriers على التوالي. تعمل الأمثلة التالية مع أي مُصيِّر؛ يُستخدم mpl هنا للاختصار.
from qiskit import QuantumRegister, ClassicalRegister
# Draw a new circuit with barriers and more registers
q_a = QuantumRegister(3, name="a")
q_b = QuantumRegister(5, name="b")
c_a = ClassicalRegister(3)
c_b = ClassicalRegister(5)
circuit = QuantumCircuit(q_a, q_b, c_a, c_b)
circuit.x(q_a[1])
circuit.x(q_b[1])
circuit.x(q_b[2])
circuit.x(q_b[4])
circuit.barrier()
circuit.h(q_a)
circuit.barrier(q_a)
circuit.h(q_b)
circuit.cswap(q_b[0], q_b[1], q_b[2])
circuit.cswap(q_b[2], q_b[3], q_b[4])
circuit.cswap(q_b[3], q_b[4], q_b[0])
circuit.barrier(q_b)
circuit.measure(q_a, c_a)
circuit.measure(q_b, c_b);
# Draw the circuit
circuit.draw(output="mpl")
# Draw the circuit with reversed bit order
circuit.draw(output="mpl", reverse_bits=True)
# Draw the circuit without barriers
circuit.draw(output="mpl", plot_barriers=False)
تخصيصات خاصة بالمُصيِّر
بعض خيارات التخصيص المتاحة خاصة بمُصيِّر معين.
يضبط وسيط fold الحد الأقصى لعرض الناتج. في مُصيِّر text، يحدد هذا طول سطور المخطط قبل التفافه إلى السطر التالي. عند استخدام مُصيِّر 'mpl'، يمثل هذا عدد الطبقات (المرئية) قبل الطي إلى السطر التالي.
يمتلك مُصيِّر mpl الوسيط style الذي يغير الألوان والحدود. راجع توثيق API لمزيد من التفاصيل.
يقيس خيار scale ناتج مُصيِّري mpl وlatex.
circuit = QuantumCircuit(1)
for _ in range(10):
circuit.h(0)
# limit line length to 40 characters
circuit.draw(output="text", fold=40)
┌───┐┌───┐┌───┐┌───┐┌───┐┌───┐┌───┐»
q: ┤ H ├┤ H ├┤ H ├┤ H ├┤ H ├┤ H ├┤ H ├»
└───┘└───┘└───┘└───┘└───┘└───┘└───┘»
« ┌───┐┌───┐┌───┐
«q: ┤ H ├┤ H ├┤ H ├
« └───┘└───┘└───┘
# Change the background color in mpl
style = {"backgroundcolor": "lightgreen"}
circuit.draw(output="mpl", style=style)
# Scale the mpl output to 1/2 the normal size
circuit.draw(output="mpl", scale=0.5)
دالة رسم الدائرة المستقلة
إن كان لديك تطبيق تُفضّل فيه رسم الدائرة باستخدام دالة مستقلة عوضًا عن استدعائها كدالة في كائن الدائرة، يمكنك استخدام دالة circuit_drawer() مباشرةً، وهي جزء من الواجهة العامة المستقرة في qiskit.visualization. تتصرف هذه الدالة بشكل مماثل تمامًا لدالة circuit.draw()، فارقها الوحيد أنها تأخذ كائن الدائرة كوسيط إلزامي.
from qiskit.visualization import circuit_drawer
circuit_drawer(circuit, output="mpl", plot_barriers=False)
الخطوات التالية
- شاهد مثالًا على تصوير الدوائر في درس خوارزمية غروفر.
- صوِّر دوائر بسيطة باستخدام IBM Quantum Composer.
- تصوير توقيت الدائرة.
- راجع توثيق API لتصورات Qiskit.