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?

Fahami pilihan lapisan terbuka berbanding lapisan tertutup dan kesannya terhadap pembinaan subruang

Dalam panduan ini, kami akan menunjukkan cara memilih dimensi subruang dalam pakej qiskit_addon_sqd untuk memproses pasca sampel kuantum menggunakan teknik pemulihan konfigurasi konsisten-kendiri.

Lebih penting lagi, panduan ini juga menonjolkan beberapa perbezaan dalam tingkah laku pembinaan subruang apabila dijalankan dalam mod open_shell = False atau open_shell = True:

  • open_shell = False hanya berfungsi apabila bilangan elektron spin-atas dan spin-bawah adalah sama.

  • open_shell = True mesti digunakan apabila bilangan elektron spin-atas dan spin-bawah berbeza. Ia juga boleh digunakan apabila bilangan elektron spin-atas dan spin-bawah adalah sama. Namun, dalam kes terakhir ini, terdapat perbezaan saiz subruang yang dijana antara open_shell = False dan open_shell = True, seperti yang dibincangkan dalam panduan ini.

NOTA: Sebahagian manipulasi konfigurasi elektronik (rentetan bit) dalam pakej ini bertujuan memelihara simetri spin keseluruhan S2S^2. Penyelesai Interaksi Konfigurasi Terpilih (SCI) piawai tidak dapat mengenakan keabadian S2S^2 dengan tepat. Akibatnya, mereka melakukannya secara hampiran melalui pendarab Lagrange.

Pilihan konfigurasi elektronik yang memasuki penyelesai keadaan eigen juga boleh memberi kesan yang kuat terhadap keabadian spin. Sebagai contoh, dalam sistem (2-elektron, 2-orbital), seseorang boleh mensampel konfigurasi ∣1001⟩|1001\rangle (yang mempunyai satu pengujaan spin-atas ke atas keadaan RHF ∣0101⟩|0101\rangle), iaitu gabungan linear keadaan singlet dan triplet lapisan terbuka, masing-masing (∣1001⟩±∣0110⟩)/2(|1001\rangle ± |0110\rangle) /\sqrt{2}. Jika konfigurasi |0110⟩ tidak disampel, seseorang tidak dapat membina mana-mana fungsi eigen spin keseluruhan, yang membawa kepada pencemaran spin atau lewahan (konfigurasi |1001⟩ terlibat dalam pengiraan CI, tetapi mempunyai pekali 0 dalam vektor CI). Memandangkan satu sampel ∣1001⟩|1001\rangle dijana dalam komputer kuantum, beginilah pakej sqd mengendalikan situasi ini:

  • open_shell = False:

    1. Rentetan bit 10011001 dibahagi dua, mewakili konfigurasi spin-atas dan spin-bawah: 1010 (atas) dan 0101 (bawah).

    2. Senarai konfigurasi berkutub spin yang unik dibina: U=[01,10]\mathcal{U} = [01, 10].

    3. Kemudian kami mempertimbangkan semua kombinasi yang mungkin bagi unsur U\mathcal{U} untuk membentuk asas: {∣0101⟩,∣0110⟩,∣1001⟩,∣1010⟩}\left \{ |0101\rangle, |0110\rangle , |1001\rangle , |1010\rangle \right \}, yang mengandungi keadaan singlet dan triplet.

  • open_shell = True:

    1. Bertentangan dengan kes open_shell = False, kami tidak menggabungkan separuh rentetan bit untuk membentuk asas.

Lapisan tertutup​

Contoh ini menunjukkan cara rentetan bit dimanipulasi dalam sistem (2-elektron, 4-orbital).

# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util

_needed = {"qiskit_addon_sqd": "qiskit-addon-sqd"}
_missing = [pip for module, pip in _needed.items()
if importlib.util.find_spec(module) is None]
# One at a time, so a package that fails to install does not block the others
for _pip in _missing:
%pip install -q {_pip}
if not _missing:
print("\u2713 All required packages are installed")
# Specify molecule properties
num_orbitals = 4
num_elec_a = num_elec_b = 1
open_shell = False

Nyatakan secara manual kamus hasil pengukuran:

counts_dict = {
"00010010": 1 / 2.0 - 0.01,
"01001000": 1 / 2.0 - 0.01,
"00010001": 0.02,
}

