Jana litar SqDRIFT
Dengan pepenjuruan kuantum berasaskan sampel (SQD), anda mesti memilih ansatz untuk mensampel rentetan bit. Varian SqDRIFT sebaliknya menggunakan ensembel litar evolusi masa yang dibina terus daripada Hamiltonian sasaran. Ini dicapai dengan mensubsampel operator evolusi masa yang lebih kecil daripada Hamiltonian berdasarkan pekalinya, yang dikenali sebagai kaedah Trotterisasi qDRIFT.
Panduan permulaan ini menunjukkan cara menjana ensembel litar rawak sedemikian.
1. Penyediaan Hamiltonian
Untuk tujuan panduan ini, muatkan Hamiltonian struktur elektronik bagi N2 daripada fail FCIDUMP. Terdapat cara lain untuk membina FermionOperator. Pastikan anda merujuk dokumentasinya, serta qiskit_fermions.operators.library.
- PYTHON
- C
>>> from qiskit_fermions.operators.library import FCIDump
>>> from qiskit_fermions.operators import FermionOperator
>>>
>>> fcidump = FCIDump.from_file("docs/guides/n2.fcidump")
>>> num_modes = 2 * fcidump.norb
>>> hamil = FermionOperator.from_fcidump(fcidump)
#include <qiskit_fermions.h>
QfFCIDump* fcidump = NULL;
qf_fcidump_from_file("docs/guides/n2.fcidump", &fcidump);
QfFermionOperator* hamil = qf_ferm_op_from_fcidump(fcidump);
uint32_t num_modes = 2 * qf_fcidump_norb(fcidump);
2. Kumpulkan sebutan Hamiltonian
Manfaatkan banyak simetri yang terdapat dalam Hamiltonian struktur elektronik dengan mengumpulkan sebutan berkaitan yang mempunyai pekali yang sama. Tindakan ini mengubah taburan pekali operator yang disampel oleh protokol qDRIFT, tetapi tidak menjejaskan jaminan penumpuannya. Yang penting, mengumpulkan sebutan yang berkaitan melalui simetri menghasilkan pembatalan sebutan Pauli yang menguntungkan, sehingga kedalaman litar keseluruhan lebih pendek apabila menjalankan evolusi masa suatu keadaan di bawah tindakannya.
Modul qiskit_fermions.operators.terms.grouping menyediakan fungsi kemudahan untuk mengumpulkan sebutan sesuatu operator. Ini diterangkan dengan lebih terperinci dalam panduan ini.
Pelaksanaan group_terms_by_electronic_structure() mengandaikan sebutan Hamiltonian tersusun normal!
- PYTHON
- C
>>> from qiskit_fermions.operators.terms.grouping import group_terms_by_electronic_structure
>>> from qiskit_fermions.operators.terms.ordering import canonical_order
>>>
>>> canon = canonical_order(hamil.normal_ordered().simplify(atol=1e-16))
>>> exit_code = group_terms_by_electronic_structure(canon, num_modes, two_body_physicist_order=False)
>>> assert exit_code is None
>>> print(canon.groups) # the groups attribute now contains some list of group indices
[0, ...]
QfFermionOperator* normal = qf_ferm_op_normal_ordered(hamil, NULL);
QfFermionOperator* simplified = qf_ferm_op_simplify(normal, 1e-16);
QfFermionOperator* canon = qf_ferm_op_canonical_order(simplified);
QfExitCode exit = qf_ferm_op_group_terms_by_electronic_structure(canon, num_modes, false);
assert(exit == QfExitCode_Success);
qf_ferm_op_free(normal);
qf_ferm_op_free(simplified);
Hamiltonian struktur elektronik penuh mengandungi sebutan tertentu yang kemasukannya dalam litar evolusi masa tidak memberi kesan kepada rentetan bit yang dilihat dan, oleh itu, hanya menyebabkan overhed persampelan meningkat. Oleh itu, disyorkan agar sebutan sedemikian ditapis daripada Hamiltonian pada ketika ini, sebelum membina get Evolution dalam langkah seterusnya.
Sebutan yang sesuai dengan huraian ini ialah sebutan yang pepenjuru dalam asas nombor penghunian, iaitu hasil darab operator nombor (). Ini termasuk ofset tenaga malar, yang evolusi masanya hanya memperkenalkan fasa global ke dalam litar, operator nombor individu yang evolusi masanya bersamaan dengan putaran Z qubit tunggal, serta hasil darab peringkat lebih tinggi seperti . Tiada satu pun daripadanya boleh mengubah penghunian sesuatu mod, jadi menggugurkannya tidak menyebabkan kehilangan kandungan pengujaan. Tidak seperti penolakan setiap cabutan dalam langkah 5, penapisan ini berlaku sekali sahaja, pada Hamiltonian itu sendiri, jadi taburan pekali yang disampel oleh protokol dibina semula secara konsisten daripada operator yang telah ditapis dan bukannya dinormalkan semula pada pertengahan cabutan.
Fungsi filter_diagonal_terms() membuang sebutan sedemikian daripada operator di tempat:
- PYTHON
- C
>>> from qiskit_fermions.operators.terms.filtering import filter_diagonal_terms
>>>
>>> filter_diagonal_terms(canon)
qf_ferm_op_filter_diagonal_terms(canon);
Menapis di sini, sekali sahaja, jauh lebih murah daripada menapis berulang kali. FermionicQDrift dijalankan sekali bagi setiap litar yang ditranspile, jadi menapis Hamiltonian pada awalnya, dan bukannya pada setiap panggilan, mengelakkan kerja diulang bagi setiap litar yang dijana daripadanya.
Atas sebab yang sama, adalah berbaloi untuk menyusun sebutan Hamiltonian mengikut indeks kumpulan di sini. Indeks kumpulan ialah tag bagi setiap sebutan yang tidak menyatakan apa-apa tentang kedudukan sebutan tersebut, jadi sebutan sesuatu kumpulan secara amnya bertaburan di seluruh operator: pengumpulan yang digunakan di atas memberikan indeks mengikut urutan pertemuan pertama, yang menyebabkan sebutan kedua sesuatu kumpulan jauh daripada sebutan pertamanya.
FermionicQDrift mensampel keseluruhan kumpulan dan mencari setiap kumpulan yang dicabut dengan split_out_groups(). Mencari sesuatu kumpulan dalam kalangan sebutan yang bertaburan bermakna mengimbas kesemuanya, jadi carian itu berkos sama sama ada satu kumpulan atau empat puluh kumpulan dicabut. group_order() mengumpulkan setiap kumpulan ke dalam satu larian bersebelahan, selepas itu carian ialah carian binari merentasi sempadan kumpulan dan berkos setara dengan kumpulan yang dicabut dan bukannya sebutan yang dipegang. Carian itu sendiri menjadi jauh lebih murah; jumlah penjimatan bagi sesuatu transpilasi bergantung pada apa lagi yang dilakukan oleh saluran paip, kerana pemetaan dan sintesis mendominasi sebaik sahaja imbasan tiada:
- PYTHON
- C
>>> from qiskit_fermions.operators.terms.ordering import group_order
>>>
>>> canon = group_order(canon)
>>> print(canon.groups[:4])
[0, 0, ...]
QfFermionOperator* grouped = qf_ferm_op_group_order(canon);
Ini menyusun semula sebutan tanpa mengubah nilai operator, dan hanya perlu dilakukan sekali tanpa mengira berapa banyak pengrawakan litar yang dicabut daripadanya.
3. Sediakan litar evolusi masa
Sediakan litar evolusi masa Hamiltonian dan litar asas untuk mencabut sampel. qiskit_fermions.circuit.library mengandungi semua komponen yang diperlukan untuk berbuat demikian, selaras dengan konvensyen Qiskit.
Protokol qDRIFT ialah kaedah sintesis FermionicQDrift, dan get Evolution membawanya sebagai synthesisnya. Kaedah ini memperkenalkan beberapa parameter yang boleh anda gunakan untuk menyesuaikan litar yang dijana:
-
Panjang setiap litar dari segi kumpulan pengujaan:
num_groups -
Secara pilihan, benih untuk penjana nombor rawak:
rng -
Secara pilihan, pemberat persampelan yang dikira lebih awal, jika transpilasi itu sendiri menjadi kesesakan:
weights(lihat (Pilihan) Kira lebih awal pemberat persampelan di bawah)
Oleh sebab kaedah dipegang oleh get, apa-apa yang menghuraikan operator get, seperti pemberat tersebut, terletak bersebelahan dengan operator itu.
- PYTHON
- C
>>> from qiskit_fermions.circuit import FermionicCircuit
>>> from qiskit_fermions.circuit.library import Evolution
>>> from qiskit_fermions.circuit.library.synthesis import FermionicQDrift
>>>
>>> time = 1.0 # you can choose a desired scaling factor here
>>> num_groups = 10
>>> qdrift = FermionicQDrift(num_groups, rng=19)
>>> evo_gate = Evolution(num_modes, canon, time, synthesis=qdrift)
>>>
>>> circ = FermionicCircuit(num_modes)
>>> circ.append(evo_gate, circ.modes)
// WARNING: Qiskit's C API does not yet allow us to implement circuits
// with custom gate definitions.
Contoh ini tidak memulakan mod fermionik dengan zarah, dan juga tidak mengukur keadaan akhirnya.
4. Transpile litar
Modul qiskit_fermions.transpiler disepadukan secara langsung dengan saluran paip transpilasi Qiskit, membolehkan FermionicCircuit yang dibina di atas ditranspile terus kepada QuantumCircuit.
Gunakan pemetaan fermion-ke-qubit jordan_wigner() untuk menukarkan Hamiltonian yang dinyatakan dalam fermion supaya dinyatakan dalam rentetan Pauli. Ini boleh dilakukan terus sebagai sebahagian daripada proses transpilasi dengan menggunakan laluan transpilasi F2QSynthesis. Gunakan generate_preset_jw_pass_manager() untuk membina FermionicStagedPassManager, yang memastikan pengekodan Jordan-Wigner digunakan secara konsisten bagi semua arahan litar.
Yang penting, tambahkan laluan Decompose Qiskit pada peringkat optimization saluran paip transpilasi. Ia memecahkan get Evolution dengan kaedah sintesis yang dibawa oleh get, iaitu kaedah qDRIFT yang disediakan di atas. Ini memastikan litar tidak menggunakan evolusi masa bagi keseluruhan Hamiltonian, yang kedalamannya akan melebihi keupayaan perkakasan pengkomputeran kuantum yang tersedia pada masa ini.
Sebaliknya, ia mensubsampel bilangan tetap groups sebutan Hamiltonian bagi setiap litar, setiap kali litar ditranspile. Melalui ini, anda boleh menjana pelbagai pengrawakan litar seperti yang diperlukan oleh algoritma SqDRIFT dengan menjalankan saluran paip transpilasi berulang kali. Bilangan litar yang hendak dijana ialah num_sqdrift_randomizations.
- PYTHON
- C
>>> from qiskit.transpiler.passes import Decompose
>>> from qiskit_fermions.transpiler import FermionicPassManager
>>> from qiskit_fermions.transpiler.presets import generate_preset_jw_pass_manager
>>>
>>> pm = generate_preset_jw_pass_manager()
>>> pm.optimization = FermionicPassManager([Decompose(["Evolution"])])
>>>
>>> num_sqdrift_randomizations = 10
>>> sqdrift_circuits = [
... pm.run(circ) for _ in range(num_sqdrift_randomizations)
... ]
// WARNING: Qiskit's C API does not yet allow us to implement circuits
// with custom gate definitions, which we therefore also cannot transpile
// via this API.
Contoh sebelum ini menetapkan benih rng bagi kaedah sintesis FermionicQDrift, supaya jujukan pengrawakan boleh dihasilkan semula.
Saluran paip yang sama menerima kaedah qDRIFT di dua tempat lain. Laluan F2FSynthesis mengambil satu kaedah bagi setiap get Evolution mengikut nama, F2FSynthesis({"Evolution": FermionicQDrift(num_groups)}), yang itulah sahaja yang diperlukan apabila tiada get memegang apa-apa yang khusus kepada operatornya. Langkah seterusnya menggunakan yang ketiga, laluan QDriftTrotterization.
5. Tapis pengujaan yang dicabut mengikut penghunian
Selain sebutan pepenjuru yang ditapis dalam langkah sebelumnya, pengujaan yang dicabut boleh bertindak sepenuhnya dalam set mod yang penghuniannya sudah tetap (semua dihuni atau semua tidak dihuni), di mana ia tidak dapat memindahkan zarah dari satu sisi ke sisi yang lain. Pengujaan sedemikian tidak memberitahu anda apa-apa tentang rentetan bit yang disampel, jadi slot yang digunakan untuknya adalah slot yang terbazir. Laluan QDriftTrotterization, yang membungkus kaedah FermionicQDrift yang sama, menolak pengujaan sedemikian semasa ia dicabut dan mencabut pengganti, supaya setiap satu daripada num_groups slot litar yang terhasil membawa pengujaan yang menghubungkan kedua-dua sisi.
Penapisan ini tidak percuma, dan atas sebab itulah ia merupakan laluan yang berasingan. Apa yang dipeliharanya ialah bajet num_groups slot yang disampel, bukan kedalaman litar: oleh sebab bajet itu tetap, pengujaan yang ditolak digantikan dan bukannya digugurkan, dan pengujaan yang murah memberi laluan kepada pengujaan penghubung yang lebih mahal untuk disintesis. Jangkakan litar yang ditapis lebih dalam daripada litar yang tidak ditapis yang dicabut daripada benih yang sama.
Menormalkan semula cabutan ke atas pengujaan yang diterima mengubah taburan yang disampel oleh protokol qDRIFT, dan tidak seperti pengumpulan dalam langkah 2, ia juga memecahkan jaminan penumpuan protokol: hasil darab yang disampel tidak lagi purata kepada evolusi di bawah Hamiltonian yang anda berikan. Setiap pengujaan yang dikekalkan akhirnya diberi pemberat secara salingan kebarangkalian penerimaan, yang ditolak tidak menyumbang apa-apa, dan tiada jumlah magnitud pekali mahupun masa evolusi bagi setiap get dilaraskan sebagai pampasan.
Peraturan penerimaan juga merupakan penganggaran berlebihan. Ia hanya membandingkan sokongan mod, jadi ia tidak membawa maklumat amplitud, dan set yang dijejaki hanya terus membesar: pengujaan yang terkurung dalam set dihuni memang lengai pada keadaan hasil darab, tetapi penaakulan yang sama menjadi lebih lemah untuk cabutan kemudian, setelah pengujaan yang diterima lebih awal menjadikan keadaan terjerat dan menandakan kebanyakan mod sebagai “tidak pasti”.
Gunakan penapisan ini untuk aliran kerja persampelan rentetan bit yang diterangkan oleh panduan ini, di mana litar menyuap pasca-pemprosesan SQD dan hanya rentetan bit yang disampel penting. Jangan gunakannya jika anda berhasrat menganggar nilai jangkaan daripada litar ini, atau bergantung pada had ralat qDRIFT dalam apa-apa cara lain: keputusan tersebut membawa pincang yang tidak dibetulkan oleh laluan ini.
Penapisan ini perlu mengetahui mod mana yang pada mulanya dihuni. Oleh itu ia memerlukan get InitializeModes mendahului get Evolution dalam litar; InitializeModes.from_hartree_fock() ialah cara mudah untuk membinanya. Tambahkan satu di sini bagi rujukan Hartree-Fock N2 (tujuh elektron alfa dan tujuh elektron beta dalam 14 orbital ruang) dan bandingkan pengujaan yang disampel dengan dan tanpa penapisan:
- PYTHON
- C
>>> from qiskit_fermions.circuit.library import InitializeModes
>>> from qiskit_fermions.transpiler.passes import F2FSynthesis, QDriftTrotterization
>>>
>>> init = InitializeModes.from_hartree_fock(fcidump.norb, (7, 7))
>>>
>>> hf_circ = FermionicCircuit(num_modes)
>>> hf_circ.append(init, hf_circ.modes)
>>> hf_circ.append(Evolution(num_modes, canon, time), hf_circ.modes)
>>>
>>> num_groups = 5
>>> qdrift_unfiltered = F2FSynthesis(
... {"Evolution": FermionicQDrift(num_groups, rng=3480)}
... )
>>> qdrift_trivial = QDriftTrotterization(
... FermionicQDrift(num_groups, rng=3480)
... )
>>>
>>> for instruction in FermionicPassManager(qdrift_unfiltered).run(hf_circ)._inner.data:
... if instruction.operation.name == "Evolution":
... print(sorted(instruction.operation.operator.get_support()))
[2, 4]
[41, 45, 52]
[15, 45, 55]
[41, 52, 53]
[10, 16, 37, 38]
>>>
>>> for instruction in FermionicPassManager(qdrift_trivial).run(hf_circ)._inner.data:
... if instruction.operation.name == "Evolution":
... print(sorted(instruction.operation.operator.get_support()))
[0, 1, 6, 7]
[0, 1, 28, 29]
[4, 13, 55]
[13, 20, 40, 41]
[0, 1, 28, 29]
// WARNING: Qiskit's C API does not yet allow us to implement circuits
// with custom gate definitions, which we therefore also cannot transpile
// via this API.
Tiada satu pun pengujaan yang dicabut tanpa penapisan menyentuh set dihuni (0-6 dan 28-34) sama sekali, jadi tiada satu pun daripadanya boleh memindahkan zarah antara mod dihuni dan mod tidak dihuni. Dengan penapisan, kesemua lima ditolak dan digantikan oleh pengujaan yang menghubungkan mod dihuni dengan mod tidak dihuni. Sebagai contoh, pengujaan pertama yang diterima [0, 1, 6, 7] memindahkan zarah antara mod dihuni 0, 1, dan 6 dan mod tidak dihuni 7.
Setelah pengujaan diterima, setiap mod dalam sokongannya menjadi “tidak pasti” dan, oleh itu, layak memainkan kedua-dua peranan untuk sampel kemudian, jadi set mod dihuni dan tidak dihuni terus membesar apabila lebih banyak pengujaan diterima. Inilah yang menjadikan pengujaan kedua, [0, 1, 28, 29], boleh diterima. Keempat-empat modnya termasuk dalam kalangan mod yang pada asalnya dihuni, jadi ia tidak berpasangan dengan mana-mana mod yang pada asalnya tidak dihuni. Ia hanya diterima kerana mod 0 dan 1 menjadi tidak pasti (dan dengan itu layak sebagai sisi “tidak dihuni” bagi gandingan) sebaik sahaja pengujaan pertama menyentuhnya.
Pertumbuhan ini menjadikan peraturan itu suatu penganggaran berlebihan dan bukannya ujian: apabila lebih banyak mod menjadi tidak pasti, semakin sedikit cabutan yang ditolak, dan penapisan memberi kesan paling besar kepada taburan persampelan pada cabutan terawal.
Untuk menilai sejauh mana penapisan menggerakkan taburan, baca kiraan penolakan yang direkodkan oleh laluan dalam metadata litar. Satu entri disimpan bagi setiap get Evolution yang ditapis, dan nisbah diterima-kepada-jumlah menganggar kebarangkalian penerimaan, iaitu faktor yang menyebabkan pengujaan yang dikekalkan diberi pemberat berlebihan:
- PYTHON
- C
>>> # a freshly seeded pass, so the counts do not depend on earlier draws
>>> qdrift_counted = QDriftTrotterization(
... FermionicQDrift(num_groups, rng=3480)
... )
>>> filtered = FermionicPassManager(qdrift_counted).run(hf_circ)
>>> discarded = filtered.metadata.get("filter_trivial.discarded")
>>> emitted = filtered.metadata.get("filter_trivial.emitted")
>>> print(f"{emitted[0]} kept, {discarded[0]} discarded")
5 kept, 7 discarded
>>> print(f"acceptance probability: {emitted[0] / (emitted[0] + discarded[0]):.2f}")
acceptance probability: 0.42
// WARNING: Qiskit's C API does not yet allow us to implement circuits
// with custom gate definitions, which we therefore also cannot transpile
// via this API.
Penapisan memerlukan maklumat penghunian untuk ditapis. Get PrepareSlaterDeterminant menyemainya sama seperti InitializeModes, dan mana-mana OrbitalRotation menandakan setiap mod yang dikenakannya sebagai “tidak pasti”. Tanpa mana-mana daripadanya, atau apabila mod yang disemai semuanya berada di satu sisi (setiap mod dihuni, atau setiap mod tidak dihuni), laluan ini mengeluarkan UserWarning dan membiarkan persampelan tidak ditapis bagi get Evolution tersebut. Pada Hamiltonian yang sebutan bakinya tidak lagi dapat menghubungkan kedua-dua set yang dijejaki, laluan ini sebaliknya menimbulkan RuntimeError selepas QDriftTrotterization.MAX_SAMPLE_RETRIES penolakan berturut-turut.
(Pilihan) Kira lebih awal pemberat persampelan
Gunakan ini hanya jika transpilasi itu sendiri menjadi kesesakan. Ia tidak mengubah apa-apa tentang litar yang anda peroleh.
FermionicQDrift mencabut setiap kumpulan dengan kebarangkalian berkadar dengan magnitud pekalinya, dan memperoleh magnitud tersebut daripada Hamiltonian pada setiap panggilan: satu nilai bagi setiap sebutan Hamiltonian, dikurangkan kepada satu bagi setiap kumpulan. Oleh sebab kaedah ini tidak mempunyai keadaan, ia mengulangi pengurangan itu bagi setiap pengrawakan, walaupun hasilnya sama setiap kali. Argumen weights membolehkan anda mengira sekali sahaja dengan group_coeff_means() dan menyerahkan hasilnya, memindahkan kos keluar daripada gelung sambil membiarkan kaedah bebas daripada sebarang keadaan tercache yang bergantung pada Hamiltonian.
Ini ialah pasangan kepada penyusunan sebutan dalam langkah 2. Yang itu mengangkat carian kumpulan keluar daripada gelung, yang ini pengurangan pemberat, dan masing-masing hanya ketara selagi yang lain tiada, jadi berbaloi menggunakan kedua-duanya bersama. Oleh sebab canon telah disusun semula di atas, kedua-duanya digabungkan secara terus.
Pemberat menghuraikan kumpulan bagi satu operator tertentu, jadi ia tergolong dengan get Evolution bagi operator itu: bina kaedah untuk get tersebut dan serahkan sebagai synthesis get, sama seperti dalam langkah 3.
- PYTHON
- C
>>> from qiskit_fermions.operators.terms.grouping import group_coeff_means
>>>
>>> weights = group_coeff_means(canon) # `canon` is group-ordered, from step 2
>>> qdrift_weighted = FermionicQDrift(10, rng=19, weights=weights)
>>> weighted_gate = Evolution(num_modes, canon, time, synthesis=qdrift_weighted)
>>>
>>> weighted_circ = FermionicCircuit(num_modes)
>>> weighted_circ.append(weighted_gate, weighted_circ.modes)
>>>
>>> weighted_circuits = [
... pm.run(weighted_circ) for _ in range(num_sqdrift_randomizations)
... ]
>>> len(weighted_circuits)
10
// WARNING: Qiskit's C API does not yet allow us to implement circuits
// with custom gate definitions, which we therefore also cannot transpile
// via this API.
Oleh sebab ini betul-betul pemberat yang akan dikira oleh laluan, litarnya sama seperti sebelum ini; hanya pengurangan berulang yang telah tiada.
Satu entri dijangka bagi setiap kumpulan, bukan setiap sebutan, apabila operator membawa kumpulan, kerana operator berkumpulan disampel secara kumpulan demi kumpulan. Entri mestilah tidak negatif: pemberat ialah magnitud, kerana protokol qDRIFT menguraikan dengan positif, dan tanda pekali tergolong dalam , di mana laluan membacanya terus daripada operator.
Pemberat ialah magnitud mutlak, bukan keutamaan relatif. Jumlahnya juga menetapkan masa evolusi, jadi mendarabkan setiap entri dengan mensampel dengan cara yang sama tetapi berevolusi selama dan bukannya . Memberikan apa-apa selain magnitud pekali Hamiltonian itu sendiri oleh itu mengubah evolusi yang dianggarkan oleh ensembel, dan itulah sebabnya ini merupakan alat prestasi dan bukan cara untuk melaraskan persampelan.
Oleh sebab pemberat tergolong dengan get yang operatornya mereka huraikan, litar boleh mengandungi beberapa get Evolution, masing-masing dengan pemberat operatornya sendiri. Laluan QDriftTrotterization dalam langkah 5 menghormatinya dengan cara yang sama: ia mencabut get dengan FermionicQDrift yang dibawa oleh get, dan kembali kepada yang digunakan semasa pembinaannya bagi get yang tidak membawa apa-apa. Jenis kaedah sintesis lain pada get bukanlah suatu pernyataan tentang qDRIFT, jadi laluan mengabaikannya. Memberikan kaedah kepada laluan mengikut nama get sebaliknya, seperti dalam F2FSynthesis({"Evolution": ...}), mengenakan satu kaedah kepada setiap get Evolution, jadi pemberat yang diberikan di sana hanya bermakna bagi litar yang mempunyai satu sahaja. Panjang pemberat disemak terhadap setiap get yang dikenakannya.
(Pilihan) Optimumkan pengindeksan mod fermionik
Anda boleh menambah langkah pengoptimuman tambahan pada saluran paip transpilasi yang meminimumkan jarak span pengujaan fermionik dengan melabel semula indeks mod fermionik. Pengoptimuman ini diperkenalkan dalam makalah SqDRIFT dan dilaksanakan oleh build_excitation_span_minimization_model(). Ia boleh dimasukkan dengan mudah ke dalam saluran paip transpiler dengan menggunakan laluan RelabelModes:
- PYTHON
- C
>>> from pyomo.environ import SolverFactory
>>> from qiskit_fermions.transpiler.passes import RelabelModes
>>>
>>> solver = SolverFactory("appsi_highs")
>>> solver.options["time_limit"] = 10
>>>
>>> qdrift = F2FSynthesis({"Evolution": FermionicQDrift(5, rng=19)})
>>> relabel = RelabelModes(solver=solver)
>>>
>>> pm.optimization = FermionicPassManager([qdrift, relabel])
>>>
>>> relabeled_circ = pm.run(circ)
>>> # if the automatic mode relabeling was successful, the circuit's
>>> # metadata will contain the mode `permutation` information
// WARNING: This feature is not available via the C API.
Menggunakan pengoptimuman automatik di dalam RelabelModes (yang memanfaatkan build_excitation_span_minimization_model()) memerlukan kebergantungan pilihan yang diuruskan oleh HAS_PYOMO.
Pelabelan semula mengubah mod yang dibawa oleh sesuatu qubit, jadi pepenjuruan subruang hanya memperoleh rentetan bit yang betul jika perkara itu diambil kira. Di mana pengambilkiraan itu berlaku bergantung pada tempat anda mengukur.
Tambahkan pengukuran pada FermionicCircuit dengan FermionicCircuit.measure_all() sebelum transpilasi, dan tiada apa-apa yang perlu dilakukan: setiap pengukuran menamakan mod yang dibacanya, jadi pelabelan semula membawanya bersama dan rentetan bit yang disampel diindeks mengikut mod asal.
Jika anda mengukur QuantumCircuit yang telah ditranspile sebaliknya, rentetan bit mesti dipasca-proses menggunakan permutation yang direkodkan dalam metadata litar. Lihat dokumentasi RelabelModes untuk resipinya.
Langkah seterusnya
Setelah anda berjaya menjana ensembel litar, anda boleh mensampel rentetan bit daripadanya. Untuk berbuat demikian, litar mesti dilaksanakan pada perkakasan. Rujuk dokumentasi Qiskit untuk arahan terperinci.
Setelah sampel rentetan bit diperoleh, ia boleh digunakan bersama pekali Hamiltonian untuk melakukan pasca-pemprosesan SQD, seperti yang diterangkan dalam tutorial addon SQD.