Parameter의 Builder 구문 활용

15352 단어 IBMQQISKITPULSE

개시하다


Builder 문법은 Parameter 등급과 함께 위력을 발휘하는 문법이다.이 기사에서 나는 파라메터반의 Builder 문장을 사용하는 작법을 소개하고 싶다.
먼저 Qiskit Pulse를 이동하기 위해 필요한 기술을 요약합니다.
import numpy as np
from qiskit import QuantumCircuit, transpile, Aer, IBMQ
from qiskit.visualization import *
from qiskit.circuit import Gate
from qiskit.circuit import Parameter
from qiskit import pulse

IBMQ.load_account()

provider = IBMQ.get_provider(hub='ibm-q', group='open', project='main')
backend = provider.get_backend('ibmq_armonk')
backend_defaults = backend.defaults()
backend_config = backend.configuration()

Parameter 클래스의 Builder 구문 사용


Parameter 클래스는 변수 매개변수에 사용되는 클래스입니다.
이것만 있으면 잘 모르겠어요. 그래서 제가 원본 코드를 쓸게요.
Qiskit Textbook의 주파수 교정 소스 코드를 예로 들어 소개하고 싶습니다.
import numpy as np

GHz = 1.0e9 # Gigahertz
MHz = 1.0e6 # Megahertz

# サンプル数は16の倍数である必要があります
def get_closest_multiple_of_16(num):
    return int(num + 8 ) - (int(num + 8 ) % 16)

qubit=0
mem_slot=0

# 1 周波数領域の決定
center_frequency_Hz = backend_defaults.qubit_freq_est[qubit] 
frequency_span_Hz = 40 * MHz
frequency_step_Hz = 1 * MHz
frequency_min = center_frequency_Hz - frequency_span_Hz / 2
frequency_max = center_frequency_Hz + frequency_span_Hz / 2
frequencies_GHz = np.arange(frequency_min / GHz, 
                            frequency_max / GHz, 
                            frequency_step_Hz / GHz)

# 2 パルスに必要な値の設定
drive_sigma_sec = 0.075e-6
drive_duration_sec = drive_sigma_sec * 8
drive_amp = 0.05

# 3 Parameterクラスの定義
freq = Parameter('freq')
# 4 Builder構文
with pulse.build(backend=backend, default_alignment='sequential') as parametrized_sched:
    # 5 Parameterクラスで定義した変数を周波数に設定
    pulse.set_frequency(freq, pulse.drive_channel(qubit))
    pulse.play(pulse.Gaussian(duration=get_closest_multiple_of_16(pulse.seconds_to_samples(drive_duration_sec)),
                              amp=drive_amp,
                              sigma=pulse.seconds_to_samples(drive_sigma_sec),
                              name='spect_pulse'), pulse.drive_channel(qubit))
    pulse.measure(qubits=[qubit], registers=[pulse.MemorySlot(mem_slot)])

# 6 周波数領域とParameterクラスを使って定義したScheduleをバインド
frequencies_Hz = frequencies_GHz*GHz
schedules = [parametrized_sched.assign_parameters({freq: f}, inplace=False) for f in frequencies_Hz]

schedules[0].draw(backend=backend)
  • 주파수의 확정
    sweep할 주파수를 설정합니다.여기backend_defaults에서 중심 주파수의 값을 얻었다.
  • 펄스 설정에 필요한 값
    펄스에 필요한 값을 설정합니다.
  • Parameter 클래스의 정의
    Parameter 클래스를 정의합니다.여기에 변수값freq을 클래스에 넘깁니다.
  • Builder 구문
    Builder 구문을 사용하여 Schedule을 작성합니다.
  • Parameter 클래스에 정의된 변수를 빈도로 설정합니다.
    를 사용하여 Schedule에서 사용되는 빈도를 정의합니다.여기서는 실제 값을 정의하는 것이 아니라 Parameter 클래스를 정의합니다.
  • 주파수 및 Parameter 클래스 정의를 사용하는 Schedule 바인딩
    실제 주파수 값을 Schedule과 연관시킨 것은 이번이 처음입니다.
  • 이번 사례 외에도 파라메터 클래스는 진폭 등을 변수로 바꿔 sweep을 할 수도 있고, 여러 파라메터 클래스를 사용할 수도 있다.
    freq = Parameter('freq')
    amp = Parameter('amp')
    with pulse.build(backend=backend, default_alignment='sequential') as parametrized_sched2:
        pulse.set_frequency(freq, pulse.drive_channel(qubit))
        pulse.play(pulse.Gaussian(duration=get_closest_multiple_of_16(pulse.seconds_to_samples(drive_duration_sec)),
                                  amp=amp,
                                  sigma=pulse.seconds_to_samples(drive_sigma_sec),
                                  name='spect_pulse'), pulse.drive_channel(qubit))
        pulse.measure(qubits=[qubit], registers=[pulse.MemorySlot(mem_slot)])
    
    편리한 점을 말씀드리자면, 여기 정의된 Schedule은 비슷한 실험에서 사용할 수 있습니다.예를 들어 낮은 에너지와 높은 에너지로 웨이브를 스캔하려면 아래와 같이 위의 Schedule "parametrized sched2"를 다시 이용할 수 있다.
    # 周波数領域と振幅(low power)をParameterクラスを使って定義したScheduleとバインド
    frequencies_Hz = frequencies_GHz*GHz
    schedules = [parametrized_sched2.assign_parameters({freq: f, amp: 0.1}, inplace=False) for f in frequencies_Hz]
    
    # 周波数領域と振幅(high power)をParameterクラスを使って定義したScheduleとバインド
    frequencies_Hz = frequencies_GHz*GHz
    schedules = [parametrized_sched2.assign_parameters({freq: f, amp: 1.0}, inplace=False) for f in frequencies_Hz]
    

    총결산


    이 글은 파라메터를 활용한 Builder 문법을 소개한다.Parameter 클래스를 사용하면 Schedule을 for문에 넣어 원본 코드를 명확하게 할 수 있습니다.또한 변수는 제어 프로세스(Schedule)와 별도로 정의할 수 있기 때문에 Schedule을 사용하여 순환하고 재사용성이 높아진다.

    좋은 웹페이지 즐겨찾기