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

SQD وSKQD

في هذا الفصل، سنستكشف كيف تتعاون الحواسيب الكمومية والكلاسيكية لحل أحد أهم التحديات في العلوم: التقدير الدقيق لطاقة الجزيئات والمواد.

يشرح إسكندر سيتديكوف الأسلوب الحسابي في الفيديو التالي.

الهاميلتوني

مفتاح هذه المسألة هو مؤثر رياضي يُسمى الهاميلتوني، الذي يمثل الطاقة الكلية للنظام. لأغراض الحوسبة، يمكننا النظر إلى هذا الهاميلتوني باعتباره مصفوفة ضخمة. الحلول التي نبحث عنها — تحديداً الحالة الأساسية للنظام — هي أصغر القيم الذاتية لهذه المصفوفة. غير أن التحدي يكمن في أن مصفوفة الهاميلتوني هذه ضخمة جداً في المسائل العملية؛ إذ تنمو بشكل أسي مع حجم النظام وتصبح كبيرة جداً (2n2^n حيث nn هو عدد الكيوبتات) حتى لأقوى الحواسيب العملاقة للتخزين أو الحل المباشر.

H=(H0,0H0,1H0,N1H1,0H1,1H1,N1HN1,0HN1,1HN1,N1)(N=2n)H = \begin{pmatrix} H_{0,0} & H_{0,1} & \cdots & H_{0,N-1} \\ H_{1,0} & H_{1,1} & \cdots & H_{1,N-1} \\ \vdots & \vdots & \ddots & \vdots \\ H_{N-1,0} & H_{N-1,1} & \cdots & H_{N-1,N-1} \end{pmatrix} \quad (N=2^n)

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

(Hi,j)الهاميلتوني الكاملProjectH~الهاميلتوني المُسقَط=(b1Hb1b1HbLbLHb1bLHbL)Diagonalize(E000EL1)القيم الذاتية\underset{\text{الهاميلتوني الكامل}}{\begin{pmatrix} \ddots & \vdots \\ \cdots & H_{i,j} & \cdots \\ & \vdots & \ddots \end{pmatrix}} \quad \xrightarrow{\text{Project}} \quad \underset{\text{الهاميلتوني المُسقَط}}{\tilde{H}} = \begin{pmatrix} \langle b_1 | H | b_1 \rangle & \cdots & \langle b_1 | H | b_L \rangle \\ \vdots & \ddots & \vdots \\ \langle b_L | H | b_1 \rangle & \cdots & \langle b_L | H | b_L \rangle \end{pmatrix} \quad \xrightarrow{\text{Diagonalize}} \quad \underset{\text{القيم الذاتية}}{\begin{pmatrix} E_0 & & 0 \\ & \ddots & \\ 0 & & E_{L-1} \end{pmatrix}}

بمجرد تعريف هذا الفضاء الجزئي الصغير بمجموعة من حالات الأساس {bi}\{|b_i\rangle\}، يُسقَط الهاميلتوني الكامل عليه لإنشاء المصفوفة الصغيرة الجديدة H~\tilde{H}. يُحسَب كل عنصر من عناصر هذه المصفوفة من حالات الأساس للفضاء الجزئي والهاميلتوني الأصلي على شكل biHbj\langle b_i | H | b_j \rangle. ثم يمكن تقطير هذه المصفوفة الصغيرة بسهولة على حاسوب كلاسيكي، وتكون القيم الذاتية الناتجة هي طاقاتنا المقدَّرة.

كما قد تخمن، يعتمد نجاح هذا الأسلوب برمته على اختيار فضاء جزئي "جيد". فإذا لم يمثل فضاؤنا الجزئي الحالة الأساسية الحقيقية بدقة، ستكون إجابتنا النهائية خاطئة. هنا يكمن دور الحواسيب الكمومية: فهي تتيح لنا تهيئة عينات من حالات كمومية معقدة مصممة للكشف عن هذه الفضاءات الجزئية المهمة. وللمسائل الضخمة حقاً، كالتراكيب الكيميائية المعقدة أو مواقع الارتباط، قد تظل المصفوفة المُسقَطة تحدياً في التقطير حتى بعد الإسقاط. وبالتالي، تلك المسائل هي الأنسب للاستفادة من نقاط قوة الحوسبة الكمومية والكلاسيكية معاً.

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

