Bagaimana pakej ini berkaitan dengan ffsim
Konsep dalam panduan ini hanya tersedia dalam Python API.
ffsim dan pakej ini berkongsi kerja dan bukannya bertindih, mengikut satu garis:
| ffsim memiliki | qiskit-fermions memiliki |
|---|---|
Operator ansatz peringkat tinggi (UCJOpSpinBalanced, UCCSDOpRestrictedReal dan saudaranya), dibina daripada amplitud gugusan berganding atau vektor parameter | Litar fermionik (FermionicCircuit) yang terhasil daripada operator tersebut, dan transpilasinya kepada litar qubit di bawah sebarang pengekodan fermion-ke-qubit |
| Simulasi pantas dalam ruang bilangan zarah tetap yang padat | Rangka kerja pemeta dan struktur data operator yang menjadi asas pembinaan litar |
Akibat praktikalnya berlaku kedua-dua hala. Matematik ansatz terletak dalam ffsim, jadi UCJ dan UCC menerima operator ffsim secara langsung sebagai input. Sebaliknya, Gate Qiskit milik ffsim khusus kepada transformasi Jordan-Wigner, jadi menurunkan salah satu operator ansatznya melalui pengekodan yang berbeza ialah apa yang diperoleh dengan membawanya ke sini.
Simulasi ialah tempat kedua-duanya bertemu, dan panduan ini menerangkan caranya. ffsim ialah Backend simulasi pakej ini, dicapai melalui protokolnya sendiri dan bukan pembungkus: panduan SKQD memanggil ffsim.apply_unitary(), ffsim.linear_operator(), dan ffsim.sample_state_vector() secara langsung pada objek FermionicCircuitdan objek FermionOperator, tanpa langkah penukaran.
Menyambung ke antara muka simulasi ffsim
ffsim ialah simulator berprestasi tinggi untuk litar kuantum fermionik yang mengeksploitasi pemuliharaan bilangan zarah dan spin-Z untuk mewakili vektor keadaan dengan lebih padat daripada vektor keadaan qubit generik berdimensi . Ia mentakrifkan protokol yang boleh dilaksanakan oleh mana-mana objek untuk mengambil bahagian dalam jentera simulasinya (lihat qiskit_fermions.protocols untuk protokol pakej ini sendiri, yang mengikut reka bentuk yang sama):
-
ffsim.SupportsApplyUnitary, melalui kaedah_apply_unitary_(vec, norb, nelec, copy), yang mengenakan objek sebagai unitari pada vektor keadaan bilangan zarah tetap -
ffsim.SupportsLinearOperator, melalui kaedah_linear_operator_(norb, nelec), yang mengembalikan pandanganscipy.sparse.linalg.LinearOperatorbagi objek pada sektor yang sama -
ffsim.SupportsTrace, melalui kaedah_trace_(norb, nelec), yang mengembalikan surih objek pada sektor tersebut.
Pakej ini melaksanakan antara muka itu: setiap Gate fermionik dalam qiskit_fermions.circuit.library menyediakan _apply_unitary_, dan FermionOperator menyediakan _linear_operator_ dan _trace_. Itulah yang menjadikan operator dan litar pakej ini serasi dengan ffsim, jadi alatnya berfungsi pada mereka secara asli, tanpa langkah penukaran. ffsim.apply_unitary() boleh mensimulasikan FermionicCircuit dari hujung ke hujung, ffsim.linear_operator() boleh mempepenjurukan FermionOperator, dan utiliti pensampelan seperti ffsim.sample_state_vector() (digunakan dalam panduan SKQD untuk menukarkan vektor keadaan tersimulasi kepada kiraan pengukuran) berfungsi tanpa pengubahsuaian.
Apa yang dikembalikan oleh _linear_operator_ ialah LinearOperator SciPy biasa, jadi scipy.sparse.linalg.eigsh() dan fungsi sepertinya juga berfungsi padanya.
>>> import ffsim
>>> import numpy as np
>>>
>>> from qiskit_fermions.circuit import FermionicCircuit
>>> from qiskit_fermions.circuit.library import Evolution
>>> from qiskit_fermions.operators import FermionOperator, ann, cre
>>>
>>> norb, nelec = 2, (1, 1)
>>> hamiltonian = FermionOperator.from_terms([
... ([cre(0), ann(1)], 0.5),
... ([cre(1), ann(0)], 0.5),
... ])
>>>
>>> circuit = FermionicCircuit(2 * norb)
>>> circuit.append(Evolution(2 * norb, hamiltonian, time=1.0), circuit.modes)
>>>
>>> reference = ffsim.hartree_fock_state(norb, nelec)
>>> state = ffsim.apply_unitary(reference, circuit, norb=norb, nelec=nelec) # native ffsim call
Gandingan melalui protokol ffsim inilah yang memberikan manfaat ini: ekosistem utiliti simulasi dan pensampelannya yang dibangunkan secara aktif terpakai pada litar dan operator pakej ini tanpa perubahan, dan pengguna yang sudah bekerja dengan ffsim boleh mencampurkan Gate dan operator pakej ini tanpa mempelajari API simulasi lain.
ffsim ialah kebergantungan pilihan
ffsim diisytiharkan sebagai tambahan pilihan (pip install "qiskit-fermions[ffsim]", atau secara transitif oleh [all]), dikawal pada masa larian oleh HAS_FFSIM (seperti yang ditunjukkan di atas). Memasangnya membuka simulasi: ffsim.SupportsLinearOperator dan ffsim.SupportsTrace dilaksanakan dengan menukarkan FermionOperator pakej ini kepada ffsim.FermionOperator, jadi tanpa ffsim ia menimbulkan MissingOptionalLibraryError. Segala yang tidak mensimulasikan (membina operator, memetakannya, dan mentranspil litar yang terhasil) tidak memerlukannya.
Simulasi fermionik berlaku dalam sektor bilangan zarah tetap
Kedua-dua _apply_unitary_ dan _linear_operator_ menerima argumen nelec dan mewakili vektor keadaan pada asas penentu bilangan zarah tetap bagi sektor (norb, nelec) itu, mencerminkan penyediaan ruang FCI ffsim (dan, secara transitif, PySCF), dan bukannya ruang berdimensi penuh yang akan digunakan oleh simulator qubit am. Ini ruang yang jauh lebih kecil (saiznya ialah hasil darab pekali binomial dan bukan kuasa dua), tetapi ia disertai sekatan keras. Hanya operator dan Gate yang mengekalkan bilangan zarah (dan, dalam kes berspin, bilangan zarah setiap spesies spin secara individu) boleh diwakili di dalamnya. Operator yang tindakannya akan memindahkan amplitud ke bilangan zarah yang berbeza tidak mempunyai tempat untuk meletakkannya.
ffsim menyelesaikan ini dengan menolak operator sedemikian secara terus: menukarkannya kepada operator linear menimbulkan ValueError yang menamakan hukum pemuliharaan mana yang gagal. Itu lalai yang betul, kerana mengenakan bagi Hamiltonian dengan sebutan yang tidak memelihara zarah sebaliknya akan menukarkan pemetaan yang sepatutnya unitari menjadi pemetaan tidak unitari yang tidak bermakna dari segi fizikal.
-
Evolutionmemunculkan penolakan itu daripada operator yang dievolusikannya. -
OrbitalRotationmemeriksa bahawa matriks putaran (terbenam) bersifat pepenjuru blok merentasi pembahagian alfa/beta dalam kes berspin, dan menimbulkanValueErrorjika ia mencampurkan sektor spin.
>>> from qiskit_fermions.circuit.library import Evolution
>>>
>>> non_conserving = FermionOperator.from_terms([([cre(0), cre(1)], 1.0)]) # creates 2 particles
>>> gate = Evolution(2 * norb, non_conserving, time=1.0)
>>>
>>> try:
... gate._apply_unitary_(reference, norb, nelec, copy=True)
... except ValueError as exc:
... print("rejected:", exc)
rejected: The given FermionOperator could not be converted to a LinearOperator because it does not conserve particle number and the z component of spin. Conserves particle number: False Conserves spin z: False
Oleh itu, simulasi yang tidak mengekalkan zarah berada di luar jangkauan dalam ruang fermionik, mengikut reka bentuk perwakilan sektor tetap, dan itulah harga bagi ruang FCI padat yang menjadikan simulasi fermionik boleh dilaksanakan pada asalnya. Jika algoritma anda memerlukan operator yang melanggar bilangan zarah (contohnya, saluran ralat asli-qubit, atau operator yang dibina untuk Hamiltonian terpeta yang tidak mengekalkan bilangan zarah bagi setiap sebutan), transpilasikan ke qubit terlebih dahulu dan simulasikan QuantumCircuit yang terhasil dengan simulator peringkat qubit. Mana-mana laluan transpilasi berfungsi untuk ini; panduan litar fermionik dan transpilasi menerangkan dengan lebih terperinci, tetapi generate_preset_jw_pass_manager() ialah pilihan lalai yang munasabah.
Konvensyen spin blok untuk sistem berspin
nelec ditaip sebagai int | tuple[int, int], dan jenisnya, bukan bendera berasingan, yang memilih salah satu reka letak mod yang disokong:
-
int memilih tafsiran tanpa spin.
norbmod dilayan secara langsung sebagai orbital tanpa spin, dannelecialah jumlah bilangan zarah. -
Pasangan
(n_alpha, n_beta)memilih tafsiran berspin bagi2 * norbmod di bawah konvensyen spin blok yang tetap. Mod0 .. norbialah orbital alfa (spin-atas) dan modnorb .. 2 * norbialah orbital beta (spin-bawah). Setiap spesies spin dikekalkan secara bebas; sebutan alfa sahaja boleh memindahkan elektron antara mod alfa tetapi tidak sekali-kali ke dalam mod beta, dan sebaliknya.
Pengagihan ini berlaku pada setiap titik masuk protokol ffsim dalam pakej ini (pembina gate, pelaksanaan _apply_unitary_placed_, dan kompilasi sektor kernel Rust asli), dan ia ialah konvensyen yang digunakan dalam panduan LUCJ dan SKQD (contohnya, InitializeModes.from_hartree_fock() mengisi penghunian alfa ke dalam mod 0 .. n_alpha dan penghunian beta ke dalam mod norb .. norb + n_beta). Ia wajar dibezakan dengan modul qiskit_fermions.operators dan FermionicCircuit secara amnya, yang menggunakan indeks mod generik tanpa semantik spin yang wujud (lihat panduan litar fermionik). Maksud spin blok hanya dikenakan apabila nelec berspin dibekalkan kepada panggilan simulasi, bukan terterap dalam perwakilan operator atau litar itu sendiri.
>>> from qiskit_fermions.circuit.library import InitializeModes
>>>
>>> norb, nelec = 3, (2, 1)
>>> init = InitializeModes.from_hartree_fock(norb, nelec)
>>> print([bool(occ) for occ in init.occupation]) # alpha modes 0,1; beta mode 3 (= norb + 0)
[True, True, False, True, False, False]
Langkah seterusnya
-
Ikuti panduan SKQD untuk melihat
ffsim.apply_unitary()danffsim.sample_state_vector()digunakan bersama untuk mensampel litar yang dibina daripada gate pakej ini, dan untuk menilai nilai jangkaan Hamiltonian melaluiffsim.linear_operator()(yang itu sendiri disokong oleh kaedah protokol_linear_operator_yang sama seperti yang diterangkan di sini). -
Ikuti panduan LUCJ untuk separuh lagi kisahnya: membawa operator ansatz ffsim melalui saluran paip transpilasi pakej ini dan ke peta gandingan peranti.
-
Baca panduan litar fermionik untuk pengindeksan mod generik yang tidak bergantung pada spin yang digunakan di luar panggilan simulasi.
-
Baca panduan transpilasi untuk cara keluar daripada ruang fermionik
dan simulasi pada qubit, yang diperlukan untuk operator yang tidak mengekalkan zarah.
-
Layari
qiskit_fermions.protocolsuntuk katalog penuh protokol yang ditakrifkan oleh pakej ini, termasuk protokol penukaran (SupportsFermionOperator,SupportsMajoranaOperator) yang tidak berkaitan dengan ffsim. -
Baca panduan ffsim sendiri untuk aliran kerja yang dimilikinya, khususnya membina ansatz UCJ dan mengoptimumkannya secara variasi. Vektor parameter yang dipacu oleh panduan tersebut ialah apa yang diterima oleh
UCJdanUCC, melalui operator yang dibina oleh keduanya.