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 = Falsehanya berfungsi apabila bilangan elektron spin-atas dan spin-bawah adalah sama. -
open_shell = Truemesti 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 antaraopen_shell = Falsedanopen_shell = True, seperti yang dibincangkan dalam panduan ini.
NOTA: Sebahagian manipulasi konfigurasi elektronik (rentetan bit) dalam pakej ini bertujuan memelihara simetri spin keseluruhan . Penyelesai Interaksi Konfigurasi Terpilih (SCI) piawai tidak dapat mengenakan keabadian 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 (yang mempunyai satu pengujaan spin-atas ke atas keadaan RHF ), iaitu gabungan linear keadaan singlet dan triplet lapisan terbuka, masing-masing . 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 dijana dalam komputer kuantum, beginilah pakej sqd mengendalikan situasi ini:
-
open_shell = False:-
Rentetan bit dibahagi dua, mewakili konfigurasi spin-atas dan spin-bawah: (atas) dan (bawah).
-
Senarai konfigurasi berkutub spin yang unik dibina: .
-
Kemudian kami mempertimbangkan semua kombinasi yang mungkin bagi unsur untuk membentuk asas: , yang mengandungi keadaan singlet dan triplet.
-
-
open_shell = True:- Bertentangan dengan kes
open_shell = False, kami tidak menggabungkan separuh rentetan bit untuk membentuk asas.
- Bertentangan dengan kes
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: dan , empat konfigurasi elektronik dijana bagi setiap spesies spin. Dalam kes ini, set konfigurasi berkutub spin yang unik diberikan oleh:
yang perwakilan perpuluhan asas-10nya ialah
Asas subruang:
Penyelesai keadaan eigen mengambil semua pasangan yang mungkin bagi rentetan bit spin-atas dan spin-bawah untuk membina asas bagi subruang:
-
Elemen 1:
-
Elemen 2:
-
Elemen 3:
-
Elemen 4:
-
Elemen 5:
-
Elemen 6:
-
Elemen 7:
-
Elemen 8:
-
Elemen 9:
-
Elemen 10:
-
Elemen 11:
-
Elemen 12:
-
Elemen 13:
-
Elemen 14:
-
Elemen 15:
-
Elemen 16:
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: (samples_per_batch).
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 bagi subruang:
-
Elemen 1:
-
Elemen 2:
-
Elemen 3:
-
Elemen 4:
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).