개방 껍질과 폐쇄 껍질 옵션의 차이점 및 이것이 부분공간 구성에 미치는 영향을 이해한다
이 가이드에서는 자기일관적 구성 복원 기법을 사용하여 양자 샘플을 후처리하기 위해 패키지에서 qiskit_addon_sqd 부분공간 차원을 선택하는 방법을 설명합니다.
더 중요한 점은, 이 가이드에서는 모드나 open_shell = True 모드에서 open_shell = False 실행할 때 부분공간 구성 과정의 동작에 나타나는 몇 가지 차이점도 강조하고 있다는 것입니다:
-
open_shell = False스핀업 전자와 스핀다운 전자의 수가 같을 때만 작동합니다. -
open_shell = True스핀업 전자와 스핀다운 전자의 수가 다를 때 반드시 사용해야 합니다. 또한 스핀업 전자와 스핀다운 전자의 수가 같을 때도 사용할 수 있습니다.open_shell = True그러나 후자의 경우, 이 가이드에서 설명한 바와 같이 와 사이에서open_shell = False생성되는 부분공간들의 크기에 차이가 있습니다.
참고: 이 패키지에서 수행되는 전자 구성(비트스트링) 조작 중 일부는 총 스핀 대칭성 을 보존하는 것을 목표로 합니다. 표준 선택 구성 상호작용(SCI) 솔버는 보존을 정확히 적용할 수 없습니다. 따라서 그들은 대략 라그랑주 승수를 통해 이를 수행한다.
고유상태 해석기에 입력되는 전자 배열의 선택 역시 스핀 보존에 큰 영향을 미칠 수 있다. 예를 들어, (2전자, 2궤도) 시스템에서, RHF 상태 에 비해 단일 스핀-업 여기 상태를 갖는 구성 을 샘플링할 수 있는데, 이는 각각 개방 껍질 싱글렛 상태 와 트리플렛 상태의 선형 조합이다. 만약 |0110⟩ 구성이 샘플링되지 않는다면, 총 스핀의 고유함수를 구성할 수 없게 되어 스핀 오염이나 중복이 발생하게 된다(|1001⟩ 구성은 CI 계산에 포함되지만, CI 벡터에서 계수가 0이다). 양자 컴퓨터에서 단일 샘플 이 생성된 경우, 이 sqd 패키지는 다음과 같은 방식으로 해당 상황을 처리합니다:
-
open_shell = False:-
비트열은 두 부분으로 나뉘며, 각각 스핀 업(spin-up) 및 스핀 다운(spin-down) 구성을 나타냅니다: (업) 및 (다운).
-
고유한 스핀 편극 배열 목록은 다음과 같이 구성됩니다: .
-
그런 다음, 기저를 형성하기 위해 원소들의 모든 가능한 조합을 고려합니다: , 이는 싱글렛 상태와 트리플렛 상태를 포함합니다.
-
-
open_shell = True:- 앞서
open_shell = False다룬 경우와 달리, 우리는 비트열의 양쪽 절반을 결합하여 기저를 형성하지 않습니다.
- 앞서
폐포
이 예제는 (2전자, 4궤도) 시스템에서 비트스트링이 어떻게 조작되는지를 보여줍니다.
# Specify molecule properties
num_orbitals = 4
num_elec_a = num_elec_b = 1
open_shell = False측정 결과 사전(dictionary)을 수동으로 지정하십시오:
counts_dict = {
"00010010": 1 / 2.0 - 0.01,
"01001000": 1 / 2.0 - 0.01,
"00010001": 0.02,
}후처리를 위해 카운트 dict 값을 비트스트링 행렬과 확률 배열로 변환합니다:
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)Output:
[[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]
크기가 2인 단일 배치에 대해 부분 표본 추출을 수행합니다:
n_batches = 1: 고유상태 솔버에 대한 서로 다른 호출에서 사용된 구성 배치의 수samples_per_batch = 2: 각 배치에 포함할 고유 구성의 수
from qiskit_addon_sqd.subsampling import postselect_and_subsample
n_batches = 1
samples_per_batch = 2
# seed for random number generator
rand_seed = 48
# Generate the batches
batches = postselect_and_subsample(
bitstring_matrix_full,
probs_arr_full,
hamming_right=num_elec_a,
hamming_left=num_elec_b,
samples_per_batch=samples_per_batch,
num_batches=n_batches,
rand_seed=rand_seed,
)
print(batches[0])Output:
[[False False False True False False True False]
[False True False False True False False False]]
고유상태 솔버에서 사용하는 스핀-업 및 스핀-다운 비트열의 십진수 표현을 구합니다.
튜플의 첫 번째 요소는 스핀-업 상태의 10진수 표현에 해당하고, 튜플의 두 번째 요소는 스핀-다운 상태의 10진수 표현에 해당합니다:
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)Output:
(array([1, 2, 4, 8], dtype=int64), array([1, 2, 4, 8], dtype=int64))
한 배치당 샘플 수는 2개이며, 샘플링된 비트열은 및 이지만, 스핀 종류당 4개의 전자 배열이 생성된다는 점에 유의하십시오. 이 경우, 고유한 스핀 편극 배열의 집합은 다음과 같이 주어집니다:
base-10 의 십진수 표현은
부분공간 기저:
고유상태 해석기는 스핀-업 및 스핀-다운 비트열의 모든 가능한 쌍을 취하여 부분 공간의 기저 를 구성합니다:
-
요소 1:
-
요소 2:
-
요소 3:
-
요소 4:
-
요소 5:
-
요소 6:
-
요소 7:
-
요소 8:
-
원소 9:
-
요소 10:
-
요소 11:
-
원소 12:
-
원소 13:
-
Element 14:
-
원소 15:
-
원소 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)
+ ">"
)Output:
Basis elements of the subspace:
|00010001>
|00010010>
|00010100>
|00011000>
|00100001>
|00100010>
|00100100>
|00101000>
|01000001>
|01000010>
|01000100>
|01001000>
|10000001>
|10000010>
|10000100>
|10001000>
이 부분공간 차원의 상한은 다음과 같다 : (samples_per_batch) .
개방형 쉘
이 예제는 (2전자, 4궤도) 시스템에서 비트스트링이 어떻게 조작되는지를 보여줍니다.
# Specify molecule properties
num_orbitals = 4
num_elec_a = num_elec_b = 1
open_shell = True측정 결과 사전(dictionary)을 수동으로 지정하십시오:
counts_dict = {
"00010010": 1 / 2.0 - 0.01,
"01001000": 1 / 2.0 - 0.01,
"00010001": 0.02,
}후처리를 위해 카운트 dict 값을 비트스트링 행렬과 확률 배열로 변환합니다:
# 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)Output:
[[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]
크기가 2인 단일 배치에 대해 부분 표본 추출을 수행합니다:
n_batches = 1: 고유상태 솔버에 대한 서로 다른 호출에서 사용된 구성 배치의 수samples_per_batch = 2: 각 배치에 포함할 고유 구성의 수
n_batches = 1
samples_per_batch = 2
# seed for random number generator
rand_seed = 48
# Generate the batches
batches = postselect_and_subsample(
bitstring_matrix_full,
probs_arr_full,
hamming_right=num_elec_a,
hamming_left=num_elec_b,
samples_per_batch=samples_per_batch,
num_batches=n_batches,
rand_seed=rand_seed,
)
print(batches[0])Output:
[[False False False True False False True False]
[False True False False True False False False]]
고유상태 솔버에서 사용하는 스핀-업 및 스핀-다운 비트열의 십진수 표현을 구합니다.
튜플의 첫 번째 요소는 스핀-업 상태의 10진수 표현에 해당하고, 튜플의 두 번째 요소는 스핀-다운 상태의 10진수 표현에 해당합니다:
ci_strs = bitstring_matrix_to_ci_strs(batches[0], open_shell=open_shell)
print(ci_strs)Output:
(array([2, 8], dtype=int64), array([1, 4], dtype=int64))
open_shell = False``open_shell = True만약 를 지정한다면, 모든 고유한 반비트열을 스핀-업 및 스핀-다운 구성으로 포함하지 않게 되므로, 를 지정했을 때보다 더 작은 기저를 얻게 된다.
부분공간 기저:
고유상태 해석기는 스핀-업 및 스핀-다운 비트열의 모든 가능한 쌍을 취하여 부분 공간의 기저 를 구성합니다:
-
요소 1:
-
요소 2:
-
요소 3:
-
요소 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)
+ ">"
)Output:
Basis elements of the subspace:
|00100001>
|00100100>
|10000001>
|10000100>
이 부분공간 차원의 상한은 다음과 같다 : (samples_per_batch) .