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?

Bekerja dengan litar boson

BosonicCircuit menyatakan pengiraan terus pada mod boson. Ia tidak membawa pemotongan, pengekodan, mahupun bilangan qubit: itu masuk kemudian, semasa transpilation, itulah cara satu litar boleh diturunkan di bawah beberapa pengekodan dan beberapa pemotongan tanpa dibina semula.

Ia sengaja mendedahkan API yang dikurangkan berbanding QuantumCircuit Qiskit, supaya gate qubit tidak dapat dikenakan pada mod boson, yang bukan operasi yang ditakrifkan dengan baik. Panduan ini merangkumi operasi yang didedahkan untuk menghimpun litar yang lebih besar daripada yang lebih kecil.

Mengapa menggunakan litar boson​

Pertimbangkan aliran kerja tradisional untuk meletakkan evolusi masa Hamiltonian boson pada seni bina berasaskan qubit:

  1. Takrifkan Hamiltonian boson, contohnya H=−∑ijbi†bjH = -\sum_{ij} b^\dagger_i b_j.

  2. Pilih pemotongan dan pengekodan, dan petakan Hamiltonian kepada operator qubit dengannya.

  3. Laksanakan evolusi masa dalam ruang qubit, dengan Trotterisasi atau kaedah lain.

Langkah kedua datang awal, dan ia membuat dua keputusan yang mahal untuk ditarik balik. Pemotongan menetapkan berapa banyak aras yang dikekalkan setiap mod, dan pengekodan menetapkan berapa banyak qubit yang diperlukan, jadi kedua-duanya ditetapkan dalam operator qubit sebelum apa-apa lagi dilakukan pada litar. Untuk melihat fizik yang sama di bawah potongan atau pengekodan lain, anda memetakan Hamiltonian sekali lagi dan membina litar sekali lagi. Apa yang dibuang oleh pemetaan juga ialah struktur boson: sebutan mana yang tergolong bersama, dan bahawa sebutan bagi pasangan lompatan ialah adjoint antara satu sama lain.

BosonicCircuit memindahkan keputusan itu ke penghujung:

  1. Takrifkan Hamiltonian boson.

  2. Nyatakan evolusi masa terus pada mod boson, dengan gate boson.

  3. Pilih pemotongan dan pengekodan sebagai sebahagian daripada transpilation.

Litar itu menerangkan apa pengiraan yang hendak dilakukan, dan transpilation menentukan bagaimana meletakkannya pada qubit. Litar yang sama kemudian diturunkan pada setiap potongan dan di bawah setiap pengekodan, dan pengelompokan operator masih ada untuk pas yang boleh menggunakannya. Bahagian seterusnya menunjukkan cara litar sedemikian dihimpun; Transpile litar boson menunjukkannya diturunkan.

Pengindeksan mod generik​

Modul operators dan litar berkongsi satu konvensyen untuk mod. Mod hanyalah indeks yang melabelkan darjah kebebasan boson, dan ia tidak membawa makna tersendiri. Oleh itu anda boleh mengembangkan sebarang operator yang melaksanakan protokol OperatorTrait, apa sahaja yang diwakilinya, dan litar tidak perlu tahu apa yang diwakili oleh mod 2. Perkara yang sama berlaku untuk saiz mod: litar tidak mempunyai potongan penghunian, jadi tiada apa-apa di sini menyatakan berapa banyak aras yang dimiliki mod.

Tambah gate​

Gate ditambah pada mod. Hanya instance BosonicGate diterima:

>>> from qiskit_bosons.circuit import BosonicCircuit
>>> from qiskit_bosons.circuit.library import Evolution, InitializeModes
>>> from qiskit_bosons.operators import BosonOperator, ann, cre
>>>
>>> hopping = BosonOperator.from_dict({(cre(0), ann(1)): -1.0, (cre(1), ann(0)): -1.0})
>>> hopping.groups = [0] * len(hopping) # the pair is Hermitian, its terms alone are not
>>>
>>> prepare = BosonicCircuit(2)
>>> prepare.append(InitializeModes([2, 0]), prepare.modes)
>>> step = BosonicCircuit(2)
>>> step.append(Evolution(2, hopping, time=0.1), step.modes)

Selain itu ditolak, dan ralat menamakan jenis yang bermasalah:

>>> from qiskit.circuit.library import HGate
>>> try:
... prepare.append(HGate(), [0])
... except ValueError as error:
... print(error)
Unsupported instruction type: <class '...HGate'>

Gubah litar​

compose() meletakkan arahan satu litar pada litar lain. Ia diinlinekan, tidak dibungkus menjadi satu gate, jadi hasilnya ialah litar biasa yang boleh terus anda uraikan dan transpile.

