Skip to main content
IBM Quantum Platform

개방 껍질과 폐쇄 껍질 옵션의 차이점 및 이것이 부분공간 구성에 미치는 영향을 이해한다

이 가이드에서는 자기일관적 구성 복원 기법을 사용하여 양자 샘플을 후처리하기 위해 패키지에서 qiskit_addon_sqd 부분공간 차원을 선택하는 방법을 설명합니다.

더 중요한 점은, 이 가이드에서는 모드나 open_shell = True 모드에서 open_shell = False 실행할 때 부분공간 구성 과정의 동작에 나타나는 몇 가지 차이점도 강조하고 있다는 것입니다:

  • open_shell = False 스핀업 전자와 스핀다운 전자의 수가 같을 때만 작동합니다.

  • open_shell = True 스핀업 전자와 스핀다운 전자의 수가 다를 때 반드시 사용해야 합니다. 또한 스핀업 전자와 스핀다운 전자의 수가 같을 때도 사용할 수 있습니다. open_shell = True그러나 후자의 경우, 이 가이드에서 설명한 바와 같이 와 사이에서 open_shell = False 생성되는 부분공간들의 크기에 차이가 있습니다.

참고: 이 패키지에서 수행되는 전자 구성(비트스트링) 조작 중 일부는 총 스핀 대칭성 S2S^2 을 보존하는 것을 목표로 합니다. 표준 선택 구성 상호작용(SCI) 솔버는 S2S^2 보존을 정확히 적용할 수 없습니다. 따라서 그들은 대략 라그랑주 승수를 통해 이를 수행한다.

고유상태 해석기에 입력되는 전자 배열의 선택 역시 스핀 보존에 큰 영향을 미칠 수 있다. 예를 들어, (2전자, 2궤도) 시스템에서, RHF 상태 0101|0101\rangle 에 비해 단일 스핀-업 여기 상태를 갖는 구성 1001|1001\rangle 을 샘플링할 수 있는데, 이는 각각 개방 껍질 싱글렛 상태 (1001±0110)/2(|1001\rangle ± |0110\rangle) /\sqrt{2} 와 트리플렛 상태의 선형 조합이다. 만약 |0110⟩ 구성이 샘플링되지 않는다면, 총 스핀의 고유함수를 구성할 수 없게 되어 스핀 오염이나 중복이 발생하게 된다(|1001⟩ 구성은 CI 계산에 포함되지만, CI 벡터에서 계수가 0이다). 양자 컴퓨터에서 단일 샘플 1001|1001\rangle 이 생성된 경우, 이 sqd 패키지는 다음과 같은 방식으로 해당 상황을 처리합니다:

  • open_shell = False:

    1. 10011001 비트열은 두 부분으로 나뉘며, 각각 스핀 업(spin-up) 및 스핀 다운(spin-down) 구성을 나타냅니다: 1010 (업) 및 0101 (다운).

    2. 고유한 스핀 편극 배열 목록은 다음과 같이 구성됩니다: U=[01,10]\mathcal{U} = [01, 10].

    3. 그런 다음, 기저를 형성하기 위해 U\mathcal{U} 원소들의 모든 가능한 조합을 고려합니다: {0101,0110,1001,1010}\left \{ |0101\rangle, |0110\rangle , |1001\rangle , |1010\rangle \right \}, 이는 싱글렛 상태와 트리플렛 상태를 포함합니다.

  • open_shell = True:

    1. 앞서 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개이며, 샘플링된 비트열은 00010010000100100100100001001000 이지만, 스핀 종류당 4개의 전자 배열이 생성된다는 점에 유의하십시오. 이 경우, 고유한 스핀 편극 배열의 집합은 다음과 같이 주어집니다:

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

base-10 의 십진수 표현은

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

부분공간 기저:

고유상태 해석기는 스핀-업 및 스핀-다운 비트열의 모든 가능한 쌍을 취하여 부분 공간의 기저 B\mathcal{B} 를 구성합니다:

  • 요소 1: 00010001|00010001\rangle

  • 요소 2: 00010010|00010010\rangle

  • 요소 3: 00010100|00010100\rangle

  • 요소 4: 00011000|00011000\rangle

  • 요소 5: 00100001|00100001\rangle

  • 요소 6: 00100010|00100010\rangle

  • 요소 7: 00100100|00100100\rangle

  • 요소 8: 00101000|00101000\rangle

  • 원소 9: 01000001|01000001\rangle

  • 요소 10: 01000010|01000010\rangle

  • 요소 11: 01000100|01000100\rangle

  • 원소 12: 01001000|01001000\rangle

  • 원소 13: 10000001|10000001\rangle

  • Element 14: 10000010|10000010\rangle

  • 원소 15: 10000100|10000100\rangle

  • 원소 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)
            + ">"
        )

Output:

Basis elements of the subspace:
|00010001>
|00010010>
|00010100>
|00011000>
|00100001>
|00100010>
|00100100>
|00101000>
|01000001>
|01000010>
|01000100>
|01001000>
|10000001>
|10000010>
|10000100>
|10001000>

이 부분공간 차원의 상한은 다음과 같다 : 22 \cdot (samples_per_batch) 2^2.

개방형 쉘

이 예제는 (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만약 를 지정한다면, 모든 고유한 반비트열을 스핀-업 및 스핀-다운 구성으로 포함하지 않게 되므로, 를 지정했을 때보다 더 작은 기저를 얻게 된다.

부분공간 기저:

고유상태 해석기는 스핀-업 및 스핀-다운 비트열의 모든 가능한 쌍을 취하여 부분 공간의 기저 B\mathcal{B} 를 구성합니다:

  • 요소 1: 00010010|00010010\rangle

  • 요소 2: 00011000|00011000\rangle

  • 요소 3: 01000010|01000010\rangle

  • 요소 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)
            + ">"
        )

Output:

Basis elements of the subspace:
|00100001>
|00100100>
|10000001>
|10000100>

이 부분공간 차원의 상한은 다음과 같다 : (samples_per_batch) 2^2.

이 페이지가 도움이 되었습니까?
GitHub에서 버그, 오타를 보고하거나 컨텐츠를 요청하십시오.