القطرنة الكمومية القائمة على العينات

القطرنة الكمومية القائمة على العينات (SQD) هي خوارزمية تباينية قوية تُطبّق أسلوب الفضاء الجزئي بطريقة كمومية. تتجنب الإجراءات المكلفة والمعقدة كاختبارات هادامار، إذ تستخدم الحاسوب الكمومي لتهيئة حالة تجريبية وأخذ عينات من سلاسل البتات التي تُعرّف الفضاء الجزئي للتقطير الكلاسيكي.

مخطط يوضح سير عمل القطرنة الكمومية القائمة على العينات. تشمل الخطوات دائرة كمومية تباينية، ثم استخدام القياسات لإسقاط الهاميلتوني في فضاء جزئي، ثم استخدام مُحسِّن كلاسيكي لتحديث المعاملات التباينية في الدائرة والتكرار.

يمكن تفصيل خوارزمية SQD في الخطوات التالية:

الخطوة 1: تهيئة حالة الأنساتز

ليكن H=j=1QαjPjH = \sum_{j=1}^Q \alpha_j P_j هو الهاميلتوني على nn كيوبت. بينما قد تمتد الحالة الأساسية الحقيقية على جميع حالات الأساس البالغة 2n2^n، يكون SQD الأكثر فاعلية في الحالات التي يمكن تقريب الحالة الأساسية فيها بفضاء جزئي متناثر (مجموعة سلاسل بتات ذات حجم متعدد الحدود).

لبناء هذا الفضاء الجزئي، نبدأ بحالة إدخال ϕ0|\phi_0\rangle، كحالة هارتري-فوك (HF) في الكيمياء. ثم نطبق دارة كمومية مُعلمَتة، U(θ)U(\theta)، تُعرف بالأنساتز.

مخطط يوضح تداخل حالات الأساس الحسابي المكوِّنة �للأنساتز مع تلك المكوِّنة للحالة الأساسية الحقيقية. تحديداً، يُظهر الصورة أن المنطقتين ستتداخلان جزئياً لكنهما قد لا تتطابقان تماماً.

يوضح هذا المخطط هدف الأنساتز الجيد. يُهيئ الأنساتز حالة كمومية يجب أن يتداخل مجال دعمها (مجموعة حالات الأساس المكوِّنة لها) بشكل كبير مع مجال دعم الحالة الأساسية الحقيقية. تتيح لنا هذه الدارة إسقاط الأنساتز بسرعة على حالات الأساس الحسابي، التي ستُستخدم لاحقاً في التقطير الكلاسيكي. بمعنى آخر: لا يجب أن نخمن أنساتزاً يكون هو الحالة الأساسية؛ نحتاج فقط أن يحتوي على نفس حالات الأساس. ثم سيمنحنا التقطير الكلاسيكي للهاميلتوني المُسقَط التراكب الخطي لحالات الأساس الذي يُقرّب الحالة الأساسية أفضل تقريب.

الخطوة 2: أخذ عينات من الفضاء الجزئي

بأخذ عينات من الدارة التي أعدّها الأنساتز، نحصل على مجموعة من سلاسل البتات، {bj}j=1L\{b_j\}_{j=1}^L. تُعرّف هذه السلاسل أساس فضاءنا الجزئي المختار. يتحدد وقت تشغيل الدارة الكمومية في هذه الخطوة بعمق الدارة وعدد العينات المأخوذة.

الخطوة 3: الإسقاط والتقطير كلاسيكياً

باستخدام سلاسل البتات المأخوذة كعينات، نُسقط الهاميلتوني في الفضاء الجزئي الذي تمتد عليه. لكل زوج من سلاسل البتات (j,k)(j, k)، نحسب كلاسيكياً عنصر المصفوفة H~jk=bjHbk\tilde{H}_{jk} = \langle b_j | H | b_k \rangle. ونظراً لأن مؤثرات باولي متفرقة (sparse)، تكون هذه الخطوة كلاسيكية بكفاءة للهاميلتونيات الفيزيائية. ثم تُقطَّر المصفوفة الصغيرة الناتجة H~\tilde{H} على معالج كلاسيكي لتقدير الحالة الأساسية وطاقتها.