Ubah dict kiraan kepada matriks rentetan bit dan tatasusunan kebarangkalian untuk pasca-pemprosesan:

from qiskit_addon_sqd.counts import counts_to_arrays

# Convert counts into bitstring and probability arrays
bitstring_matrix_full, probs_arr_full = counts_to_arrays(counts_dict)
print(bitstring_matrix_full)
print(probs_arr_full)
[[False False False True False False True False]
[False True False False True False False False]
[False False False True False False False True]]
[0.49 0.49 0.02]

Subsampel satu kelompok bersaiz dua:

  • n_batches = 1: Bilangan kelompok konfigurasi yang digunakan oleh panggilan berbeza kepada penyelesai keadaan eigen

  • samples_per_batch = 2: Bilangan konfigurasi unik yang disertakan dalam setiap kelompok

from qiskit_addon_sqd.subsampling import (
postselect_by_hamming_right_and_left,
subsample,
)

n_batches = 1
samples_per_batch = 2

# seed for random number generator
rand_seed = 48

# Post-select the configurations with the correct Hamming weight on each half
bitstring_matrix_postsel, probs_arr_postsel = (
postselect_by_hamming_right_and_left(
bitstring_matrix_full,
probs_arr_full,
hamming_right=num_elec_a,
hamming_left=num_elec_b,
)
)

# Generate the batches
batches = subsample(
bitstring_matrix_postsel,
probs_arr_postsel,
samples_per_batch,
n_batches,
rand_seed=rand_seed,
)

print(batches[0])
[[False False False True False False True False]
[False True False False True False False False]]

Dapatkan perwakilan perpuluhan bagi rentetan bit spin-atas dan spin-bawah yang digunakan oleh penyelesai keadaan eigen.

Unsur pertama dalam tupel sepadan dengan perwakilan perpuluhan bagi konfigurasi spin-atas, manakala unsur kedua dalam tupel sepadan dengan perwakilan perpuluhan bagi konfigurasi spin-bawah:

from qiskit_addon_sqd.fermion import bitstring_matrix_to_ci_strs

ci_strs = bitstring_matrix_to_ci_strs(batches[0], open_shell=open_shell)
print(ci_strs)
(array([1, 2, 4, 8], dtype=int64), array([1, 2, 4, 8], dtype=int64))

Perhatikan bahawa walaupun bilangan sampel setiap kelompok ialah dua, dan rentetan bit yang disampel ialah: 0001001000010010 dan 0100100001001000, empat konfigurasi elektronik dijana bagi setiap spesies spin. Dalam kes ini, set konfigurasi berkutub spin yang unik diberikan oleh:

U={0001,0010,0100,1000}\mathcal{U} = \{ 0001, 0010, 0100, 1000 \}

yang perwakilan perpuluhan asas-10nya ialah

U10={1,2,4,8}\mathcal{U}_{10} = \{ 1, 2, 4, 8 \}

Asas subruang:

Penyelesai keadaan eigen mengambil semua pasangan yang mungkin bagi rentetan bit spin-atas dan spin-bawah untuk membina asas B\mathcal{B} bagi subruang:

  • Elemen 1: ∣00010001⟩|00010001\rangle

  • Elemen 2: ∣00010010⟩|00010010\rangle

  • Elemen 3: ∣00010100⟩|00010100\rangle

  • Elemen 4: ∣00011000⟩|00011000\rangle

  • Elemen 5: ∣00100001⟩|00100001\rangle

  • Elemen 6: ∣00100010⟩|00100010\rangle

  • Elemen 7: ∣00100100⟩|00100100\rangle

  • Elemen 8: ∣00101000⟩|00101000\rangle

  • Elemen 9: ∣01000001⟩|01000001\rangle

  • Elemen 10: ∣01000010⟩|01000010\rangle

  • Elemen 11: ∣01000100⟩|01000100\rangle

  • Elemen 12: ∣01001000⟩|01001000\rangle

  • Elemen 13: ∣10000001⟩|10000001\rangle

  • Elemen 14: ∣10000010⟩|10000010\rangle

  • Elemen 15: ∣10000100⟩|10000100\rangle

  • Elemen 16: ∣10001000⟩|10001000\rangle

ci_strs_up, ci_strs_dn = ci_strs

print("Basis elements of the subspace:")

