Kumpulkan sebutan operator: gunakan struktur operator
BosonOperator boleh menanda setiap sebutannya dengan indeks kumpulan. Tanda itu tidak membawa makna tersendiri: ia hanya menyatakan sebutan mana yang tergolong bersama. Apa yang dimaksudkan oleh tanda itu ditentukan oleh apa sahaja yang menggunakannya. Dalam pakej ini pengguna ialah gate evolusi masa, yang dibahagikan kepada satu faktor bagi setiap kumpulan, dan pas qDRIFT rawak, yang mensampel keseluruhan kumpulan.
Panduan ini menunjukkan cara menetapkan kumpulan, cara menyemak sifat yang diharapkan oleh pengguna, dan cara menyusun operator supaya memilih beberapa kumpulan daripada yang besar kekal murah.
Tiada strategi pengelompokan automatik disertakan dengan pakej ini. Anda menetapkan indeks sendiri, berdasarkan apa yang anda ketahui tentang model anda.
Tetapkan kumpulan
Contoh yang digunakan ialah rantai Bose-Hubbard tiga tapak. Setiap ikatan menyumbang pasangan lompatan, dan interaksi atas tapak membentuk bahagian pepenjuru. Cara paling mudah untuk membina operator berkumpulan ialah from_terms_with_groups(), yang menerima setiap sebutan bersama indeks kumpulannya sebagai tiga serangkai (actions, coefficient, group). Anda menentukan kumpulan pada saat anda menulis sebutan itu, ketika anda masih tahu mengapa ia tergolong di situ:
>>> from qiskit_bosons.operators import BosonOperator, ann, cre
>>>
>>> bonds = [(0, 1), (1, 2)]
>>> terms = []
>>> for group, (left, right) in enumerate(bonds): # one group per bond
... terms.append(([cre(left), ann(right)], -1.0, group))
... terms.append(([cre(right), ann(left)], -1.0, group))
>>> for site in range(3): # the on-site interactions share one group
... terms.append(([cre(site), cre(site), ann(site), ann(site)], 1.0, len(bonds)))
>>> hamiltonian = BosonOperator.from_terms_with_groups(terms)
>>> len(hamiltonian), hamiltonian.num_groups()
(7, 3)
Sebutan disimpan mengikut tertib yang anda berikan, jadi indeks kumpulan tidak mungkin tersilap dilekatkan pada sebutan yang salah.
Operator yang sudah wujud perlu dikumpulkan selepas itu, dengan menetapkan atribut groups. Di situlah perlu berhati-hati, kerana from_dict() tidak menentukan tertib penyimpanan sebutannya. Menulis senarai mengikut kedudukan kemudian boleh melekatkan indeks pada sebutan yang salah. Sebaliknya, terbitkan setiap indeks daripada sebutan itu sendiri:
>>> existing = BosonOperator.from_dict({tuple(actions): coeff for actions, coeff, _ in terms})
>>> existing.groups = [
... len(bonds)
... if len({mode for _, mode in term}) == 1
... else bonds.index(tuple(sorted({mode for _, mode in term})))
... for term, _ in existing.iter_terms()
... ]
>>> existing.num_groups(), existing.equiv(hamiltonian)
(3, True)
Bilangan indeks mesti sepadan dengan bilangan sebutan. Selain itu ditolak, kerana senarai yang terlalu pendek akan menggugurkan sebutan di hujung secara senyap di mana sahaja sebutan diulang bersama kumpulannya:
>>> try:
... hamiltonian.groups = [0, 1]
... except ValueError as error:
... print(error)
expected one group index per term, but got 2 for 7 terms
Semak apa yang diharapkan oleh pengguna
Tiga fungsi dalam qiskit_bosons.operators.terms masing-masing menjawab satu soalan sempit tentang pengelompokan sedia ada. Tiada satu pun menyatakan pengelompokan itu “betul”, kerana kebetulan bergantung pada pengguna.
Adakah setiap kumpulan Hermitian? Ini ialah sifat yang paling penting. Evolusi masa bagi satu kumpulan hanya uniter jika kumpulan itu Hermitian, dan sebutan lompatan tunggal bukan Hermitian. Hanya pasangan dengan adjointnya yang Hermitian:
>>> from qiskit_bosons.operators.terms import groups_are_hermitian
>>> groups_are_hermitian(hamiltonian)
[True, True, True]
Pengelompokan yang memecahkan pasangan lompatan dikesan serta-merta:
>>> split = BosonOperator.from_terms_with_groups(
... [(actions, coeff, index) for index, (actions, coeff, _) in enumerate(terms)]
... ) # one term per group
>>> [bool(flag) for flag in groups_are_hermitian(split)]
[False, False, False, False, True, True, True]
Keempat-empat sebutan lompatan (hopping) berjaya dikesan. Tiga entri True ialah sebutan pada-tapak , yang Hermitian dengan sendirinya. Sesuatu mod boleh berulang secara sah dalam satu sebutan, dan tiada apa yang digugurkan kerana itu. Bendera mengikut susunan terms, itulah sebabnya setiap satu boleh dibaca berdasarkan sebutan yang diterangkannya.
Adakah pekalinya seragam? Formula hasil darab rawak menimbang sesuatu kumpulan mengikut purata magnitud pekalinya, yang merupakan huraian setia bagi kumpulan itu hanya jika magnitudnya sepadan:
>>> from qiskit_bosons.operators.terms import group_coeff_means, groups_have_uniform_coeffs
>>> groups_have_uniform_coeffs(hamiltonian)
[True, True, True]
>>> group_coeff_means(hamiltonian)
[1.0, 1.0, 1.0]
Tiada satu pun semakan membawa kepada yang lain: pekali seragam tidak menjadikan sesuatu kumpulan Hermitian, dan kumpulan Hermitian boleh mencampurkan magnitud. Secara lalai magnitud dibandingkan, kerana itulah yang dipuratakan oleh group_coeff_means(). Sepasang Hermitian dengan pekali kompleks mempunyai magnitud yang sama tetapi pekali yang tidak sama, jadi ia hanya memenuhi bentuk lalai:
>>> conjugate = BosonOperator.from_terms_with_groups(
... [([cre(0), ann(1)], 1.0j, 0), ([cre(1), ann(0)], -1.0j, 0)]
... )
>>> groups_have_uniform_coeffs(conjugate)
[True]
>>> groups_have_uniform_coeffs(conjugate, abs=False)
[False]
groups_are_hermitian() dibina di atas is_hermitian(), yang membandingkan sesuatu pengendali dengan adjointnya selepas penyusunan normal. Itu ialah identiti bagi aljabar tanpa pemangkasan, jadi kumpulan yang lulus adalah Hermitian sebagai pengendali boson. Lihat Prinsip reka bentuk perwakilan pengendali untuk mengetahui bagaimana hasil darab pengendali tangga disusun dan dibandingkan.
Susun sebutan mengikut kumpulan
split_out_groups() mengembalikan satu pengendali bagi setiap kumpulan yang diminta. Apabila sebutan sesuatu kumpulan bertaburan di seluruh pengendali, ia perlu mengimbas setiap sebutan untuk mencarinya. Apabila setiap kumpulan membentuk satu larian bersebelahan, ia mencari sempadan kumpulan secara carian binari, jadi kos setiap carian mengikut bilangan kumpulan yang diminta dan bukannya bilangan sebutan yang disimpan.
group_order() menghasilkan susun atur itu. Ia ialah isihan stabil mengikut indeks kumpulan: nilai pengendali tidak berubah, dan sebutan dalam satu kumpulan mengekalkan susunan relatifnya.
>>> from qiskit_bosons.operators.terms import group_order
>>> scattered = BosonOperator.from_terms_with_groups(
... [(actions, coeff, group) for (actions, coeff, _), group in zip(terms, [1, 0, 1, 0, 2, 2, 2])]
... )
>>> ordered = group_order(scattered)
>>> ordered.groups
[0, 0, 1, 1, 2, 2, 2]
>>> ordered.equiv(scattered)
True
Kedua-dua susun atur mengembalikan pengendali yang sama; hanya kosnya berbeza:
>>> request = [2, 0]
>>> all(
... a.equiv(b)
... for a, b in zip(
... scattered.split_out_groups(request), ordered.split_out_groups(request), strict=True
... )
... )
True
Langkah seterusnya
Pengumpulan dipilih di sini, pada peringkat boson, ketika struktur model masih kelihatan.
-
Sintesis Gate Evolution dalam ruang boson menunjukkan cara menggunakannya untuk melakukan Trotter pada evolusi, dan sebab ia mengurangkan ralat yang tidak dapat dikurangkan oleh formula hasil darab pada peringkat qubit.
-
Prinsip reka bentuk perwakilan pengendali menerangkan struktur data pengendali yang membawa indeks kumpulan, dan cara sebutannya disimpan dan disusun.
-
2. Kumpulkan sebelum pemetaan menerapkan pengumpulan pada model yang lengkap.