الخطوة 4: تحسين الأنساتز (اختيارية)

يمكن جعل العملية تكرارية. بمعالجة طاقة الحالة الأساسية المقدَّرة كدالة تكلفة، يمكننا تحسين معاملات الدارة (θ\theta) باستخدام أساليب كالنزول التدريجي لتحسين الأنساتز، وبالتالي تقريب الطاقة في التكرار التالي.

المزايا الرئيسية لـ SQD

تُقدّم SQD خصائص قوية تجعلها مرشحة رائدة لإثبات الميزة الكمومية:

  • متانة عالية أمام الضوضاء: لنفترض أن الحالة الأساسية الحقيقية مدعومة على سلسلتي بتات فقط. إذا أُخذت عينات من هاتين السلسلتين أصلاً، حتى لو كان تداخلهما مع أنساتزنا صغيراً، فإن التقطير سيُسند لهما الأوزان المناسبة ويتجاهل فعلياً جميع سلاسل البتات الزائدة والمشوشة التي ربما أُخذت عينات منها أيضاً. يجعل هذا التصفية المتأصلة SQD متحملةً بشكل خاص للضوضاء.
  • القابلية للتحقق كلاسيكياً: خلافاً لـ QPE أو VQAs، تُنتج SQD تقريباً كلاسيكياً للحالة الأساسية. وهذا يعني أن أي شخص يمتلك قائمة سلاسل البتات وأوزانها يمكنه إعادة حساب تقدير الطاقة والتحقق منه مباشرةً على حاسوب كلاسيكي.

استُخدمت SQD بالفعل لتقدير طاقة تفكك الحالة الأساسية لـ N2_2 والخصائص الإلكترونية لعناقيد [2Fe-2S] و[4Fe-4S] [2]، باستخدام دوائر تصل إلى 77 كيوبت و10,570 بوابة.

اختبر فهمك

صح أم خطأ: يمكن تطبيق SQD على الأنظمة الكيميائية.

الإجابة:

صح

اختبر فهمك

لنُسمِّ مجموعة جميع حالات الأساس الحسابي المكوِّنة لأنساتزك بـ AA. ولنُسمِّ مجموعة جميع حالات الأساس الحسابي المكوِّنة للحالة الأساسية الحقيقية لنظامك بـ GG. أيٌّ مما يلي يوافق أنساتزاً "جيداً"؟ اختر كل ما ينطبق.

(a) AGA \subset G \\ (b) AGA \subseteq G\\ (c) GAG \subset A\\ (d) GAG \subseteq A\\

الإجابة:

(c) و(d)

SKQD (القطرنة الكمومية القائمة على عينات كريلوف)

القطرنة الكمومية القائمة على عينات كريلوف (SKQD) هي خوارزمية كمومية قائمة على العينات قوية أخرى تبني على مبادئ SQD. وبينما هدفها واحد — إيجاد فضاء جزئي جيد للتقطير — تعتمد SKQD أسلوباً أكثر منهجية لتوليد سلاسل البتات، خاصةً للمسائل كهاميلتونيات الشبكة.

الفكرة الجوهرية في SKQD هي أنه بدلاً من تحسين دارة مُعلمَتة للعثور على أنساتز جيد، يمكن إثبات التقارب إلى الحالة الأساسية رياضياً بأخذ عينات من مجموعة حالات مُولَّدة بالتطور الزمني الطبيعي للنظام ذاته — الفضاء الجزئي لكريلوف. يمكن تفصيل خوارزمية SKQD في الخطوات التالية:

الخطوة 1: بناء فضاء كريلوف الجزئي بالتطور الزمني

تبدأ العملية بحالة ابتدائية ϕ0|\phi_0\rangle. والمهم أننا لا نحتاج لهذه الحالة الابتدائية أن تمتلك "تداخلاً جيداً" مع الحالة الأساسية. نحتاج فقط أن تكون "متعددة الحدود في الحجم"، أي موصوفة بكثيرة حدود في حجم النظام. ستقود الخوارزمية ذاتها الحالة تدريجياً نحو الحالة الأساسية للنظام. تطبّق SKQD مؤثر التطور الزمني، eiHte^{-iHt}، لفترات زمنية متفاوتة. يُنشئ هذا مجموعة من dd حالات كمومية مختلفة، معرَّفة بـ:

ϕj=eiδtjHϕ0,لـ j=0,1,,d1|\phi_j\rangle = e^{-i \,\delta t j H}|\phi_0\rangle, \quad \text{لـ } j = 0, 1, \dots, d-1 \quad \text{}

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

الخطوة 2: أخذ عينات من حالات أساس كريلوف

بعد ذلك، تُجمَع عينات سلاسل البتات من كل من الـ dd حالات المختلفة (ϕ0,ϕ1,,ϕd1|\phi_0\rangle, |\phi_1\rangle, \dots, |\phi_{d-1}\rangle) المُهيَّأة في الخطوة السابقة. ثم تُجمَع جميع هذه السلاسل معاً لتشكّل أساس الفضاء الجزئي.

الخطوة 3: الإسقاط والتقطير كلاسيكياً

هذه الخطوة مطابقة للخطوة الموجودة في SQD. تُستخدم سلاسل البتات المجموعة لإسقاط الهاميلتوني الكامل في الفضاء الجزئي الذي تمتد عليه. ثم تُقطَّر المصفوفة الصغيرة الناتجة، H~\tilde{H}، على حاسوب كلاسيكي لإيجاد طاقة الحالة الأساسية.

المزايا الرئيسية وضمانات SKQD

يُقدّم الأسلوب المنهجي لـ SKQD فوائد فريدة:

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

  • فوائد مشتركة مع SQD: مشابهاً لـ SQD، تمتلك SKQD أيضاً خاصية المتانة أمام الضوضاء. بمعنى آخر، طالما امتلكنا جميع سلاسل البتات الجيدة في مجموعة السلاسل المأخوذة عينات منها، فإن التقطير يُسند وزناً قريباً من الصفر لسلاسل البتات الخاطئة، مما يجعل الإجراء متيناً أمام الضوضاء. علاوة على ذلك، بما أن الحل يُنتَج من HPC كلاسيكي، فإن طاقة الحل قابلة للتحقق كلاسيكياً.

في التجارب، استُخدمت SKQD مع ما يصل إلى 70 كيوبت وآلاف البوابات لدراسة الحالة الأساسية لنماذج أندرسون المعقدة ذات 4 شوائب، محققةً توافقاً ممتازاً مع أحدث الأساليب الكلاسيكية كـ DMRG.[1]

اختبر فهمك

ما الجزء من خوارزمية SKQD الذي يجعلها أكثر ملاءمةً للمسائل الفيزيائية كشبكات الدوران مقارنةً بالمسائل الكيميائية؟ ولماذا؟

الإجابة:

يتطلب التطور الزمني دوائر تروتر، وهي عميقة جداً للهاميلتونيات المعقدة وغير المتناثرة. تحكمُ تفاعلاتِ شبكة الدوران مصفوفاتُ الدوران المكافئة لمصفوفات باولي. وبالتالي، تميل الهاميلتونيات لشبكات الدوران إلى أن تكون أكثر قابلية للتعبير عنها بشكل مدمج بمصفوفات باولي، خاصةً تلك ذات التفاعلات بين الجيران الأقرب.

SQD وSKQD كحوسبة غير متجانسة

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

مخطط يوضح سير عمل القطرنة الكمومية القائمة على العينات. تشمل الخطوات دائرة كمومية تباينية، ثم استخدام القياسات لإسقاط الهاميلتوني في فضاء �جزئي، ثم استخدام مُحسِّن كلاسيكي لتحديث المعاملات التباينية في الدائرة والتكرار.