>>> program = prepare.compose(step)
>>> program.draw("mpl", fold=-1)
<Figure size ... with 1 Axes>

A composed BosonicCircuit.

Secara lalai litar baharu dikembalikan dan kedua-dua operan dibiarkan. Hantar inplace=True untuk mengubah suai yang pertama sebaliknya, dan front=True untuk meletakkan operan sebelum arahan sedia ada:

>>> step.compose(prepare, front=True)._inner.data == program._inner.data
True

Litar yang lebih sempit boleh diletakkan pada subset mod yang dipilih:

>>> single = BosonicCircuit(1)
>>> single.append(Evolution(1, BosonOperator.from_dict({(cre(0), ann(0)): 1.0}), 0.1), single.modes)
>>> wide = BosonicCircuit(3).compose(single, [2])
>>> wide.draw("mpl", fold=-1)
<Figure size ... with 1 Axes>

A narrow-composed BosonicCircuit.

Hanya BosonicCircuit lain diterima sebagai operan, kerana compose Qiskit sendiri akan menginlinekan gate qubit dan memintas semakan yang dikuatkuasakan oleh append.

Ulang litar​

repeat() mengulang litar hujung ke hujung. Ulangan diratakan: hasilnya mengandungi arahan sebanyak reps kali secara berjujukan dan bukannya satu gate yang membungkus litar. Oleh itu, kiraan operasi berskala dengan reps, dan decompose bertindak pada badan yang diulang dan bukannya membuang satu ulangan.

>>> len(step.repeat(0)._inner.data) # zero repetitions is the identity
0
>>> step.repeat(5).draw("mpl", fold=-1)
<Figure size ... with 1 Axes>

A repeated BosonicCircuit.

Ini ialah cara peringkat litar untuk Trotterisasi: berevolusi untuk masa yang singkat, dan ulang. Lihat Sintesis gate Evolution dalam ruang boson untuk alternatif memilih formula hasil darab pada gate itu sendiri, dan mengapa keduanya hal yang berbeza yang kebetulan berkongsi perkataan “ulangan”.

Pisahkan langkah dengan penghalang​

Penghalang menandakan titik penyegerakan yang merentasinya pas pengoptimuman tidak menggabungkan gate. barrier() meletakkan satu pada semua mod, atau pada mod yang anda namakan:

>>> program = BosonicCircuit(2)
>>> program.append(InitializeModes([2, 0]), program.modes)
>>> program.barrier()
>>> program.barrier(program.modes[0], label="zero")
>>> program.draw("mpl", fold=-1)
<Figure size ... with 1 Axes>

A BosonicCircuit with barriers.

repeat(..., insert_barriers=True) meletakkan satu antara ulangan berturutan, dan tiada selepas yang terakhir:

>>> step.repeat(3, insert_barriers=True).draw("mpl", fold=-1)
<Figure size ... with 1 Axes>

A repeated BosonicCircuit with barriers.

Penghalang dan pengekodan​

Pengekodan memerlukan beberapa qubit bagi setiap mod, jadi daftar mod dan daftar qubit berbeza saiz, dan susun atur mengaitkan keseluruhan daftar. Oleh itu mod tidak mempunyai qubit tersendiri untuk mengecilkan penghalang. Semasa sintesis boson-ke-qubit, penghalang dipetakan kepada setiap qubit bagi setiap daftar yang disentuhnya, yang betul di bawah sebarang susun atur:

>>> from qiskit_bosons.mappers import LevelSpec
>>> from qiskit_bosons.transpiler.presets import generate_preset_occupation_pass_manager
>>> lowered = generate_preset_occupation_pass_manager(LevelSpec(2, "unary_projected")).run(program)
>>> lowered.draw("mpl", fold=-1)
<Figure size ... with 1 Axes>

A QuantumCircuit showing the expansion of barrier to cover the entire qubit register.

Baca keluar litar boson​

BosonicCircuit tidak mempunyai measure atau measure_all. Maksud bit yang diukur bergantung pada pengekodan. Di bawah pengekodan unari, penghunian mod tersebar pada beberapa qubit dan perlu dibaca daripada corak bit, dan di bawah pengekodan padat ia ialah nombor perduaan, jadi pengukuran yang menamakan mod perlu mengetahui pengekodan, yang sengaja tidak diketahui oleh litar boson. Sebaliknya, ukur QuantumCircuit yang telah ditranspile, dan nyahkod rentetan bit dengan LevelEncoding.level_to_bits() dan ofset LevelSpec yang anda gunakan untuk menurunkan. Simulasikan dinamik Bose-Hubbard dengan pilihan pengekodan melakukan ini untuk model lengkap.

>>> hasattr(BosonicCircuit, "measure_all")
False

Langkah seterusnya​