for ci_str_up in ci_strs_up:
for ci_str_dn in ci_strs_dn:
format_name = "{0:0" + str(num_orbitals) + "b}"
print(
"|"
+ format_name.format(ci_str_up)
+ format_name.format(ci_str_dn)
+ ">"
)
Basis elements of the subspace:
|00010001>
|00010010>
|00010100>
|00011000>
|00100001>
|00100010>
|00100100>
|00101000>
|01000001>
|01000010>
|01000100>
|01001000>
|10000001>
|10000010>
|10000100>
|10001000>

Dimensi subruang dibatasi atas oleh: 2⋅2 \cdot (samples_per_batch)2^2.

Lapisan terbuka​

Contoh ini menunjukkan cara rentetan bit dimanipulasi dalam sistem (2-elektron, 4-orbital).

# Specify molecule properties
num_orbitals = 4
num_elec_a = num_elec_b = 1
open_shell = True

Nyatakan secara manual kamus hasil pengukuran:

counts_dict = {
"00010010": 1 / 2.0 - 0.01,
"01001000": 1 / 2.0 - 0.01,
"00010001": 0.02,
}

Ubah dict kiraan kepada matriks rentetan bit dan tatasusunan kebarangkalian untuk pasca-pemprosesan:

# Convert counts into bitstring and probability arrays
bitstring_matrix_full, probs_arr_full = counts_to_arrays(counts_dict)
print(bitstring_matrix_full)
print(probs_arr_full)
[[False False False True False False True False]
[False True False False True False False False]
[False False False True False False False True]]
[0.49 0.49 0.02]

Subsampel satu kelompok bersaiz dua:

  • n_batches = 1: Bilangan kelompok konfigurasi yang digunakan oleh panggilan berbeza kepada penyelesai keadaan eigen

  • samples_per_batch = 2: Bilangan konfigurasi unik yang disertakan dalam setiap kelompok

n_batches = 1
samples_per_batch = 2

# seed for random number generator
rand_seed = 48

# Post-select the configurations with the correct Hamming weight on each half
bitstring_matrix_postsel, probs_arr_postsel = (
postselect_by_hamming_right_and_left(
bitstring_matrix_full,
probs_arr_full,
hamming_right=num_elec_a,
hamming_left=num_elec_b,
)
)

# Generate the batches
batches = subsample(
bitstring_matrix_postsel,
probs_arr_postsel,
samples_per_batch,
n_batches,
rand_seed=rand_seed,
)

print(batches[0])
[[False False False True False False True False]
[False True False False True False False False]]

Dapatkan perwakilan perpuluhan bagi rentetan bit spin-atas dan spin-bawah yang digunakan oleh penyelesai keadaan eigen.

Unsur pertama dalam tupel sepadan dengan perwakilan perpuluhan bagi konfigurasi spin-atas, manakala unsur kedua dalam tupel sepadan dengan perwakilan perpuluhan bagi konfigurasi spin-bawah:

ci_strs = bitstring_matrix_to_ci_strs(batches[0], open_shell=open_shell)
print(ci_strs)
(array([2, 8], dtype=int64), array([1, 4], dtype=int64))

Jika kami menetapkan open_shell = True, kami tidak menyertakan semua separuh rentetan bit yang unik sebagai konfigurasi spin-atas dan spin-bawah, lalu menghasilkan asas yang lebih kecil berbanding apabila menetapkan open_shell = False. Asas subruang:

Penyelesai keadaan eigen mengambil semua pasangan yang mungkin bagi rentetan bit spin-atas dan spin-bawah untuk membina asas B\mathcal{B} bagi subruang:

  • Elemen 1: ∣00010010⟩|00010010\rangle

  • Elemen 2: ∣00011000⟩|00011000\rangle

  • Elemen 3: ∣01000010⟩|01000010\rangle

  • Elemen 4: ∣01001000⟩|01001000\rangle

ci_strs_up, ci_strs_dn = ci_strs

print("Basis elements of the subspace:")

for ci_str_up in ci_strs_up:
for ci_str_dn in ci_strs_dn:
format_name = "{0:0" + str(num_orbitals) + "b}"
print(
"|"
+ format_name.format(ci_str_up)
+ format_name.format(ci_str_dn)
+ ">"
)
Basis elements of the subspace:
|00100001>
|00100100>
|10000001>
|10000100>

Dimensi subruang dibatasi atas oleh: (samples_per_batch)2^2.