يوضح هذا الشكل سير العمل الأساسي ذو المراحل الأربع. في البداية، سيكون لدينا مهمة لتهيئة الدارة الكمومية التي تتداخل مع حالتنا الهدف، تليها مهمة للتحويل (transpilation) التي تتطلب موارد كلاسيكية فحسب لتنفيذها. بعد ذلك ستكون مهمة تستخدم البدائيات لتنفيذ دارتنا الكمومية وتتطلب موارد كمومية. وأخيراً، تأتي مهمة المعالجة اللاحقة، والتي قد تكون بحد ذاتها خوارزمية تقطير متوازية تعمل على عقد متعددة.

علاوة على ذلك، قد نرغب في تشغيل إحدى هذه الخوارزميات عدة مرات بينما نُغيِّر أنساتزنا، أو قد نرغب في تشغيلها بالتوازي الكامل مع مجموعات سكانية مختلفة.

مخطط يوضح توزيع حمل عمل SQD على عدة موارد. يُظهر عدة عمليات تعمل بشكل تسلسلي، مستخدمةً نتائج تكرار واحد لتوجيه التكرار التالي، لكنها أيضاً تُنفّذ عمليات كثيرة منها بالتوازي.

كما هو موضح أعلاه، قد تُشغّل عدة سير عمل في آنٍ واحد مع القيام بالتالي:

  • تغيير معاملات الأنساتز أو بنيته للعثور على الأكثر فاعلية.
  • البدء بحالات أو تهيئات ابتدائية مختلفة ("مجموعات سكانية") لتجنب المناطق الدنيا المحلية وضمان نتيجة أكثر متانة.

هذا الأسلوب متعدد الطبقات، الجامع بين اللاتجانس القائم على المهام والتوازي على مستوى سير العمل، هو مفتاح استطلاع الإمكانات الكاملة لهذه الخوارزميات.

تمرين برمجي

لنُطبّق خوارزمية SKQD عملياً، موضحين سير العمل غير المتجانس الموصوف آنفاً. تتحلل العملية إلى أربع مراحل متمايزة، لكل منها نص Python الخاص بها ونص Shell مقابل لتقديم الوظيفة.

التخطيط (mapping.py وmapping.sh)

الخطوة الأولى في سير عملنا هي تعريف المسألة الفيزيائية وتعيينها إلى مجموعة من الدوائر الكمومية.

يُعرّف ملف mapping.py معاملات مسألة فيزيائية محددة — في هذه الحالة نموذج أندرسون للشوائب مع سبعة مواقع حمّام (n_bath = 7). يبني التكاملات أحادية الجسم (h1e) وثنائية الجسم (h2e) التي تمثل هاميلتوني النظام.


...

n_bath = 7 # number of bath sites

...

# One body matrix elements in the "position" basis
h1e = -t * np.diag(np.ones(n_bath), k=1) - t * np.diag(np.ones(n_bath), k=-1)
h1e[impurity_index, impurity_index + 1] = -V
h1e[impurity_index + 1, impurity_index] = -V
h1e[impurity_index, impurity_index] = eps

# Two body matrix elements in the "position" basis
h2e = np.zeros((n_bath + 1, n_bath + 1, n_bath + 1, n_bath + 1))
h2e[impurity_index, impurity_index, impurity_index, impurity_index] = U

...

# The one-body time evolution
free_fermion_evolution = ffsim.qiskit.OrbitalRotationJW(n_modes, Utar)

# The two-body time evolution
def append_diagonal_evolution(dt, U, impurity_qubit, num_orb, q_circuit):
"""Append two-body time evolution to a quantum circuit."""
if U != 0:
q_circuit.append(
CPhaseGate(-dt / 2 * U),
[impurity_qubit, impurity_qubit + num_orb],
)

ثم يُولّد الدوائر الكمومية اللازمة لخوارزمية SKQD. يبدأ بإنشاء حالة ابتدائية (initial_state) ثم يطبّق مؤثرات التطور الزمني لأعداد خطوات متفاوتة (d = 8) لتوليد حالات أساس كريلوف المختلفة، ϕj=(eiHt)jϕ0|\phi_j\rangle = (e^{-iHt})^j |\phi_0\rangle.


# The reference state
def initial_state(q_circuit, norb, nocc):
"""Prepare an initial state."""
for i in range(nocc):
q_circuit.append(XGate(), [i])
q_circuit.append(XGate(), [norb + i])
rot = XXPlusYYGate(np.pi / 2, -np.pi / 2)

