Langkau ke kandungan utama
Projek ini dalam fasa beta. Jumpa pepijat? Buat isu GitHub. Ada soalan atau idea? Tanya dalam Discussions — kami suka dengar maklum balas anda!
Bagaimana kualiti terjemahan pada halaman ini?

Bagaimana pakej ini berkaitan dengan ffsim

Important

Konsep dalam panduan ini hanya tersedia dalam Python API.

ffsim dan pakej ini berkongsi kerja dan bukannya bertindih, mengikut satu garis:

ffsim memilikiqiskit-fermions memiliki
Operator ansatz peringkat tinggi (UCJOpSpinBalanced, UCCSDOpRestrictedReal dan saudaranya), dibina daripada amplitud gugusan berganding atau vektor parameterLitar 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 padatRangka 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 2n2^n. 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):

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 2num_modes2^{\text{num\_modes}} 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 exp⁡(−itH)\exp(-i t H) bagi Hamiltonian HH dengan sebutan yang tidak memelihara zarah sebaliknya akan menukarkan pemetaan yang sepatutnya unitari menjadi pemetaan tidak unitari yang tidak bermakna dari segi fizikal.

  • Evolution memunculkan penolakan itu daripada operator yang dievolusikannya.

  • OrbitalRotation memeriksa bahawa matriks putaran (terbenam) bersifat pepenjuru blok merentasi pembahagian alfa/beta dalam kes berspin, dan menimbulkan ValueError jika 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. norb mod dilayan secara langsung sebagai orbital tanpa spin, dan nelec ialah jumlah bilangan zarah.

  • Pasangan (n_alpha, n_beta) memilih tafsiran berspin bagi 2 * norb mod di bawah konvensyen spin blok yang tetap. Mod 0 .. norb ialah orbital alfa (spin-atas) dan mod norb .. 2 * norb ialah 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​