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

تصوير الدوائر الكمومية

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

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

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")

Output of the previous code cell

# Latex drawing
circuit.draw(output="latex")

Output of the previous code cell

حفظ الناتج

قد يكون رسم دائرة كبيرة بشكل مضمّن داخل دفتر Jupyter بطيئًا أو غير مقروء. يمكنك حفظ المخطط مباشرةً في ملف، ثم فتحه في عارض صور والتكبير حسب الحاجة.

# Save as an image using the Matplotlib drawer
circuit.draw(output="mpl", filename="circuit-mpl.jpeg")

Output of the previous code cell

# Or save a LaTeX rendering
circuit.draw(output="latex", filename="circuit-latex.pdf")

Output of the previous code cell

التحكم في رسم الدوائر

بشكل افتراضي، تُعيد دالة 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")

Output of the previous code cell

# Draw the circuit with reversed bit order
circuit.draw(output="mpl", reverse_bits=True)

Output of the previous code cell

# Draw the circuit without barriers
circuit.draw(output="mpl", plot_barriers=False)

Output of the previous code cell

تخصيصات خاصة بالمُصيِّر

بعض خيارات التخصيص المتاحة خاصة بمُصيِّر معين.

يضبط وسيط 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)

Output of the previous code cell

# Scale the mpl output to 1/2 the normal size
circuit.draw(output="mpl", scale=0.5)

Output of the previous code cell

دالة رسم الدائرة المستقلة

إن كان لديك تطبيق تُفضّل فيه رسم الدائرة باستخدام دالة مستقلة عوضًا عن استدعائها كدالة في كائن الدائرة، يمكنك استخدام دالة circuit_drawer() مباشرةً، وهي جزء من الواجهة العامة المستقرة في qiskit.visualization. تتصرف هذه الدالة بشكل مماثل تمامًا لدالة circuit.draw()، فارقها الوحيد أنها تأخذ كائن الدائرة كوسيط إلزامي.

from qiskit.visualization import circuit_drawer

circuit_drawer(circuit, output="mpl", plot_barriers=False)

Output of the previous code cell

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

توصيات