for i in range(3):
for j in range(nocc - i - 1, nocc + i, 2):
q_circuit.append(rot, [j, j + 1])
q_circuit.append(rot, [norb + j, norb + j + 1])
q_circuit.append(rot, [j + 1, j + 2])
q_circuit.append(rot, [norb + j + 1, norb + j + 2])

...

# Generate the initial state
qubits = QuantumRegister(2 * n_modes, name="q")
init_state = QuantumCircuit(qubits)
initial_state(init_state, n_modes, n_modes // 2)

...

d = 8 # Number of Krylov basis states
circuits = []
for i in range(d):
circ = init_state.copy()
circuits.append(circ)
for _ in range(i):
append_diagonal_evolution(dt, U, impurity_index, n_modes, circ)
circ.append(free_fermion_evolution, qubits)
append_diagonal_evolution(dt, U, impurity_index, n_modes, circ)
circ.measure_all()

print(circuits[0].draw(scale=0.4, fold=-1))

يحفظ النص قائمة الـ 8 دوائر المولَّدة (مع إضافة قياسات لكل منها) في ملف باسم circuits.qpy.

ملف mapping.sh هو نص Slurm الدُفعي يُستخدم لتقديم وظيفة mapping.py. وبما أن هذا حساب كلاسيكي، يطلب موارد من قسم المعالجات العادية (--partition=normal).

#!/bin/bash
#
#SBATCH --job-name=sqd-mapping
#SBATCH --output=sqd-mapping.out
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=1
#SBATCH --cpus-per-task=1
#SBATCH --partition=normal

srun python /data/ch4/sqd/mapping.py

التحسين (optimization.py وoptimization.sh)

بعد الحصول على دوائرنا، يجب تحسينها وتجميعها للعمل بكفاءة على عتاد الكم المستهدف.

في ملف optimization.py، يحمّل النص أولاً ملف circuits.qpy المُنشأ في مرحلة التخطيط ويجلب معلومات الموارد الكمومية عبر QRMI()، مدير موارد الكم. ثم يستخدم generate_preset_pass_manager من Qiskit بمستوى تحسين عالٍ (optimization_level=3) لتحويل الدوائر المجردة والمنطقية إلى دوائر ISA (دوائر مجموعة تعليمات المعمارية). تُعيد هذه العملية كتابة الدوائر باستخدام البوابات الأصلية للعتاد وتُحسّنها لتقليل العمق وتقليل الأخطاء.


...
qrmi = QRMI()
resources = qrmi.resources()
quantum_resource = resources[0]
target = quantum_resource.target

pass_manager = generate_preset_pass_manager(
optimization_level=3,
target=target
)
isa_circuits = pass_manager.run(circuits)

تُحفَظ الدوائر المُحوَّلة الجاهزة للعتاد في ملف جديد، isa_circuits.qpy.

مشابهاً لنص التخطيط، تعمل هذه الوظيفة بـ Slurm أيضاً على قسم المعالجات الكلاسيكية (--partition=normal)، نظراً لأن عملية التحويل (transpilation) مهمة كلاسيكية.

#!/bin/bash
#
#SBATCH --job-name=sqd-mapping
#SBATCH --output=sqd-mapping.out
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=1
#SBATCH --cpus-per-task=1
#SBATCH --partition=normal

srun python /data/ch4/sqd/mapping.py

التنفيذ (execution.py وexecution.sh)

هذه المرحلة الوحيدة التي يُستخدم فيها الحاسوب الكمومي. هنا ننفّذ الدوائر المحسَّنة ونجمع عينات القياس.

يحمّل ملف execution.py ملف isa_circuits.qpy المحسَّن، ثم يُهيئ بدائياً SamplerV2 متصلاً بمورد كمومي. يستدعي بعد ذلك sampler.run() لتنفيذ الدوائر على وحدة معالجة الكم (QPU) لعدد محدد من اللقطات (shots=500).


...

qrmi = QRMI()
resources = qrmi.resources()
quantum_resource = resources[0]

# Sample from the circuits
noisy_sampler = Sampler(quantum_resource)
job = noisy_sampler.run(isa_circuits, shots=500)

في نهاية التنفيذ، تُجمَع النتائج المقاسة (سلاسل البتات) من جميع الدوائر وتُدمَج، وتُحفَظ أعدادها في ملف counts.json.

يختلف نص Slurm الخاص بهذه المرحلة، execution.sh، عن غيره. إذ يطلب التشغيل على قسم الكم (--partition=quantum) ويطلب تحديداً وحدة معالجة كمية واحدة (--gres=qpu:1).

#!/bin/bash
#
#SBATCH --job-name=sqd-execution
#SBATCH --output=sqd-execution.out
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=1
#SBATCH --cpus-per-task=1
#SBATCH --partition=quantum
#SBATCH --gres=qpu:1

srun python /data/ch4/sqd/execution.py

المعالجة اللاحقة (postprocessing.py وpostprocessing.sh)

في الخطوة الأخيرة، نعود إلى الحاسوب الكلاسيكي لتحليل البيانات من التجربة الكمومية وحساب النتيجة النهائية: طاقة الحالة الأساسية لنظامنا الهدف.

يقرأ برنامج postprocessing.py أولاً ملف counts.json الذي يحتوي على نتائج القياس. ثم يُعيد بناء هاميلتوني نموذج أندرسون (باستخدام نفس المعاملات الواردة في mapping.py). يُمرر بعد ذلك سلاسل البتات المقاسة وتعريف الهاميلتوني إلى دالة diagonalize_fermionic_hamiltonian. تُنفّذ هذه الدالة المنطق الجوهري لـ SKQD: تستخدم سلاسل البتات لبناء الهاميلتوني المُسقَط H~\tilde{H} وتُقطّره لإيجاد طاقة الحالة الأساسية.


...

def callback(results: list[SCIResult]):
result_history.append(results)
iteration = len(result_history)
print(f"Iteration {iteration}")
for i, result in enumerate(results):
print(f"\tSubsample {i}")
print(f"\t\tEnergy: {result.energy}")
print(f"\t\tSubspace dimension: {np.prod(result.sci_state.amplitudes.shape)}")

rng = np.random.default_rng(24)
result = diagonalize_fermionic_hamiltonian(
h1e,
h2e,
bit_array,
samples_per_batch=300,
norb=n_modes,
nelec=nelec,
num_batches=3,
max_iterations=10,
symmetrize_spin=True,
callback=callback,
seed=rng,
)

أخيراً، يطبع البرنامج طاقة SKQD المحسوبة ويقارنها بالطاقة الدقيقة المعروفة لهذه المسألة، مُظهراً الخطأ المطلق النهائي للحساب.

يعمل نص الوظيفة الأخير على قسم كلاسيكي (--partition=normal)، إذ جميع التحليلات كلاسيكية. وللفضاءات الجزئية الكبيرة، قد تتطلب هذه الخطوة موارد HPC كلاسيكية أكبر.

#!/bin/bash
#
#SBATCH --job-name=sqd-postprocessing
#SBATCH --output=sqd-postprocessing.out
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=1
#SBATCH --cpus-per-task=1
#SBATCH --partition=normal

srun python /data/ch4/sqd/postprocessing.py

الخلاصة

هذا كل شيء! لقد استعرضنا الآن عدة مفاهيم وأمثلة تساعدك على البدء في إدارة البرامج الهجينة المعقدة. بالطبع، هذا ليس سوى البداية لكل ما يمكنك فعله بالجمع بين موارد الكم وموارد HPC الكلاسيكية.

لاستكشاف المزيد من حالات الاستخدام والخوارزميات، تصفح التوثيق والدروس التطبيقية على IBM Quantum Platform، وتأكد من زيارة الموارد المشاركة في الدرس التالي لمزيد من المعلومات حول الخوارزميات والبرمجيات لعلماء الحوسبة ومديري مراكز البيانات على حدٍّ سواء.

المراجع

[1] Quantum-Centric Algorithm for Sample-Based Krylov Diagonalization. https://arxiv.org/abs/2501.09702

[2] Chemistry beyond the scale of exact diagonalization on a quantum-centric supercomputer. https://www.science.org/doi/10.1126/sciadv.adu9991