منحنيات PES للتفكك مع Qunova HiVQE
وظائف Qiskit هي ميزة تجريبية متاحة فقط لمستخدمي خطط IBM Quantum® Premium Plan وFlex Plan وOn-Prem (عبر IBM Quantum Platform API). وهي في مرحلة الإصدار التجريبي وقابلة للتغيير.
تقدير الاستخدام (ملاحظة: هذا تقدير فحسب. قد يختلف وقت التشغيل الفعلي.)
- Li2S: خمس دقائق من وقت QPU على معالج Heron r2
- FeP-NO: خمس دقائق من وقت QPU على معالج Heron r2
الخلفية
يُعدّ الحساب الدقيق لطاقات التفاعل الكيميائي أمرًا بالغ الأهمية للتقدم العلمي في علوم المواد والهندسة الكيميائية واكتشاف الأدوية وغيرها من المجالات. ومن بين الأنظمة الكيميائية المختلفة، حظي نظام Li-S باهتمام واسع لفهم تركيبات البطاريات الجديدة وتطويرها. يوفر هذا البرنامج التعليمي تجربة عملية لحساب سطح طاقة الكمون (PES) لتفكك رابطة Li-S في نظام عن طريق إزالة ذرة ليثيوم واحدة باستخدام حسابات HiVQE. يمكن مقارنة النتائج بالحسابات المرجعية (CASCI) وكذلك بالطرق الكلاسيكية مثل Hartree-Fock (HF) لمسألة ذات 20 كيوبت.
المتطلبات
قم بتثبيت التبعيات التالية لتشغيل الكود في هذا البرنامج التعليمي.
!pip install --upgrade pip
!pip install -U qiskit-ibm-catalog "qiskit_ibm_runtime<0.42.0" pyscf numpy matplotlib typing_extensions
الإعداد
لتشغيل هذا البرنامج التعليمي، قم باستيراد دالة qunova/hivqe-chemistry عبر QiskitFunctionCatalog. تحتاج إلى حساب IBM Quantum Premium Plan أو Flex Plan أو On-Prem (IBM Quantum Platform API) مع ترخيص من Qunova لتشغيل هذه الدالة.
from qiskit_ibm_catalog import QiskitFunctionsCatalog
from pyscf import gto, scf, mcscf
import matplotlib.pyplot as plt
import pprint
catalog = QiskitFunctionsCatalog(
channel="ibm_quantum_platform",
instance="INSTANCE_CRN",
token="YOUR_API_KEY", # Use the 44-character API_KEY you created and saved from the IBM Quantum Platform Home dashboard
)
hivqe = catalog.load("qunova/hivqe-chemistry")
الجزء الأول: Li2S (20Q)
الخطوة 1: تحويل المدخلات الكلاسيكية إلى مسألة كمومية
قم بتعريف هندسات بصيغة القاموس لمسافات رابطة Li-S المختلفة لحساب منحنى PES. هذه الهندسات مُحسَّنة باستخدام حسابات B3LYP/631g.
str_geometries = {
"1.51": "S -1.239044 0.671232 -0.030374; Li -1.506327 0.432403 -1.498949; Li -0.899996 0.973348 1.826768",
"1.91": "S -1.215858 0.692272 0.099232; Li -1.553305 0.390283 -1.758043; Li -0.876205 0.994426 1.956257",
"2.40": "S -1.741432 0.680397 0.346702; Li -0.529307 0.488006 -1.729343; Li -1.284307 0.989409 2.177209",
"3.10": "S -2.347450 0.657089 0.566194; Li -0.199353 0.527517 -1.665148; Li -1.008243 0.973206 1.893522",
"3.80": "S -2.707255 0.674298 0.909161; Li 0.079218 0.552012 -1.671656; Li -0.927010 0.931502 1.557063",
"4.50": "S -2.913363 0.709175 1.276987; Li 0.368656 0.559989 -1.798088; Li -1.010340 0.888647 1.315670",
}
str_geometries
{'1.51': 'S -1.239044 0.671232 -0.030374; Li -1.506327 0.432403 -1.498949; Li -0.899996 0.973348 1.826768',
'1.91': 'S -1.215858 0.692272 0.099232; Li -1.553305 0.390283 -1.758043; Li -0.876205 0.994426 1.956257',
'2.40': 'S -1.741432 0.680397 0.346702; Li -0.529307 0.488006 -1.729343; Li -1.284307 0.989409 2.177209',
'3.10': 'S -2.347450 0.657089 0.566194; Li -0.199353 0.527517 -1.665148; Li -1.008243 0.973206 1.893522',
'3.80': 'S -2.707255 0.674298 0.909161; Li 0.079218 0.552012 -1.671656; Li -0.927010 0.931502 1.557063',
'4.50': 'S -2.913363 0.709175 1.276987; Li 0.368656 0.559989 -1.798088; Li -1.010340 0.888647 1.315670'}
ستُجرى حسابات HiVQE باستخدام الخيارات المحددة أدناه. باستخدام أساس sto3g لـ ، توجد 19 مدارًا فضائيًا مع 22 إلكترونًا. لتشغيل حالة (10o,10e) بحساب HiVQE، يمكنك تحديد 10 مدارات فاعلة وست مدارات مجمَّدة. في كل تكرار، سيُستخدم 100 لقطة (shot) لأخذ عينات من تشكيل الإلكترونات الناتج عن دائرة كمومية ExcitationPreserving (epa) مع تشابك circular وتكرارَين (reps). يُضبط الحد الأقصى لعدد التكرارات على 30 لضمان إنهاء التكرار عند تقارب الطاقة.
molecule_options = {
"basis": "sto3g",
"active_orbitals": list(range(5, 15)),
"frozen_orbitals": list(range(5)),
}
hivqe_options = {
"shots": 100,
"max_iter": 30,
"ansatz": "epa",
"ansatz_entanglement": "circular",
"ansatz_reps": 2,
}
الخطوتان 2 و3: تحسين المسألة لتنفيذها على العتاد الكمومي وتنفيذها باستخدام دالة HiVQE Chemistry
قم بإعداد حلقة for لتشغيل حسابات HiVQE مع الهندسات والخيارات المحددة أدناه. تُرسَل المهام في حلقة for. في هذا البرنامج التعليمي، ستُرسل ست هندسات وتسترجع النتائج عند اكتمالها جميعًا. في تشغيل الدالة الرئيسية، تحتاج إلى تحديد max_states وmax_expansion_states للتحكم في الحجم الأقصى لمصفوفة الفضاء الفرعي والتحكم في عدد الحالات التي يمكن توليدها باستخدام طرق CI الكلاسيكية التوسعية لكل تكرار. سيُخزَّن معرّفات مهام الدالة في القاموس مع تسمية كل هندسة لتتبع المخرجات ومعالجتها لاحقًا.
info_jobid = {}
for dis, geom in str_geometries.items():
hivqe_run = hivqe.run(
geometry=geom,
backend_name="",
max_states=40000,
max_expansion_states=100,
molecule_options=molecule_options,
hivqe_options=hivqe_options,
)
status = hivqe_run.status()
info_jobid[dis] = hivqe_run.job_id
print(info_jobid)
{'1.51': 'de3b8818-c9db-4fa3-a3c2-d51551c2dfaf', '1.91': '55d9467a-fc85-49a8-9bc6-8f6990e421e5', '2.40': '415112b3-69ff-4d53-8b10-cb4e3be68c9e', '3.10': 'ef67b600-3887-4225-b872-e354dfdf8454', '3.80': 'b16d3502-a9e4-4560-9775-852e9d07e70f', '4.50': '0c0bffc7-af77-4a56-a656-2a2610c991d6'}
لنتحقق مما إذا كانت جميع المهام لا تزال قيد التشغيل أم قد اكتملت.
completed_jobs_num = 0
running_jobs_num = 0
completed_jobs = {}
for i, info in enumerate(info_jobid.items()):
dis, job_id = info
submitted_job = catalog.get_job_by_id(job_id)
stat = submitted_job.status()
print(dis, submitted_job.job_id, stat)
if stat == "DONE":
completed_jobs_num += 1
completed_jobs[dis] = submitted_job
if (stat == "RUNNING") or (stat == "QUEUED"):
running_jobs_num += 1
print(
f"Completed {completed_jobs_num} job, Running or Queued {running_jobs_num} job"
)
1.51 de3b8818-c9db-4fa3-a3c2-d51551c2dfaf DONE
1.91 55d9467a-fc85-49a8-9bc6-8f6990e421e5 DONE
2.40 415112b3-69ff-4d53-8b10-cb4e3be68c9e DONE
3.10 ef67b600-3887-4225-b872-e354dfdf8454 DONE
3.80 b16d3502-a9e4-4560-9775-852e9d07e70f DONE
4.50 0c0bffc7-af77-4a56-a656-2a2610c991d6 DONE
Completed 6 job, Running or Queued 0 job
بعد اكتمال جميع المهام، لنسترجع جميع نتائج الحسابات.
hivqe_result = {}
if len(info_jobid) == completed_jobs_num:
print("All jobs are completed")
for i, job in enumerate(completed_jobs.items()):
dis, cal = job
print(dis, cal.result()["energy"])
hivqe_result[str(dis)] = cal.result()["energy"]
All jobs are completed
1.51 -407.8944801731773
1.91 -407.9800570932916
2.40 -407.9372992999806
3.10 -407.86278336000134
3.80 -407.83092972296157
4.50 -407.82971011225766
pprint.pprint(hivqe_result)
{'1.51': -407.8944801731773,
'1.91': -407.9800570932916,
'2.40': -407.9372992999806,
'3.10': -407.86278336000134,
'3.80': -407.83092972296157,
'4.50': -407.82971011225766}
يمكن تتبع إجمالي وقت تشغيل QPU المستخدم في المهمة عن طريق تسجيل الدخول إلى IBM Quantum Platform وعرض المهام المُرسَلة بوسم qunova-chemistry-hivqe.